<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Menu Display template: Responsive side nav with toggle dropdown</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121410942" />
  <subtitle>Menu Display template: Responsive side nav with toggle dropdown</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121410942</id>
  <updated>2026-04-04T08:03:26Z</updated>
  <dc:date>2026-04-04T08:03:26Z</dc:date>
  <entry>
    <title>RE: RE: Menu Display template: Responsive side nav with toggle dropdown</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412533" />
    <author>
      <name>Gennaro Lippiello</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412533</id>
    <updated>2022-04-29T12:47:37Z</updated>
    <published>2022-04-29T12:47:37Z</published>
    <summary type="html">&lt;p&gt;And this is an example with dropdown effect:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;&amp;lt;#if entries?has_content&amp;gt;
	&amp;lt;nav class=&amp;quot;vertical&amp;quot;&amp;gt;
	&amp;lt;ul&amp;gt;	
	&amp;lt;#list entries as navigationEntry&amp;gt;
		&amp;lt;#assign children = navigationEntry.getChildren() /&amp;gt;
			&amp;lt;li&amp;gt;
				&amp;lt;#if children?has_content&amp;gt;
					&amp;lt;a href=&amp;quot;${navigationEntry.getURL()}&amp;quot;&amp;gt;${navigationEntry.getName()} +&amp;lt;/a&amp;gt;
					&amp;lt;@displayChildren curChildren=children /&amp;gt;
				&amp;lt;#else&amp;gt;
					&amp;lt;a href=&amp;quot;${navigationEntry.getURL()}&amp;quot;&amp;gt;${navigationEntry.getName()}&amp;lt;/a&amp;gt;
				&amp;lt;/#if&amp;gt;
			&amp;lt;/li&amp;gt;
	&amp;lt;/#list&amp;gt;
	&amp;lt;/ul&amp;gt;	
	&amp;lt;/nav&amp;gt;
&amp;lt;/#if&amp;gt;

&amp;lt;#macro displayChildren curChildren&amp;gt;
		&amp;lt;ul&amp;gt;	
		&amp;lt;#list curChildren as childEntry&amp;gt;
			&amp;lt;li&amp;gt;
				&amp;lt;#assign children = childEntry.getChildren() /&amp;gt;
				&amp;lt;#if children?has_content&amp;gt;
					&amp;lt;a href=&amp;quot;${childEntry.getURL()}&amp;quot;&amp;gt;${childEntry.getName()} +&amp;lt;/a&amp;gt;
					&amp;lt;@displayChildren curChildren=children /&amp;gt;
				&amp;lt;#else&amp;gt;
					&amp;lt;a href=&amp;quot;${childEntry.getURL()}&amp;quot;&amp;gt;${childEntry.getName()}&amp;lt;/a&amp;gt;
				&amp;lt;/#if&amp;gt;
			&amp;lt;/li&amp;gt;
		&amp;lt;/#list&amp;gt;
		&amp;lt;/ul&amp;gt;
&amp;lt;/#macro&amp;gt;

&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
nav.vertical{
  position:relative;
  background:#667;
}

nav.vertical ul{
  list-style: none;
}

nav.vertical li{
  position:relative;
}

nav.vertical a{
  display:block;
  color:#eee;
  text-decoration:none;
  padding:10px 15px;
  transition:0.2s;
}

nav.vertical li:hover &amp;gt; a{
  background:#778;
}

nav.vertical ul ul{
  background:rgba(0,0,0,0.1);
  padding-left:20px;
  transition: max-height 0.2s ease-out;
  max-height:0;
  overflow:hidden;
}

