part of '../settings_modal.dart'; class _AppearanceSection extends StatelessWidget { final PyramidTheme pt; final bool isDark; final int accentIdx; final double radius; final double density; final double motion; final WidgetRef ref; const _AppearanceSection({ required this.pt, required this.isDark, required this.accentIdx, required this.radius, required this.density, required this.motion, required this.ref, }); @override Widget build(BuildContext context) { return SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _SectionTitle( title: 'Erscheinungsbild', subtitle: 'Gestalte Pyramid nach deinem Geschmack.', pt: pt), _SettingsGroup(title: 'Theme', pt: pt, children: [ _SettingsRow( title: 'Farbmodus', desc: 'Hell oder dunkel', pt: pt, control: _SegControl( options: const ['Dunkel', 'Hell'], selected: isDark ? 0 : 1, pt: pt, onSelect: (i) { final dark = i == 0; ref.read(themeModeProvider.notifier).state = dark; saveThemePrefs(isDark: dark); }, ), ), _Divider(pt: pt), _SettingsRow( title: 'Akzentfarbe', desc: 'Farbe für Hervorhebungen und Buttons', pt: pt, control: Row( children: accentPresets.asMap().entries.map((e) { final i = e.key; final preset = e.value; final isActive = accentIdx == i; return GestureDetector( onTap: () { ref.read(accentProvider.notifier).state = i; saveThemePrefs(accentIdx: i); }, child: AnimatedContainer( duration: const Duration(milliseconds: 150), width: 22, height: 22, margin: const EdgeInsets.only(right: 6), decoration: BoxDecoration( color: preset.color, shape: BoxShape.circle, border: isActive ? Border.all(color: Colors.white, width: 2) : null, boxShadow: isActive ? [BoxShadow(color: preset.color.withAlpha(100), blurRadius: 8)] : null, ), ), ); }).toList(), ), ), ]), const SizedBox(height: 20), _SettingsGroup(title: 'Form & Bewegung', pt: pt, children: [ _SettingsRow( title: 'Eckenrundung', desc: '${radius.round()} px', pt: pt, control: SizedBox( width: 150, child: SliderTheme( data: SliderThemeData( activeTrackColor: pt.accent, thumbColor: pt.accent, inactiveTrackColor: pt.border, trackHeight: 3, thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 6), ), child: Slider( value: radius, min: 4, max: 20, onChanged: (v) { ref.read(radiusProvider.notifier).state = v; saveThemePrefs(radius: v); }, ), ), ), ), _Divider(pt: pt), _SettingsRow( title: 'Animationen', desc: '${(motion * 100).round()}%', pt: pt, control: SizedBox( width: 150, child: SliderTheme( data: SliderThemeData( activeTrackColor: pt.accent, thumbColor: pt.accent, inactiveTrackColor: pt.border, trackHeight: 3, thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 6), ), child: Slider( value: motion, min: 0, max: 1, onChanged: (v) { ref.read(motionProvider.notifier).state = v; saveThemePrefs(motion: v); }, ), ), ), ), ]), const SizedBox(height: 20), _SettingsGroup(title: 'Vorschau', pt: pt, children: [ Padding( padding: const EdgeInsets.all(16), child: Row( children: [ Expanded( child: Column( children: [ Container( height: 100, decoration: BoxDecoration( color: pt.bg3, borderRadius: BorderRadius.circular(pt.rBase), border: Border.all(color: pt.border), ), child: const Center(child: PyramidLoader(size: 70, useLottie: true)), ), const SizedBox(height: 6), Text('Lottie', style: TextStyle(color: pt.fgMuted, fontSize: 11)), ], ), ), const SizedBox(width: 12), Expanded( child: Column( children: [ Container( height: 100, decoration: BoxDecoration( color: pt.bg3, borderRadius: BorderRadius.circular(pt.rBase), border: Border.all(color: pt.border), ), child: const Center(child: PyramidLoader(size: 70, useLottie: false)), ), const SizedBox(height: 6), Text('SVG', style: TextStyle(color: pt.fgMuted, fontSize: 11)), ], ), ), ], ), ), ]), ], ), ); } }