import 'package:flutter/material.dart'; class Sidebar extends StatelessWidget { final bool isSidebarOpen; final String selectedPage; final Function(String) onPageChanged; const Sidebar({ super.key, required this.isSidebarOpen, required this.selectedPage, required this.onPageChanged, }); @override Widget build(BuildContext context) { return Container( width: 260, color: const Color(0xFF181C22), // 어두운 테마 배경색 유지 padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 8.0), child: AnimatedOpacity( duration: const Duration(milliseconds: 200), curve: isSidebarOpen ? const Interval(0.6, 1.0, curve: Curves.easeIn) : Curves.easeOut, opacity: isSidebarOpen ? 1.0 : 0.0, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // 최상단 앱 타이틀 const Padding( padding: EdgeInsets.symmetric(horizontal: 16.0), child: Text( 'Smart Garden', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Color(0xFFB4E49C), // 페이모바일 포인트 컬러 유지 ), ), ), const SizedBox(height: 32), // 📜 대분류 및 하위 메뉴 영역 Expanded( child: ListView( physics: const BouncingScrollPhysics(), children: [ // 1. Dashboard 그룹 _buildExpansionMenu( icon: Icons.dashboard_outlined, title: 'Dashboard', children: [ _buildSubMenuItem('스마트가든 챗봇'), ], ), // 2. 데이터 조회 그룹 _buildExpansionMenu( icon: Icons.analytics_outlined, title: '데이터 조회', initiallyExpanded: true, // 자주 보는 데이터 조회를 기본으로 열어둡니다. children: [ _buildSubMenuItem('온도 데이터'), _buildSubMenuItem('습도 데이터'), _buildSubMenuItem('이산화탄소 데이터'), _buildSubMenuItem('TVOC 데이터'), _buildSubMenuItem('미세먼지 데이터'), ], ), // 3. 장비 관리 (하위 메뉴가 없는 단일 대분류 버튼) _buildSingleMenu( icon: Icons.widgets_outlined, title: '장비 관리', ), ], ), ), // 하단 로그아웃 버튼 Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFFB4E49C), foregroundColor: Colors.black, padding: const EdgeInsets.symmetric(vertical: 14), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), ), child: const Text('Log Out', style: TextStyle(fontWeight: FontWeight.bold)), ), ), ), ], ), ), ); } // ✨ 그룹형 (대분류 > 소분류) 메뉴를 만드는 빌더 Widget _buildExpansionMenu({ required IconData icon, required String title, required List children, bool initiallyExpanded = false, }) { return Theme( // ExpansionTile 고유의 상하단 구분선(Border)을 제거하는 테마 트릭 data: ThemeData.dark().copyWith(dividerColor: Colors.transparent), child: ExpansionTile( initiallyExpanded: initiallyExpanded, leading: Icon(icon, color: Colors.white70, size: 22), title: Text( title, style: const TextStyle(color: Colors.white, fontSize: 15, fontWeight: FontWeight.bold), ), trailing: const Icon(Icons.keyboard_arrow_down, color: Colors.white38, size: 18), childrenPadding: const EdgeInsets.only(left: 16.0), // 하위 메뉴 들여쓰기 구조 설정 children: children, ), ); } // ✨ 하위(소분류) 메뉴 아이템 빌더 Widget _buildSubMenuItem(String title) { bool isSelected = (title == selectedPage); return Container( margin: const EdgeInsets.symmetric(vertical: 2, horizontal: 8), decoration: BoxDecoration( color: isSelected ? const Color(0xFFB4E49C).withOpacity(0.15) : Colors.transparent, borderRadius: BorderRadius.circular(8), ), child: ListTile( title: Text( title, style: TextStyle( color: isSelected ? const Color(0xFFB4E49C) : Colors.white60, fontSize: 14, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, ), ), dense: true, visualDensity: const VisualDensity(vertical: -2), // 메뉴 간격을 좀 더 콤팩트하게 조절 onTap: () => onPageChanged(title), ), ); } // ✨ 하위 메뉴가 없는 단독 대분류 메뉴 빌더 (ex: 장비 관리) Widget _buildSingleMenu({required IconData icon, required String title}) { bool isSelected = (title == selectedPage); return Container( margin: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), decoration: BoxDecoration( color: isSelected ? const Color(0xFFB4E49C).withOpacity(0.15) : Colors.transparent, borderRadius: BorderRadius.circular(8), ), child: ListTile( leading: Icon(icon, color: isSelected ? const Color(0xFFB4E49C) : Colors.white70, size: 22), title: Text( title, style: TextStyle( color: isSelected ? const Color(0xFFB4E49C) : Colors.white, fontSize: 15, fontWeight: FontWeight.bold, ), ), dense: true, onTap: () => onPageChanged(title), ), ); } }