Skip to content

Commit

Permalink
feat(main): Tabs (#11)
Browse files Browse the repository at this point in the history
* feat(main): Tabs

* [automated commit] lint format and import sort

---------

Co-authored-by: github-actions <github-actions@github.com>
  • Loading branch information
2 people authored and thelukewalton committed Apr 12, 2024
1 parent cbf46d9 commit 31bc20a
Show file tree
Hide file tree
Showing 7 changed files with 191 additions and 0 deletions.
2 changes: 2 additions & 0 deletions example/lib/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import 'package:zeta_example/pages/components/navigation_bar_example.dart';
import 'package:zeta_example/pages/components/radio_example.dart';
import 'package:zeta_example/pages/components/switch_example.dart';
import 'package:zeta_example/pages/components/snackbar_example.dart';
import 'package:zeta_example/pages/components/tabs_example.dart';
import 'package:zeta_example/pages/theme/color_example.dart';
import 'package:zeta_example/pages/components/password_input_example.dart';
import 'package:zeta_example/pages/components/progress_example.dart';
Expand Down Expand Up @@ -49,6 +50,7 @@ final List<Component> components = [
Component(DropdownExample.name, (context) => const DropdownExample()),
Component(ProgressExample.name, (context) => const ProgressExample()),
Component(SnackBarExample.name, (context) => const SnackBarExample()),
Component(TabsExample.name, (context) => const TabsExample()),
Component(DialPadExample.name, (context) => const DialPadExample()),
Component(RadioButtonExample.name, (context) => const RadioButtonExample()),
Component(SwitchExample.name, (context) => const SwitchExample()),
Expand Down
70 changes: 70 additions & 0 deletions example/lib/pages/components/tabs_example.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'package:zeta_example/widgets.dart';
import 'package:zeta_flutter/zeta_flutter.dart';

class TabsExample extends StatefulWidget {
const TabsExample({super.key});

static const String name = 'Tabs';

@override
State<TabsExample> createState() => _TabsExampleState();
}

class _TabsExampleState extends State<TabsExample> {
@override
Widget build(BuildContext context) {
return ExampleScaffold(
name: TabsExample.name,
child: Column(
children: [
DefaultTabController(
length: 2,
child: ZetaTabBar(
context: context,
tabs: [
ZetaTab(icon: Icon(ZetaIcons.star_round), text: "Tab Item"),
ZetaTab(icon: Icon(ZetaIcons.star_round), text: "Tab Item"),
],
),
),
Padding(
padding: const EdgeInsets.only(top: ZetaSpacing.l),
child: DefaultTabController(
length: 5,
child: ZetaTabBar(
context: context,
isScrollable: true,
tabs: [
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
],
),
),
),
Padding(
padding: const EdgeInsets.only(top: ZetaSpacing.l),
child: DefaultTabController(
length: 5,
child: ZetaTabBar(
context: context,
isScrollable: true,
enabled: false,
tabs: [
ZetaTab(icon: Icon(ZetaIcons.star_sharp), text: "Tab Item"),
ZetaTab(icon: Icon(ZetaIcons.star_sharp), text: "Tab Item"),
ZetaTab(icon: Icon(ZetaIcons.star_sharp), text: "Tab Item"),
ZetaTab(icon: Icon(ZetaIcons.star_sharp), text: "Tab Item"),
ZetaTab(icon: Icon(ZetaIcons.star_sharp), text: "Tab Item"),
],
),
),
),
],
),
);
}
}
2 changes: 2 additions & 0 deletions example/widgetbook/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import 'pages/components/progress_widgetbook.dart';
import 'pages/components/radio_widgetbook.dart';
import 'pages/components/switch_widgetbook.dart';
import 'pages/components/snack_bar_widgetbook.dart';
import 'pages/components/tabs_widgetbook.dart';
import 'pages/theme/color_widgetbook.dart';
import 'pages/theme/radius_widgetbook.dart';
import 'pages/theme/spacing_widgetbook.dart';
Expand Down Expand Up @@ -97,6 +98,7 @@ class HotReload extends StatelessWidget {
name: 'Snack Bar',
builder: (context) => snackBarUseCase(context),
),
WidgetbookUseCase(name: 'Tabs', builder: (context) => tabsUseCase(context)),
]..sort((a, b) => a.name.compareTo(b.name)),
),
WidgetbookCategory(
Expand Down
51 changes: 51 additions & 0 deletions example/widgetbook/pages/components/tabs_widgetbook.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:widgetbook/widgetbook.dart';
import 'package:zeta_flutter/zeta_flutter.dart';

import '../../test/test_components.dart';

Widget tabsUseCase(BuildContext context) {
return WidgetbookTestWidget(
widget: SingleChildScrollView(
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(top: ZetaSpacing.l),
child: DefaultTabController(
length: 2,
child: ZetaTabBar(
context: context,
enabled: context.knobs.boolean(
label: "Enabled",
initialValue: true,
),
tabs: [
ZetaTab(icon: Icon(ZetaIcons.star_round), text: "Tab Item"),
ZetaTab(icon: Icon(ZetaIcons.star_round), text: "Tab Item"),
],
),
),
),
Padding(
padding: const EdgeInsets.only(top: ZetaSpacing.l),
child: DefaultTabController(
length: 5,
child: ZetaTabBar(
context: context,
enabled: context.knobs.boolean(label: "Enabled"),
isScrollable: true,
tabs: [
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
ZetaTab(text: "Tab Item"),
],
),
),
),
],
),
),
);
}
29 changes: 29 additions & 0 deletions lib/src/components/tabs/tab.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import '../../../zeta_flutter.dart';

