bottomNavigationBarStory top-level property

Story bottomNavigationBarStory
getter/setter pair

Implementation

Story bottomNavigationBarStory = Story(
  name: 'Bottom Navigation Bar',
  builder: (context) {
    final bottomNavBarType = context.knobs.options(
      label: 'Bottom Navigation Bar Type',
      options: [
        Option(label: 'Labelled', value: BottomNavBarType.labelled),
        Option(label: 'Only Icons', value: BottomNavBarType.onlyIcons),
        Option(label: 'Shiftable', value: BottomNavBarType.shiftable),
        Option(label: 'Badged', value: BottomNavBarType.badged),
        Option(label: 'Floating', value: BottomNavBarType.floating),
        Option(label: 'Extended', value: BottomNavBarType.extended),
      ],
      initial: BottomNavBarType.labelled,
    );

    final navBarHeight = context.knobs.slider(
      label: 'Navigation Bar Height',
      initial: 80.0,
      min: 40.0,
      max: 100.0,
    );

    final selectedItemColor = context.knobs.options(
      label: 'Selected Item Color',
      options: [
        Option(label: 'Blue', value: Colors.blue),
        Option(label: 'Red', value: Colors.red),
        Option(label: 'Green', value: Colors.green),
      ],
      initial: Colors.blue,
    );

    final unselectedItemColor = context.knobs.options(
      label: 'Unselected Item Color',
      options: [
        Option(label: 'Grey', value: Colors.grey),
        Option(label: 'Black', value: Colors.black),
        Option(label: 'White', value: Colors.white),
        Option(label: 'Dark Grey', value: Colors.grey[700]),
      ],
      initial: Colors.grey,
    );

    final backgroundColor = context.knobs.options(
      label: 'Background Color',
      options: [
        Option(label: 'White', value: Colors.white),
        Option(label: 'Black', value: Colors.black),
        Option(label: 'Blue', value: Colors.blue),
        Option(label: 'Grey', value: Colors.grey),
        Option(label: 'Light Blue', value: Colors.lightBlue),
        Option(label: 'Green', value: Colors.green),
      ],
      initial: Colors.white,
    );

    final shadowColor = context.knobs.options(
      label: 'Shadow Color',
      options: [
        Option(label: 'Black', value: Colors.black),
        Option(label: 'White', value: Colors.white),
        Option(label: 'Blue', value: Colors.blue.withOpacity(0.5)),
        Option(label: 'Orange', value: Colors.orange.withOpacity(0.5)),
        Option(label: 'Purple', value: Colors.purple.withOpacity(0.3)),
        Option(label: 'None', value: Colors.transparent),
      ],
      initial: Colors.black,
    );

    final hasBadge = context.knobs.boolean(
      label: 'Show Badges',
      initial: false,
    );

    final badgeColor = context.knobs.options(
      label: 'Badge Color',
      options: [
        Option(label: 'Red', value: Colors.red),
        Option(label: 'Blue', value: Colors.blue),
        Option(label: 'Green', value: Colors.green),
      ],
      initial: Colors.red,
    );

    final showFabActions = context.knobs.boolean(
      label: 'Show Extended Actions',
      initial: true,
    );

    final fabAction1Icon = context.knobs.options(
      label: 'Extended Action 1 Icon',
      options: [
        Option(label: 'Message', value: Icons.message),
        Option(label: 'Email', value: Icons.email),
        Option(label: 'Chat', value: Icons.chat),
      ],
      initial: Icons.message,
    );

    final fabAction2Icon = context.knobs.options(
      label: 'Extended Action 2 Icon',
      options: [
        Option(label: 'Notifications', value: Icons.notifications),
        Option(label: 'Alarm', value: Icons.alarm),
        Option(label: 'Bell', value: Icons.notification_important),
      ],
      initial: Icons.notifications,
    );

    final fabAction3Icon = context.knobs.options(
      label: 'Extended Action 3 Icon',
      options: [
        Option(label: 'Settings', value: Icons.settings),
        Option(label: 'More', value: Icons.more_vert),
        Option(label: 'Menu', value: Icons.menu),
      ],
      initial: Icons.settings,
    );

    final ValueNotifier<int> currentIndexNotifier = ValueNotifier<int>(0);

    List<DDSBottomNavItemConfig> generateItems() {
      return [
        DDSBottomNavItemConfig(
          icon: DDSIconData(Icons.home),
          label: 'Home',
          hasBadge: hasBadge,
          badgeColor: badgeColor,
        ),
        DDSBottomNavItemConfig(
          icon: DDSIconData(Icons.search),
          label: 'Search',
          hasBadge: hasBadge,
          badgeColor: badgeColor,
        ),
        DDSBottomNavItemConfig(
          icon: DDSIconData(Icons.person),
          label: 'Profile',
          hasBadge: hasBadge,
          badgeColor: badgeColor,
        ),
        DDSBottomNavItemConfig(
          icon: DDSIconData(Icons.settings),
          label: 'Settings',
          hasBadge: hasBadge,
          badgeColor: badgeColor,
        ),
      ];
    }

    List<ActionButtonConfig>? generateFabActions() {
      if (!showFabActions) return null;

      return [
        ActionButtonConfig(
          icon: DDSIconData(fabAction1Icon),
          onPressed: () => print('Action 1 pressed'),
          iconColor: selectedItemColor,
        ),
        ActionButtonConfig(
          icon: DDSIconData(fabAction2Icon),
          onPressed: () => print('Action 2 pressed'),
          iconColor: selectedItemColor,
        ),
        ActionButtonConfig(
          icon: DDSIconData(fabAction3Icon),
          onPressed: () => print('Action 3 pressed'),
          iconColor: selectedItemColor,
        ),
      ];
    }

    return Scaffold(
      backgroundColor: Colors.grey[200],
      body: SafeArea(
        child: Center(
          child: Container(
            width: MediaQuery.of(context).size.width * 0.9,
            padding: const EdgeInsets.only(bottom: 2.0),
            child: ValueListenableBuilder<int>(
              valueListenable: currentIndexNotifier,
              builder: (context, currentIndex, child) {
                return DDSBottomNavBar(
                  type: bottomNavBarType,
                  currentIndex: currentIndex,
                  onTap: (index) {
                    currentIndexNotifier.value = index;
                    print('Current Index: $index');
                  },
                  items: generateItems(),
                  selectedItemColor: selectedItemColor,
                  unselectedItemColor: unselectedItemColor,
                  backgroundColor: backgroundColor,
                  borderRadius: bottomNavBarType == BottomNavBarType.floating
                      ? BorderRadius.circular(30)
                      : null,
                  height: navBarHeight,
                  shadowColor: shadowColor,
                  fabActions: bottomNavBarType == BottomNavBarType.extended
                      ? generateFabActions()
                      : null,
                );
              },
            ),
          ),
        ),
      ),
    );
  },
);