Skip to content

Commit 6fdd211

Browse files
authored
feat: Accordion interaction based on open variable (#546)
1 parent 8cc7d4a commit 6fdd211

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2383
-1043
lines changed

packages/mix/lib/src/attributes/animated/animated_data.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ class AnimatedData {
3333
return AnimatedDataDto(duration: duration, curve: curve, onEnd: _onEnd);
3434
}
3535

36+
AnimatedData copyWith({
37+
Duration? duration,
38+
Curve? curve,
39+
VoidCallback? onEnd,
40+
}) {
41+
return AnimatedData(
42+
duration: duration ?? this.duration,
43+
curve: curve ?? this.curve,
44+
onEnd: onEnd ?? this.onEnd,
45+
);
46+
}
47+
3648
@override
3749
bool operator ==(Object other) {
3850
if (identical(this, other)) return true;

packages/remix/demo/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
*.swp
66
.DS_Store
77
.atom/
8+
.build/
89
.buildlog/
910
.history
1011
.svn/
12+
.swiftpm/
1113
migrate_working_dir/
1214

1315
# IntelliJ related

packages/remix/demo/lib/components/accordion_use_case.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
import 'package:demo/addons/icon_data_knob.dart';
2+
import 'package:demo/helpers/use_case_state.dart';
23
import 'package:flutter/material.dart' as m;
34
import 'package:flutter/widgets.dart';
45
import 'package:mix/mix.dart';
56
import 'package:remix/remix.dart';
67
import 'package:widgetbook/widgetbook.dart';
78
import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;
89

10+
final _accordionKey = GlobalKey();
11+
912
@widgetbook.UseCase(
1013
name: 'Accordion Component',
1114
type: Accordion,
1215
)
1316
Widget buildAccordionUseCase(BuildContext context) {
17+
final knobState = WidgetbookState.of(context);
18+
1419
return Scaffold(
1520
body: Center(
1621
child: SizedBox(
1722
width: 300,
1823
child: Accordion(
24+
key: _accordionKey,
1925
header: (spec) => AccordionHeaderSpecWidget(
2026
title: context.knobs.string(
2127
label: 'Title',
@@ -33,11 +39,14 @@ Widget buildAccordionUseCase(BuildContext context) {
3339
),
3440
spec: spec,
3541
),
36-
initiallyExpanded: true,
37-
content: (spec) => TextSpecWidget(
42+
expanded:
43+
context.knobs.boolean(label: 'Expanded', initialValue: true),
44+
content: const StyledText(
3845
'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s',
39-
spec: spec,
4046
),
47+
onChanged: (value) {
48+
knobState.updateKnob('Expanded', !value);
49+
},
4150
),
4251
),
4352
),
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import 'package:flutter/material.dart' as m;
2+
import 'package:flutter/widgets.dart';
3+
import 'package:remix/remix.dart';
4+
import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;
5+
6+
@widgetbook.UseCase(
7+
name: 'DropdownMenu Component',
8+
type: DropdownMenu,
9+
)
10+
Widget buildDropdownMenu(BuildContext context) {
11+
return const Scaffold(
12+
body: Center(
13+
child: DropdownMenuDemo(),
14+
),
15+
);
16+
}
17+
18+
class DropdownMenuDemo extends StatefulWidget {
19+
const DropdownMenuDemo({
20+
super.key,
21+
});
22+
23+
@override
24+
State<DropdownMenuDemo> createState() => _DropdownMenuDemoState();
25+
}
26+
27+
enum MenuItem {
28+
home,
29+
profile,
30+
}
31+
32+
class _DropdownMenuDemoState extends State<DropdownMenuDemo> {
33+
bool open = false;
34+
@override
35+
Widget build(BuildContext context) {
36+
return Center(
37+
child: DropdownMenu(
38+
trigger: IconButton(
39+
m.Icons.menu,
40+
onPressed: () {
41+
setState(() {
42+
open = !open;
43+
});
44+
},
45+
),
46+
onPressOutside: () {
47+
setState(() {
48+
open = false;
49+
});
50+
},
51+
open: open,
52+
items: [
53+
const DropdownMenuItem(
54+
text: 'Features',
55+
variants: [
56+
DropdownMenuStyle.itemLabel,
57+
],
58+
),
59+
DropdownMenuItem(
60+
text: 'home',
61+
onPress: () {
62+
setState(() {
63+
open = false;
64+
});
65+
showToast(
66+
context: context,
67+
entry: ToastEntry(
68+
builder: (context, actions) => const Toast(
69+
title: 'home was selected',
70+
),
71+
),
72+
);
73+
},
74+
),
75+
DropdownMenuItem(
76+
text: 'profile',
77+
onPress: () {
78+
setState(() {
79+
open = false;
80+
});
81+
showToast(
82+
context: context,
83+
entry: ToastEntry(
84+
builder: (context, actions) => const Toast(
85+
title: 'profile was selected',
86+
),
87+
),
88+
);
89+
},
90+
),
91+
],
92+
),
93+
);
94+
}
95+
}

packages/remix/demo/lib/components/select_use_case.dart renamed to packages/remix/demo/lib/components/select.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:demo/helpers/knob_builder.dart';
2-
import 'package:flutter/material.dart' as m;
32
import 'package:flutter/widgets.dart';
43
import 'package:remix/remix.dart';
54
import 'package:remix/themes/fortaleza.dart';
@@ -41,15 +40,16 @@ class _SelectDemoState extends State<SelectDemo> {
4140
SizedBox(
4241
width: 200,
4342
child: Select<String>(
44-
disabled:
45-
context.knobs.boolean(label: 'disabled', initialValue: false),
46-
variants: [context.knobs.variant(FortalezaSelectStyle.variants)],
4743
value: selectedValue,
4844
onChanged: (value) => setState(() => selectedValue = value),
49-
button: (spec) => spec(
45+
trigger: SelectTrigger(
5046
text: selectedValue,
51-
trailingIcon: m.Icons.keyboard_arrow_down_rounded,
47+
disabled: context.knobs.boolean(
48+
label: 'disabled',
49+
initialValue: false,
50+
),
5251
),
52+
variants: [context.knobs.variant(FortalezaSelectStyle.variants)],
5353
items: List.generate(
5454
items.length,
5555
(index) => SelectMenuItem<String>(

packages/remix/demo/lib/main.directories.g.dart

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,18 @@ import 'package:demo/components/checkbox_use_case.dart' as _i8;
1919
import 'package:demo/components/chip_use_case.dart' as _i9;
2020
import 'package:demo/components/dialog_use_case.dart' as _i10;
2121
import 'package:demo/components/divider_use_case.dart' as _i11;
22-
import 'package:demo/components/icon_button_use_case.dart' as _i12;
23-
import 'package:demo/components/menu_item_use_case.dart' as _i13;
24-
import 'package:demo/components/progress_use_case.dart' as _i14;
25-
import 'package:demo/components/radio_use_case.dart' as _i15;
26-
import 'package:demo/components/segmented_control_use_case.dart' as _i16;
27-
import 'package:demo/components/select_use_case.dart' as _i17;
28-
import 'package:demo/components/slider.dart' as _i18;
29-
import 'package:demo/components/spinner_use_case.dart' as _i19;
30-
import 'package:demo/components/switch_use_case.dart' as _i20;
31-
import 'package:demo/components/textfield_use_case.dart' as _i21;
32-
import 'package:demo/components/toast_use_case.dart' as _i22;
22+
import 'package:demo/components/dropdown_menu.dart' as _i12;
23+
import 'package:demo/components/icon_button_use_case.dart' as _i13;
24+
import 'package:demo/components/menu_item_use_case.dart' as _i14;
25+
import 'package:demo/components/progress_use_case.dart' as _i15;
26+
import 'package:demo/components/radio_use_case.dart' as _i16;
27+
import 'package:demo/components/segmented_control_use_case.dart' as _i17;
28+
import 'package:demo/components/select.dart' as _i18;
29+
import 'package:demo/components/slider.dart' as _i19;
30+
import 'package:demo/components/spinner_use_case.dart' as _i20;
31+
import 'package:demo/components/switch_use_case.dart' as _i21;
32+
import 'package:demo/components/textfield_use_case.dart' as _i22;
33+
import 'package:demo/components/toast_use_case.dart' as _i23;
3334
import 'package:widgetbook/widgetbook.dart' as _i1;
3435

3536
final directories = <_i1.WidgetbookNode>[
@@ -106,81 +107,88 @@ final directories = <_i1.WidgetbookNode>[
106107
builder: _i11.buildDivider,
107108
),
108109
),
110+
_i1.WidgetbookLeafComponent(
111+
name: 'DropdownMenu',
112+
useCase: _i1.WidgetbookUseCase(
113+
name: 'DropdownMenu Component',
114+
builder: _i12.buildDropdownMenu,
115+
),
116+
),
109117
_i1.WidgetbookLeafComponent(
110118
name: 'IconButton',
111119
useCase: _i1.WidgetbookUseCase(
112120
name: 'Button Component',
113-
builder: _i12.buildButtonUseCase,
121+
builder: _i13.buildButtonUseCase,
114122
),
115123
),
116124
_i1.WidgetbookLeafComponent(
117125
name: 'MenuItem',
118126
useCase: _i1.WidgetbookUseCase(
119127
name: 'Menu Item Component',
120-
builder: _i13.buildButtonUseCase,
128+
builder: _i14.buildButtonUseCase,
121129
),
122130
),
123131
_i1.WidgetbookLeafComponent(
124132
name: 'Progress',
125133
useCase: _i1.WidgetbookUseCase(
126134
name: 'Progress Component',
127-
builder: _i14.buildProgressUseCase,
135+
builder: _i15.buildProgressUseCase,
128136
),
129137
),
130138
_i1.WidgetbookLeafComponent(
131139
name: 'Radio',
132140
useCase: _i1.WidgetbookUseCase(
133141
name: 'Radio Component',
134-
builder: _i15.buildRadioUseCase,
142+
builder: _i16.buildRadioUseCase,
135143
),
136144
),
137145
_i1.WidgetbookLeafComponent(
138146
name: 'SegmentedControl',
139147
useCase: _i1.WidgetbookUseCase(
140148
name: 'SegmentedControl Component',
141-
builder: _i16.buildAccordionUseCase,
149+
builder: _i17.buildAccordionUseCase,
142150
),
143151
),
144152
_i1.WidgetbookLeafComponent(
145153
name: 'Select',
146154
useCase: _i1.WidgetbookUseCase(
147155
name: 'Select Component',
148-
builder: _i17.buildSelect,
156+
builder: _i18.buildSelect,
149157
),
150158
),
151159
_i1.WidgetbookLeafComponent(
152160
name: 'Slider',
153161
useCase: _i1.WidgetbookUseCase(
154162
name: 'Slider Component',
155-
builder: _i18.buildButtonUseCase,
163+
builder: _i19.buildButtonUseCase,
156164
),
157165
),
158166
_i1.WidgetbookLeafComponent(
159167
name: 'Spinner',
160168
useCase: _i1.WidgetbookUseCase(
161169
name: 'Spinner Component',
162-
builder: _i19.buildSpinnerUseCase,
170+
builder: _i20.buildSpinnerUseCase,
163171
),
164172
),
165173
_i1.WidgetbookLeafComponent(
166174
name: 'Switch',
167175
useCase: _i1.WidgetbookUseCase(
168176
name: 'Switch Component',
169-
builder: _i20.buildSwitchUseCase,
177+
builder: _i21.buildSwitchUseCase,
170178
),
171179
),
172180
_i1.WidgetbookLeafComponent(
173181
name: 'TextField',
174182
useCase: _i1.WidgetbookUseCase(
175183
name: 'TextField Component',
176-
builder: _i21.buildButtonUseCase,
184+
builder: _i22.buildButtonUseCase,
177185
),
178186
),
179187
_i1.WidgetbookLeafComponent(
180188
name: 'Toast',
181189
useCase: _i1.WidgetbookUseCase(
182190
name: 'Toast Component',
183-
builder: _i22.buildButtonUseCase,
191+
builder: _i23.buildButtonUseCase,
184192
),
185193
),
186194
],
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// This is a generated file; do not edit or check into version control.
22
FLUTTER_ROOT=/Users/lucasoliveira/fvm/versions/stable
3-
FLUTTER_APPLICATION_PATH=/Users/lucasoliveira/Developer/Projects/hairday/packages/mix/packages/remix/demo
3+
FLUTTER_APPLICATION_PATH=/Users/lucasoliveira/Developer/Mix/PoCs/remix_toast/packages/mix/packages/remix/demo
44
COCOAPODS_PARALLEL_CODE_SIGN=true
5-
FLUTTER_TARGET=/Users/lucasoliveira/Developer/Projects/hairday/packages/mix/packages/remix/demo/lib/main.dart
5+
FLUTTER_TARGET=/Users/lucasoliveira/Developer/Mix/PoCs/remix_toast/packages/mix/packages/remix/demo/lib/main.dart
66
FLUTTER_BUILD_DIR=build
77
FLUTTER_BUILD_NAME=1.0.0
88
FLUTTER_BUILD_NUMBER=1
99
DART_OBFUSCATION=false
1010
TRACK_WIDGET_CREATION=true
1111
TREE_SHAKE_ICONS=false
12-
PACKAGE_CONFIG=/Users/lucasoliveira/Developer/Projects/hairday/packages/mix/packages/remix/demo/.dart_tool/package_config.json
12+
PACKAGE_CONFIG=/Users/lucasoliveira/Developer/Mix/PoCs/remix_toast/packages/mix/packages/remix/demo/.dart_tool/package_config.json

0 commit comments

Comments
 (0)