// 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.

import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(title: 'Hover Demo', home: HoverDemo()));
}

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

  @override
  State<HoverDemo> createState() => _HoverDemoState();
}

class _HoverDemoState extends State<HoverDemo> {
  @override
  Widget build(BuildContext context) {
    final TextTheme textTheme = Theme.of(context).textTheme;
    final overrideFocusColor = ButtonStyle(
      overlayColor: WidgetStateProperty.resolveWith<Color>((Set<WidgetState> states) {
        return states.contains(WidgetState.focused) ? Colors.deepOrangeAccent : Colors.transparent;
      }),
    );

    return DefaultTextStyle(
      style: textTheme.headlineMedium!,
      child: Scaffold(
        appBar: AppBar(title: const Text('Hover Demo')),
        floatingActionButton: FloatingActionButton(child: const Text('+'), onPressed: () {}),
        body: Center(
          child: Builder(
            builder: (BuildContext context) {
              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Row(
                    children: <Widget>[
                      ElevatedButton(
                        onPressed: () => print('Button pressed.'),
                        style: overrideFocusColor,
                        child: const Text('Button'),
                      ),
                      TextButton(
                        onPressed: () => print('Button pressed.'),
                        style: overrideFocusColor,
                        child: const Text('Button'),
                      ),
                      IconButton(
                        onPressed: () => print('Button pressed'),
                        icon: const Icon(Icons.access_alarm),
                        focusColor: Colors.deepOrangeAccent,
                      ),
                    ],
                  ),
                  const Padding(
                    padding: EdgeInsets.all(8.0),
                    child: TextField(
                      decoration: InputDecoration(labelText: 'Enter Text', filled: true),
                    ),
                  ),
                  const Padding(
                    padding: EdgeInsets.all(8.0),
                    child: TextField(
                      decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Enter Text',
                        filled: false,
                      ),
                    ),
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}
