import 'package:flutter/material.dart'; class PillTabBar extends StatelessWidget { final TabController controller; final List tabs; final Color selectedColor; final Color unselectedColor; final Color indicatorColor; final double height; final ValueChanged? onTap; const PillTabBar({ Key? key, required this.controller, required this.tabs, this.selectedColor = Colors.blue, this.unselectedColor = Colors.grey, this.indicatorColor = Colors.blueAccent, this.height = 48, this.onTap, }) : super(key: key); @override Widget build(BuildContext context) { // Dynamic horizontal padding between tabs final screenWidth = MediaQuery.of(context).size.width; final tabSpacing = (screenWidth / (tabs.length * 12)).clamp(8.0, 24.0); return Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: Container( height: height, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(height / 2), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.15), blurRadius: 4, offset: const Offset(0, 2), ), ], ), child: TabBar( controller: controller, indicator: BoxDecoration( color: indicatorColor.withOpacity(0.2), borderRadius: BorderRadius.circular(height / 2), ), indicatorSize: TabBarIndicatorSize.tab, indicatorPadding: EdgeInsets.symmetric( horizontal: tabSpacing / 2, vertical: 4, ), labelColor: selectedColor, unselectedLabelColor: unselectedColor, labelStyle: const TextStyle( fontWeight: FontWeight.bold, fontSize: 13, ), unselectedLabelStyle: const TextStyle( fontWeight: FontWeight.w500, fontSize: 13, ), tabs: tabs .map( (text) => Tab( child: Padding( padding: EdgeInsets.symmetric(horizontal: tabSpacing), child: Text( text, overflow: TextOverflow.ellipsis, maxLines: 2, ), ), ), ) .toList(), onTap: onTap, ), ), ); } }