diff --git a/lib/panache.dart b/lib/panache.dart index 1b8e97a..6298159 100644 --- a/lib/panache.dart +++ b/lib/panache.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:panache/src/model/unit.dart'; +import 'package:panache/src/ui/components/unit_button.dart'; import 'package:syncfusion_flutter_sliders/sliders.dart'; class Panache extends HookWidget { @@ -41,49 +42,37 @@ class Panache extends HookWidget { }, ), ), - FilledButton( - onPressed: () { - selectedUnit.value = Unit.paragraphs; - }, - style: OutlinedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), + FocusTraversalGroup( + policy: WidgetOrderTraversalPolicy(), + child: Column( + spacing: 16.0, + children: [ + UnitButton( + unit: Unit.paragraphs, + onPressed: () { + selectedUnit.value = Unit.paragraphs; + }, + ), + UnitButton( + unit: Unit.sentences, + onPressed: () { + selectedUnit.value = Unit.sentences; + }, + ), + UnitButton( + unit: Unit.words, + onPressed: () { + selectedUnit.value = Unit.words; + }, + ), + UnitButton( + unit: Unit.bytes, + onPressed: () { + selectedUnit.value = Unit.bytes; + }, + ), + ], ), - child: Text(Unit.paragraphs.text), - ), - FilledButton( - onPressed: () { - selectedUnit.value = Unit.sentences; - }, - style: OutlinedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - child: Text(Unit.sentences.text), - ), - FilledButton( - onPressed: () { - selectedUnit.value = Unit.words; - }, - style: OutlinedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - child: Text(Unit.words.text), - ), - FilledButton( - onPressed: () { - selectedUnit.value = Unit.bytes; - }, - style: OutlinedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - child: Text(Unit.bytes.text), ), ], ), diff --git a/lib/src/ui/components/unit_button.dart b/lib/src/ui/components/unit_button.dart new file mode 100644 index 0000000..9ef42a9 --- /dev/null +++ b/lib/src/ui/components/unit_button.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:panache/src/model/unit.dart'; + +class UnitButton extends HookWidget { + const UnitButton({ + super.key, + required this.unit, + required this.onPressed, + }); + + final Unit unit; + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + final focusNode = useFocusNode(); + final isFocused = useState(false); + + useEffect(() { + focusNode.addListener(() { + if (focusNode.hasFocus) { + focusNode.requestFocus(); + } + + isFocused.value = focusNode.hasFocus; + }); + + return; + }, []); + + return Container( + decoration: isFocused.value + ? ShapeDecoration( + shape: RoundedRectangleBorder( + side: BorderSide(width: 4, color: Colors.indigo), + borderRadius: BorderRadius.circular(25), + ), + ) + : null, + child: ElevatedButton( + focusNode: focusNode, + onPressed: () { + onPressed(); + focusNode.requestFocus(); + }, + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25), + ), + ), + child: Text(unit.text), + ), + ); + } +}