/// Defines how the bounds of the selected tab indicator are computed. Intended to be used with [ZetaTabBar].
class ZetaTab extends Tab {
/// Creates a Zeta Design tab bar.
ZetaTab({
Widget? icon,
String? text,
super.key,
}) : super(
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (icon != null) ...[
const SizedBox(width: ZetaSpacing.s),
icon,
],
if (text != null)
Padding(
padding: icon != null ? const EdgeInsets.only(left: ZetaSpacing.x2) : EdgeInsets.zero,
child: Text(text),
),
if (icon != null) const SizedBox(width: ZetaSpacing.s),
],
),
);
}
35 changes: 35 additions & 0 deletions lib/src/components/tabs/tab_bar.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import 'package:flutter/material.dart';
import '../../../zeta_flutter.dart';

/// A Zeta Design primary tab bar.
class ZetaTabBar extends TabBar {
/// Creates a Zeta Design primary tab bar.
ZetaTabBar({
required BuildContext context,
required List<ZetaTab> super.tabs,
TabAlignment super.tabAlignment = TabAlignment.center,
bool enabled = true,
super.isScrollable,
super.enableFeedback,
super.dragStartBehavior,
super.padding,
super.onTap,
super.key,
}) : super(
indicatorSize: isScrollable ? TabBarIndicatorSize.label : TabBarIndicatorSize.tab,
labelPadding: isScrollable ? null : EdgeInsets.zero,
indicator: UnderlineTabIndicator(
borderSide: BorderSide(
color: Zeta.of(context).colors.primary,
width: enabled ? 4 : 0,
),
borderRadius: ZetaRadius.none,
),
labelStyle: ZetaTextStyles.labelLarge.copyWith(
color: enabled ? Zeta.of(context).colors.textDefault : Zeta.of(context).colors.textDisabled,
),
unselectedLabelStyle: ZetaTextStyles.labelLarge.copyWith(
color: enabled ? Zeta.of(context).colors.textSubtle : Zeta.of(context).colors.textDisabled,
),
);
}
2 changes: 2 additions & 0 deletions lib/zeta_flutter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ export 'src/components/progress/progress_circle.dart';
export 'src/components/radio/radio.dart';
export 'src/components/snack_bar/snack_bar.dart';
export 'src/components/switch/zeta_switch.dart';
export 'src/components/tabs/tab.dart';
export 'src/components/tabs/tab_bar.dart';
export 'src/theme/color_extensions.dart';
export 'src/theme/color_scheme.dart';
export 'src/theme/color_swatch.dart';
Expand Down

0 comments on commit 31bc20a

Please sign in to comment.