import 'package:flutter/material.dart'; import 'package:spotiflac_android/theme/app_tokens.dart'; import 'package:spotiflac_android/widgets/settings_group.dart'; /// The standard search field used by top-level app surfaces. /// /// Keeping the decoration here prevents Settings, Store, and future search /// surfaces from drifting into slightly different shapes and colors. class AppSearchField extends StatelessWidget { const AppSearchField({ super.key, required this.controller, required this.hintText, required this.clearTooltip, required this.onChanged, required this.onClear, this.focusNode, this.autofocus = false, }); final TextEditingController controller; final String hintText; final String clearTooltip; final ValueChanged onChanged; final VoidCallback onClear; final FocusNode? focusNode; final bool autofocus; @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; final radius = BorderRadius.circular(context.tokens.radiusSheet); return ValueListenableBuilder( valueListenable: controller, builder: (context, value, _) => TextField( controller: controller, focusNode: focusNode, autofocus: autofocus, textInputAction: TextInputAction.search, decoration: InputDecoration( hintText: hintText, prefixIcon: const Icon(Icons.search), suffixIcon: value.text.isEmpty ? null : IconButton( tooltip: clearTooltip, icon: const Icon(Icons.clear), onPressed: () { controller.clear(); onClear(); }, ), border: OutlineInputBorder( borderRadius: radius, borderSide: BorderSide(color: colorScheme.outlineVariant), ), enabledBorder: OutlineInputBorder( borderRadius: radius, borderSide: BorderSide(color: colorScheme.outlineVariant), ), focusedBorder: OutlineInputBorder( borderRadius: radius, borderSide: BorderSide(color: colorScheme.primary, width: 2), ), filled: true, fillColor: settingsGroupColor(context), contentPadding: const EdgeInsets.symmetric( horizontal: 20, vertical: 16, ), ), onChanged: onChanged, onTapOutside: (_) => FocusScope.of(context).unfocus(), ), ); } }