| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | import 'package:flutter/material.dart';// ignore: unused_importimport 'package:flowy_infra/time/duration.dart';typedef HoverBuilder = Widget Function(BuildContext context, bool onHover);typedef IsOnSelected = bool Function();class FlowyHover extends StatefulWidget {  final HoverDisplayConfig config;  final HoverBuilder builder;  final IsOnSelected? isOnSelected;  const FlowyHover({    Key? key,    required this.builder,    required this.config,    this.isOnSelected,  }) : super(key: key);  @override  State<FlowyHover> createState() => _FlowyHoverState();}class _FlowyHoverState extends State<FlowyHover> {  bool _onHover = false;  @override  Widget build(BuildContext context) {    return MouseRegion(      cursor: SystemMouseCursors.click,      onEnter: (p) => setOnHover(true),      onExit: (p) => setOnHover(false),      child: render(),    );  }  void setOnHover(bool value) => setState(() => _onHover = value);  Widget render() {    var showHover = _onHover;    if (showHover == false && widget.isOnSelected != null) {      showHover = widget.isOnSelected!();    }    if (showHover) {      return FlowyHoverBackground(        config: widget.config,        child: widget.builder(context, _onHover),      );    } else {      return widget.builder(context, _onHover);    }  }}class HoverDisplayConfig {  final Color borderColor;  final double borderWidth;  final Color hoverColor;  final BorderRadius borderRadius;  const HoverDisplayConfig(      {this.borderColor = Colors.transparent,      this.borderWidth = 0,      this.borderRadius = const BorderRadius.all(Radius.circular(6)),      required this.hoverColor});}class FlowyHoverBackground extends StatelessWidget {  final HoverDisplayConfig config;  final Widget child;  const FlowyHoverBackground({    Key? key,    required this.child,    required this.config,  }) : super(key: key);  @override  Widget build(BuildContext context) {    final hoverBorder = Border.all(      color: config.borderColor,      width: config.borderWidth,    );    return Container(      decoration: BoxDecoration(        border: hoverBorder,        color: config.hoverColor,        borderRadius: config.borderRadius,      ),      child: child,    );  }}
 |