/// <summary> /// This is the method that builds all of the compnents, layouts and regions /// that make up the menu package /// </summary> public override IPackage Build(IFluentBuilder builder) { /****************************************************************** * * These things are shared between the desktop and mobile menus * ******************************************************************/ // This component outputs CSS that makes the menu work as a menu builder.BuildUpComponent(new MenuStyles()) .Name("menuStyles") .Build(); // This component outputs CSS that defines the menu appearence builder.BuildUpComponent(new MenuStyle1()) .Name("menuStyle1") .NeedsComponent("menuStyles") .Build(); // This component displays a main menu item var mainMenuItemComponent = builder.BuildUpComponent( new MenuItemComponent(Dependencies.ComponentDependenciesFactory)) .BindTo <MenuItem>() .Build(); // This component displays a submenu item var subMenuItemComponent = builder.BuildUpComponent( new MenuItemComponent(Dependencies.ComponentDependenciesFactory)) .BindTo <MenuItem>("submenu") .Build(); // This data provider extracts sub-menu items from the current menu item // using fluent syntax. var subMenuDataProvider = builder.BuildUpDataProvider() .BindTo <MenuItem>() .Provides <IList <MenuItem> >((rc, dc, d) => { var menuItem = dc.Get <MenuItem>(); dc.Set <IList <MenuItem> >(menuItem.SubMenu, "submenu"); }, "submenu") .Build(); /****************************************************************** * * These things are for the desktop menu only * ******************************************************************/ // This region is a container for the options on the desktop menu var desktopMenuItemRegion = builder.BuildUpRegion() .BindTo <MenuItem>() .Tag("div") .Component(mainMenuItemComponent) .Build(); // This region is a container for the desktop drop down menu items. It // renders one menu item component for each menu item in the sub-menu var desktopDropDownMenuRegion = builder.BuildUpRegion() .Tag("div") .ClassNames("{ns}_dt_dropdown") .ForEach <MenuItem>("submenu", null, null, "submenu") .Component(subMenuItemComponent) .Build(); // This layout defines the desktop menu option and the sub-menu that // drops down when the main menu option is tapped or hovered var desktopOptionLayout = builder.BuildUpLayout() .Tag("li") .ClassNames("{ns}_dt_option") .ZoneNesting("head,submenu") .Region("head", desktopMenuItemRegion) .Region("submenu", desktopDropDownMenuRegion) .DataProvider(subMenuDataProvider) .Build(); // This region is the whole desktop menu structure with top level menu // options and sub-menus beneath each option. This is the region you // need to add to a layout in your page to display a desktop menu. builder.BuildUpRegion() .Name("desktop_menu") .Tag("ul") .NeedsComponent("menuStyles") .ClassNames("{ns}_dt_menu") .ForEach <MenuItem>("", "", "", "desktop") .Layout(desktopOptionLayout) .Build(); /****************************************************************** * * These things are for the mobile menu only * ******************************************************************/ // This component displays the hamburger button var mobileHamburgerButtonComponent = builder.BuildUpComponent( new HamburgerButtonComponent(Dependencies.ComponentDependenciesFactory)) .Build(); // This component displays a main menu item var mobileHeaderComponent = builder.BuildUpComponent( new MobileHeaderComponent(Dependencies.ComponentDependenciesFactory)) .BindTo <MenuItem>() .Build(); // This region contains a top-level option on the mobile menu var mobileMenuHead = builder.BuildUpRegion() .Tag("") .Component(mobileHeaderComponent) .Build(); // This region repeats for each sub-menu option on a mobile menu var mobileSubMenu = builder.BuildUpRegion() .Tag("") .Component(subMenuItemComponent) .ForEach <MenuItem>("submenu", "li", null, "submenu", "{ns}_mb_option") .Build(); // This layout defines mobile menus as having a head followed by a list // of the sub-menu options var mobileMenuOptionLayout = builder.BuildUpLayout() .Tag("") .ZoneNesting("head,subMenu") .Region("head", mobileMenuHead) .Region("subMenu", mobileSubMenu) .DataProvider(subMenuDataProvider) .Build(); // This region contains the hamburger button var mobileHamburgerRegion = builder.BuildUpRegion() .Tag("") .Component(mobileHamburgerButtonComponent) .Build(); // This region contains the panel that slides out from the edge of the page var mobileSlideoutRegion = builder.BuildUpRegion() .Tag("ul") .ClassNames("{ns}_mb_slideout") .ForEach <MenuItem>("", "", "", "mobile") .Layout(mobileMenuOptionLayout) .Build(); // This layout is the top-level container for the mobile menu. It defines // the mobile menu consisting of a hamburger button and a slide-out panel var mobileMenuLayout = builder.BuildUpLayout() .ZoneNesting("hamburger,slideout") .Region("hamburger", mobileHamburgerRegion) .Region("slideout", mobileSlideoutRegion) .Build(); // This region is the whole mobile menu structure with a hamburger // button that opens and closes a slide-out sidebar menu. This is // the region you would add to your website to include a mobile menu builder.BuildUpRegion() .Name("mobile_menu") .NeedsComponent("menuStyles") .ClassNames("{ns}_mb_menu") .Layout(mobileMenuLayout) .Build(); return(this); }