nav.vertical li:hover &amp;gt; ul{
  max-height:500px;
  transition: max-height 0.25s ease-in;
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Gennaro Lippiello</dc:creator>
    <dc:date>2022-04-29T12:47:37Z</dc:date>
  </entry>
  <entry>
    <title>RE: RE: Menu Display template: Responsive side nav with toggle dropdown</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412487" />
    <author>
      <name>Gennaro Lippiello</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412487</id>
    <updated>2022-04-29T12:35:25Z</updated>
    <published>2022-04-29T12:35:24Z</published>
    <summary type="html">&lt;p&gt;I added a bit of CSS, here the full code:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;&amp;lt;#if entries?has_content&amp;gt;
	&amp;lt;nav class=&amp;quot;vertical&amp;quot;&amp;gt;
	&amp;lt;ul&amp;gt;	
	&amp;lt;#list entries as navigationEntry&amp;gt;
			&amp;lt;li&amp;gt;
				&amp;lt;a href=&amp;quot;${navigationEntry.getURL()}&amp;quot;&amp;gt;${navigationEntry.getName()}&amp;lt;/a&amp;gt;
				&amp;lt;@displayChildren curNavigationEntry=navigationEntry /&amp;gt;
			&amp;lt;/li&amp;gt;
			
	&amp;lt;/#list&amp;gt;
	&amp;lt;/ul&amp;gt;	
	&amp;lt;/nav&amp;gt;
&amp;lt;/#if&amp;gt;

&amp;lt;#macro displayChildren curNavigationEntry&amp;gt;
	&amp;lt;#assign children = curNavigationEntry.getChildren() /&amp;gt;
	&amp;lt;#if children?has_content&amp;gt;
		&amp;lt;ul&amp;gt;	
		&amp;lt;#list children as childEntry&amp;gt;
			&amp;lt;li&amp;gt;
				&amp;lt;a href=&amp;quot;${childEntry.getURL()}&amp;quot;&amp;gt;${childEntry.getName()}&amp;lt;/a&amp;gt;
				&amp;lt;@displayChildren curNavigationEntry=childEntry /&amp;gt;
			&amp;lt;/li&amp;gt;
		&amp;lt;/#list&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/#if&amp;gt;
&amp;lt;/#macro&amp;gt;

&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
	nav.vertical{
		position:relative;
		width:200px;
	}

	nav.vertical ul{
		list-style: none;
	}
	
	nav.vertical li{
		position:relative;
	}
	
	nav.vertical a{
		display:block;
		color:#eee;
		text-decoration:none;
		padding:10px 15px;
		background:#667;
		transition:0.2s;
	}
	
	nav.vertical li:hover &amp;gt; a{
		background:#778;
	}

	nav.vertical ul ul{
	  padding: 0px;
		position:absolute;
		left:0%;
		top:0;
		width:100%;
		visibility:hidden;
		opacity:0;
		transition: transform 0.2s;
		transform: translateX(50px);
	}
	
	nav.vertical li:hover &amp;gt; ul{
		left:100%;
		visibility:visible;
		opacity:1;
		transform: translateX(0px);
	}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Gennaro Lippiello</dc:creator>
    <dc:date>2022-04-29T12:35:24Z</dc:date>
  </entry>
  <entry>
    <title>RE: Menu Display template: Responsive side nav with toggle dropdown</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412233" />
    <author>
      <name>Gennaro Lippiello</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412233</id>
    <updated>2022-04-29T11:48:02Z</updated>
    <published>2022-04-29T11:48:02Z</published>
    <summary type="html">&lt;p&gt;Hello I don't have a full example, but I just wrote this very simple
  template. If you start from it, adding some code and working with css
  you should be able to get what you want.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;&amp;lt;#if entries?has_content&amp;gt;
	&amp;lt;ul&amp;gt;	
	&amp;lt;#list entries as navigationEntry&amp;gt;
			&amp;lt;li&amp;gt;
				&amp;lt;a href=&amp;quot;${navigationEntry.getURL()}&amp;quot;&amp;gt;${navigationEntry.getName()}&amp;lt;/a&amp;gt;
				&amp;lt;@displayChildren curNavigationEntry=navigationEntry /&amp;gt;
			&amp;lt;/li&amp;gt;
			
	&amp;lt;/#list&amp;gt;
	&amp;lt;/ul&amp;gt;	
&amp;lt;/#if&amp;gt;

&amp;lt;#macro displayChildren curNavigationEntry&amp;gt;
	&amp;lt;#assign children = curNavigationEntry.getChildren() /&amp;gt;
	&amp;lt;#if children?has_content&amp;gt;
		&amp;lt;ul&amp;gt;	
		&amp;lt;#list children as childEntry&amp;gt;
			&amp;lt;li&amp;gt;
				&amp;lt;a href=&amp;quot;${childEntry.getURL()}&amp;quot;&amp;gt;${childEntry.getName()}&amp;lt;/a&amp;gt;
				&amp;lt;@displayChildren curNavigationEntry=childEntry /&amp;gt;
			&amp;lt;/li&amp;gt;
		&amp;lt;/#list&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/#if&amp;gt;
&amp;lt;/#macro&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Gennaro Lippiello</dc:creator>
    <dc:date>2022-04-29T11:48:02Z</dc:date>
  </entry>
  <entry>
    <title>RE: Menu Display template: Responsive side nav with toggle dropdown</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412292" />
    <author>
      <name>Mohammed Yasin</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121412292</id>
    <updated>2022-05-02T16:23:00Z</updated>
    <published>2022-04-29T08:42:51Z</published>
    <summary type="html">&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;You can use Split Button Dropdowns template itself and add css for
  making it display in list Ex:&lt;/p&gt;
&lt;pre&gt;
&lt;code class="language-java"&gt;&amp;lt;#include &amp;quot;${templatesPath}/NAVIGATION-MACRO-FTL&amp;quot; /&amp;gt;

&amp;lt;#if !entries?has_content&amp;gt;
	&amp;lt;#if themeDisplay.isSignedIn()&amp;gt;
		&amp;lt;div class=&amp;quot;alert alert-info&amp;quot;&amp;gt;
			&amp;lt;@liferay.language key=&amp;quot;there-are-no-menu-items-to-display&amp;quot; /&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/#if&amp;gt;
&amp;lt;#else&amp;gt;
	&amp;lt;#assign
		portletDisplay = themeDisplay.getPortletDisplay()

		navbarId = &amp;quot;navbar_&amp;quot; + portletDisplay.getId()
	/&amp;gt;

	&amp;lt;div id=&amp;quot;${navbarId}&amp;quot;&amp;gt;
		&amp;lt;ul class=&amp;quot;navbar-site split-button-dropdowns&amp;quot;&amp;gt;
			&amp;lt;#assign navItems = entries /&amp;gt;

			&amp;lt;#list navItems as navItem&amp;gt;
				&amp;lt;#assign showChildrenNavItems = (displayDepth != 1) &amp;amp;&amp;amp; navItem.hasBrowsableChildren() /&amp;gt;

				&amp;lt;#if navItem.isBrowsable() || showChildrenNavItems&amp;gt;
					&amp;lt;#assign
						nav_item_css_class = &amp;quot;&amp;quot;
						nav_item_href_link = &amp;quot;&amp;quot;
					/&amp;gt;

					&amp;lt;#if navItem.isChildSelected() || navItem.isSelected()&amp;gt;
						&amp;lt;#assign nav_item_css_class = &amp;quot;active&amp;quot; /&amp;gt;
					&amp;lt;/#if&amp;gt;

					&amp;lt;#if navItem.isBrowsable()&amp;gt;
						&amp;lt;#assign nav_item_href_link = &amp;quot;href='${navItem.getURL()}' ${navItem.getTarget()}&amp;quot; /&amp;gt;
					&amp;lt;/#if&amp;gt;

					&amp;lt;li&amp;gt;
						&amp;lt;#if showChildrenNavItems&amp;gt;
							&amp;lt;#assign toggle_text&amp;gt;
								&amp;lt;@liferay.language key=&amp;quot;toggle&amp;quot; /&amp;gt;
							&amp;lt;/#assign&amp;gt;

							&amp;lt;div class=&amp;quot;btn-group&amp;quot;&amp;gt;
						&amp;lt;/#if&amp;gt;

						&amp;lt;a class=&amp;quot;${nav_item_css_class} btn btn-secondary&amp;quot; ${nav_item_href_link}&amp;gt;&amp;lt;span&amp;gt;${navItem.getName()}&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;

						&amp;lt;#if showChildrenNavItems&amp;gt;
							&amp;lt;button aria-expanded=&amp;quot;false&amp;quot; aria-haspopup=&amp;quot;true&amp;quot; class=&amp;quot;${nav_item_css_class} btn btn-secondary c-px-2 dropdown-toggle&amp;quot; data-toggle=&amp;quot;liferay-dropdown&amp;quot; type=&amp;quot;button&amp;quot;&amp;gt;
								&amp;lt;@liferay_aui.icon
									image=&amp;quot;angle-down&amp;quot;
									markupView=&amp;quot;lexicon&amp;quot;
								/&amp;gt;

								&amp;lt;span class='sr-only'&amp;gt;${toggle_text}&amp;lt;/span&amp;gt;
							&amp;lt;/button&amp;gt;

							&amp;lt;ul aria-expanded=&amp;quot;false&amp;quot; class=&amp;quot;child-menu dropdown-menu&amp;quot; role=&amp;quot;menu&amp;quot;&amp;gt;
								&amp;lt;@buildChildrenNavItems
									displayDepth=displayDepth
									navItem=navItem
								/&amp;gt;
							&amp;lt;/ul&amp;gt;

							&amp;lt;/div&amp;gt;
						&amp;lt;/#if&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/#if&amp;gt;
			&amp;lt;/#list&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/div&amp;gt;

	&amp;lt;@liferay_aui.script use=&amp;quot;liferay-navigation-interaction&amp;quot;&amp;gt;
		var navigation = A.one('#${navbarId}');

		Liferay.Data.NAV_INTERACTION_LIST_SELECTOR = '.navbar-site';
		Liferay.Data.NAV_LIST_SELECTOR = '.navbar-site';

		if (navigation) {
			navigation.plug(Liferay.NavigationInteraction);
		}
	&amp;lt;/@&amp;gt;
&amp;lt;/#if&amp;gt;


&amp;lt;style&amp;gt;
	.split-button-dropdowns {
		display:flex;
		flex-direction:column;
		}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Mohammed Yasin</dc:creator>
    <dc:date>2022-04-29T08:42:51Z</dc:date>
  </entry>
  <entry>
    <title>Menu Display template: Responsive side nav with toggle dropdown</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121410941" />
    <author>
      <name>Lena Morawietz</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121410941</id>
    <updated>2022-04-28T15:44:54Z</updated>
    <published>2022-04-28T13:32:02Z</published>
    <summary type="html">&lt;p&gt;Hey,&lt;/p&gt;
&lt;p&gt;I'm having difficulties understanding Freemarker in the Menu Display
  Template and would like to ask if there is someone who has a template
  where the side nav is vertical and dropdowns with the sublinks show
  when you click on an arrow.&lt;/p&gt;
&lt;p&gt;Basically just like the side nav from Liferay itself. &lt;/p&gt;
&lt;p&gt;Has someone programmed this already?&lt;/p&gt;
&lt;p&gt;It would be the order of &amp;quot;List Menu&amp;quot;,  but with the link
  style like &amp;quot;Split Button Dropdowns&amp;quot; and the subsites are
  open and closable.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;P.s.: Where is a full list/documentation of classes you could use in templates?&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Lena Morawietz</dc:creator>
    <dc:date>2022-04-28T13:32:02Z</dc:date>
  </entry>
</feed>
