showNeoSideMenu function

Future<void> showNeoSideMenu({
  1. required BuildContext context,
  2. required List<NeoSideMenuItem> items,
  3. String title = 'MENU',
  4. double width = 304,
})

Implementation

Future<void> showNeoSideMenu({
  required BuildContext context,
  required List<NeoSideMenuItem> items,
  String title = 'MENU',
  double width = 304,
}) {
  return showGeneralDialog<void>(
    context: context,
    barrierDismissible: true,
    barrierLabel: title,
    barrierColor: Colors.black.withValues(alpha: 0.18),
    transitionDuration: const Duration(milliseconds: 340),
    pageBuilder: (dialogContext, animation, secondaryAnimation) {
      return Align(
        alignment: Alignment.centerLeft,
        child: Material(
          color: Colors.transparent,
          child: SafeArea(
            child: Padding(
              padding: const EdgeInsets.all(16),
              child: SizedBox(
                width: width,
                child: NeoPanel(
                  radius: 30,
                  offset: NeoTokens.shadowOffset,
                  padding: const EdgeInsets.all(18),
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      NeoPill(label: title),
                      const SizedBox(height: 18),
                      for (var index = 0; index < items.length; index++) ...[
                        SizedBox(
                          width: double.infinity,
                          child: NeoButton(
                            label: items[index].label,
                            icon: items[index].icon,
                            variant: items[index].isSelected
                                ? NeoButtonVariant.primary
                                : NeoButtonVariant.secondary,
                            onPressed: () {
                              Navigator.of(dialogContext).pop();
                              items[index].onPressed();
                            },
                          ),
                        ),
                        if (index != items.length - 1)
                          const SizedBox(height: 12),
                      ],
                    ],
                  ),
                ),
              ),
            ),
          ),
        ),
      );
    },
    transitionBuilder: (context, animation, secondaryAnimation, child) {
      final curved = CurvedAnimation(
        parent: animation,
        curve: Curves.easeOutBack,
        reverseCurve: Curves.easeInCubic,
      );

      return FadeTransition(
        opacity: animation,
        child: SlideTransition(
          position: Tween<Offset>(
            begin: const Offset(-1, 0),
            end: Offset.zero,
          ).animate(curved),
          child: child,
        ),
      );
    },
  );
}