swift_liquid 1.0.0
swift_liquid: ^1.0.0 copied to clipboard
Liquid UI animations and effects for Flutter - iOS-style fluid interactions with spring physics, drag gestures, and beautiful modals.
import 'package:flutter/material.dart';
import 'package:swift_liquid/swift_liquid.dart';
import 'examples/scale_tap_example.dart';
import 'examples/bottom_sheet_example.dart';
import 'examples/popover_example.dart';
import 'examples/menu_example.dart';
import 'examples/buttons_example.dart';
import 'examples/extension_example.dart';
import 'examples/container_example.dart';
import 'examples/accessibility_example.dart';
void main() {
runApp(const SwiftLiquidExampleApp());
}
class SwiftLiquidExampleApp extends StatelessWidget {
const SwiftLiquidExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Swift Liquid Examples',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
home: const ExampleHomePage(),
);
}
}
class ExampleHomePage extends StatelessWidget {
const ExampleHomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Swift Liquid Examples'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
_buildSection(
context,
'🌊 Liquid Scale Tap',
'Fluid button interactions with spring physics',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const ScaleTapExample()),
),
),
const SizedBox(height: 16),
_buildSection(
context,
'📱 Bottom Sheets',
'iOS-style modals with drag-to-dismiss',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const BottomSheetExample()),
),
),
const SizedBox(height: 16),
_buildSection(
context,
'🎯 Popovers',
'Anchored popovers with smart positioning',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const PopoverExample()),
),
),
const SizedBox(height: 16),
_buildSection(
context,
'📋 Menus',
'Interactive menu popovers',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const MenuExample()),
),
),
const SizedBox(height: 16),
_buildSection(
context,
'🔘 Buttons',
'Pre-built liquid buttons',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const ButtonsExample()),
),
),
const SizedBox(height: 16),
_buildSection(
context,
'✨ Widget Extensions',
'Add liquid effects to any widget',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const ExtensionExample()),
),
),
const SizedBox(height: 16),
_buildSection(
context,
'🔮 Glass Container',
'SContainer with built-in glass effect',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const ContainerExample()),
),
),
const SizedBox(height: 16),
_buildSection(
context,
'♿ Accessibility',
'Accessibility features and examples',
() => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const AccessibilityExample()),
),
),
],
),
);
}
Widget _buildSection(
BuildContext context,
String title,
String subtitle,
VoidCallback onTap,
) {
return SGestureDetector(
onPressed: onTap,
child: Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Theme.of(context).colorScheme.outline.withOpacity(0.2),
),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.05),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 4),
Text(
subtitle,
style: TextStyle(
fontSize: 14,
color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6),
),
),
],
),
),
Icon(
Icons.arrow_forward_ios,
size: 16,
color: Theme.of(context).colorScheme.onSurface.withOpacity(0.4),
),
],
),
),
);
}
}