Horizontal Menu
Top navigation with popover submenus — the persistent site navigation for a screen set.


Reach for it when you need:
- The main navigation bar of a project
Component name: HorizontalMenu · Category: Navigation
In the palette: Top navigation with popover submenus
Properties
Any property can be bound to a tag, another component's property, or a query.
| Property | Type | Default | Description |
|---|---|---|---|
menu | array | [{"label":"Dashboard","icon":"LayoutDashboard","link":{"path… (truncated) | — |
↳ menu.label | string | New Item | — |
↳ menu.key | string | "" | Stable id for this item, available to the Menu item click event as {{item.key}}. |
↳ menu.icon | icon | Circle | Lucide icon name |
↳ menu.description | string | "" | — |
↳ menu.visible | boolean | true | Off = the item is removed entirely and leaves no space. 1.0.8 |
↳ menu.disabled | boolean | false | Grey the item out and block clicks (and, for a group, opening it). Applies to its sub-items too. 1.0.8 |
↳ menu.position | number | — | Sort order within this level (lower first). Empty = its place in the list. 1.0.8 |
↳ menu.pin | enum | start | start = with the rest; end = parked at the far end (bottom of a vertical menu, right of a horizontal one). Options: start · end. |
↳ menu.link | object | {} | — 1.0.8 |
↳ menu.link.path | string | "" | — 1.0.8 |
↳ menu.link.linkType | enum | auto | auto = detect from the path; internal = a project route (SPA navigation); external = a URL outside the app. Options: auto · internal · external. 1.0.8 |
↳ menu.link.openIn | enum | auto | auto = same tab for an internal route, new tab for an external URL. Options: auto · same · new. 1.0.8 |
↳ menu.normal | object | {} | Resting text and background colour. 1.0.8 |
↳ menu.normal.color | color | "" | — 1.0.8 |
↳ menu.normal.backgroundColor | color | transparent | — 1.0.8 |
↳ menu.hover | object | {} | — 1.0.8 |
↳ menu.hover.color | color | hsl(var(--foreground)) | — 1.0.8 |
↳ menu.hover.backgroundColor | color | rgba(161, 161, 170, 0.1) | — 1.0.8 |
↳ menu.active | object | {} | Colours while the item is the current page. 1.0.8 |
↳ menu.active.color | color | hsl(var(--foreground)) | — 1.0.8 |
↳ menu.active.backgroundColor | color | rgba(161, 161, 170, 0.15) | — 1.0.8 |
↳ menu.font | object | {} | — |
↳ menu.font.fontSize | number | — | — |
↳ menu.font.fontWeight | enum | — | Options: normal · bold · semibold · medium · light. |
↳ menu.font.fontStyle | enum | — | Options: normal · italic. |
↳ menu.font.textAlign | enum | — | Options: left · center · right. |
↳ menu.font.letterSpacing | number | — | — |
↳ menu.font.lineHeight | number | — | — |
↳ menu.font.textDecoration | enum | — | Options: none · underline · line-through. |
↳ menu.font.textTransform | enum | — | Options: none · uppercase · lowercase · capitalize. |
↳ menu.badge | object | {"value":"","fontColor":"","fontSize":10,"backgroundColor":"… (truncated) | — |
↳ menu.badge.value | string | "" | — |
↳ menu.badge.fontColor | color | "" | — |
↳ menu.badge.fontSize | number | 10 | — |
↳ menu.badge.backgroundColor | color | "" | — |
↳ menu.gap | number | 4 | — |
↳ menu.security | object | {} | Optional role gating for this item. Leave roles empty = visible to everyone. |
↳ menu.security.requiredRoles | roles | [] | Pick the roles allowed to see this item (from the bound User Database). Empty = shown to everyone. |
↳ menu.security.roleMatch | enum | any | any = holds at least one role; all = holds every listed role. Options: any · all. |
↳ menu.security.denyBehavior | enum | hide | hide = remove the item; disable = grey it out and block clicks. Options: hide · disable. |
↳ menu.subMenu | array | [] | — |
↳ menu.subMenu.label | string | New Item | — |
↳ menu.subMenu.key | string | "" | Stable id for this item, available to the Menu item click event as {{item.key}}. |
↳ menu.subMenu.icon | icon | Circle | Lucide icon name |
↳ menu.subMenu.description | string | "" | — |
↳ menu.subMenu.visible | boolean | true | Off = the item is removed entirely and leaves no space. 1.0.8 |
↳ menu.subMenu.disabled | boolean | false | Grey the item out and block clicks (and, for a group, opening it). Applies to its sub-items too. 1.0.8 |
↳ menu.subMenu.position | number | — | Sort order within this level (lower first). Empty = its place in the list. 1.0.8 |
↳ menu.subMenu.link | object | {} | — 1.0.8 |
↳ menu.subMenu.link.path | string | "" | — 1.0.8 |
↳ menu.subMenu.link.linkType | enum | auto | auto = detect from the path; internal = a project route (SPA navigation); external = a URL outside the app. Options: auto · internal · external. 1.0.8 |
↳ menu.subMenu.link.openIn | enum | auto | auto = same tab for an internal route, new tab for an external URL. Options: auto · same · new. 1.0.8 |
↳ menu.subMenu.normal | object | {} | Resting text and background colour. 1.0.8 |
↳ menu.subMenu.normal.color | color | "" | — 1.0.8 |
↳ menu.subMenu.normal.backgroundColor | color | transparent | — 1.0.8 |
↳ menu.subMenu.hover | object | {} | — 1.0.8 |
↳ menu.subMenu.hover.color | color | hsl(var(--foreground)) | — 1.0.8 |
↳ menu.subMenu.hover.backgroundColor | color | rgba(161, 161, 170, 0.1) | — 1.0.8 |
↳ menu.subMenu.active | object | {} | Colours while the item is the current page. 1.0.8 |
↳ menu.subMenu.active.color | color | hsl(var(--foreground)) | — 1.0.8 |
↳ menu.subMenu.active.backgroundColor | color | rgba(161, 161, 170, 0.15) | — 1.0.8 |
↳ menu.subMenu.font | object | {} | — |
↳ menu.subMenu.font.fontSize | number | — | — |
↳ menu.subMenu.font.fontWeight | enum | — | Options: normal · bold · semibold · medium · light. |
↳ menu.subMenu.font.fontStyle | enum | — | Options: normal · italic. |
↳ menu.subMenu.font.textAlign | enum | — | Options: left · center · right. |
↳ menu.subMenu.font.letterSpacing | number | — | — |
↳ menu.subMenu.font.lineHeight | number | — | — |
↳ menu.subMenu.font.textDecoration | enum | — | Options: none · underline · line-through. |
↳ menu.subMenu.font.textTransform | enum | — | Options: none · uppercase · lowercase · capitalize. |
↳ menu.subMenu.badge | object | {"value":"","fontColor":"","fontSize":10,"backgroundColor":"… (truncated) | — |
↳ menu.subMenu.badge.value | string | "" | — |
↳ menu.subMenu.badge.fontColor | color | "" | — |
↳ menu.subMenu.badge.fontSize | number | 10 | — |
↳ menu.subMenu.badge.backgroundColor | color | "" | — |
↳ menu.subMenu.gap | number | 4 | — |
↳ menu.subMenu.security | object | {} | Optional role gating for this item. Leave roles empty = visible to everyone. |
↳ menu.subMenu.security.requiredRoles | roles | [] | Pick the roles allowed to see this item (from the bound User Database). Empty = shown to everyone. |
↳ menu.subMenu.security.roleMatch | enum | any | any = holds at least one role; all = holds every listed role. Options: any · all. |
↳ menu.subMenu.security.denyBehavior | enum | hide | hide = remove the item; disable = grey it out and block clicks. Options: hide · disable. |
↳ menu.subMenu.subMenu | array | [] | — |
↳ menu.subMenu.subMenu.label | string | New Item | — |
↳ menu.subMenu.subMenu.key | string | "" | Stable id for this item, available to the Menu item click event as {{item.key}}. |
↳ menu.subMenu.subMenu.icon | icon | Circle | Lucide icon name |
↳ menu.subMenu.subMenu.description | string | "" | — |
↳ menu.subMenu.subMenu.visible | boolean | true | Off = the item is removed entirely and leaves no space. 1.0.8 |
↳ menu.subMenu.subMenu.disabled | boolean | false | Grey the item out and block clicks (and, for a group, opening it). Applies to its sub-items too. 1.0.8 |
↳ menu.subMenu.subMenu.position | number | — | Sort order within this level (lower first). Empty = its place in the list. 1.0.8 |
↳ menu.subMenu.subMenu.link | object | {} | — 1.0.8 |
↳ menu.subMenu.subMenu.link.path | string | "" | — 1.0.8 |
↳ menu.subMenu.subMenu.link.linkType | enum | auto | auto = detect from the path; internal = a project route (SPA navigation); external = a URL outside the app. Options: auto · internal · external. 1.0.8 |
↳ menu.subMenu.subMenu.link.openIn | enum | auto | auto = same tab for an internal route, new tab for an external URL. Options: auto · same · new. 1.0.8 |
↳ menu.subMenu.subMenu.normal | object | {} | Resting text and background colour. 1.0.8 |
↳ menu.subMenu.subMenu.normal.color | color | "" | — 1.0.8 |
↳ menu.subMenu.subMenu.normal.backgroundColor | color | transparent | — 1.0.8 |
↳ menu.subMenu.subMenu.hover | object | {} | — 1.0.8 |
↳ menu.subMenu.subMenu.hover.color | color | hsl(var(--foreground)) | — 1.0.8 |
↳ menu.subMenu.subMenu.hover.backgroundColor | color | rgba(161, 161, 170, 0.1) | — 1.0.8 |
↳ menu.subMenu.subMenu.active | object | {} | Colours while the item is the current page. 1.0.8 |
↳ menu.subMenu.subMenu.active.color | color | hsl(var(--foreground)) | — 1.0.8 |
↳ menu.subMenu.subMenu.active.backgroundColor | color | rgba(161, 161, 170, 0.15) | — 1.0.8 |
↳ menu.subMenu.subMenu.font | object | {} | — |
↳ menu.subMenu.subMenu.font.fontSize | number | — | — |
↳ menu.subMenu.subMenu.font.fontWeight | enum | — | Options: normal · bold · semibold · medium · light. |
↳ menu.subMenu.subMenu.font.fontStyle | enum | — | Options: normal · italic. |
↳ menu.subMenu.subMenu.font.textAlign | enum | — | Options: left · center · right. |
↳ menu.subMenu.subMenu.font.letterSpacing | number | — | — |
↳ menu.subMenu.subMenu.font.lineHeight | number | — | — |
↳ menu.subMenu.subMenu.font.textDecoration | enum | — | Options: none · underline · line-through. |
↳ menu.subMenu.subMenu.font.textTransform | enum | — | Options: none · uppercase · lowercase · capitalize. |
↳ menu.subMenu.subMenu.badge | object | {"value":"","fontColor":"","fontSize":10,"backgroundColor":"… (truncated) | — |
↳ menu.subMenu.subMenu.badge.value | string | "" | — |
↳ menu.subMenu.subMenu.badge.fontColor | color | "" | — |
↳ menu.subMenu.subMenu.badge.fontSize | number | 10 | — |
↳ menu.subMenu.subMenu.badge.backgroundColor | color | "" | — |
↳ menu.subMenu.subMenu.gap | number | 4 | — |
↳ menu.subMenu.subMenu.security | object | {} | Optional role gating for this item. Leave roles empty = visible to everyone. |
↳ menu.subMenu.subMenu.security.requiredRoles | roles | [] | Pick the roles allowed to see this item (from the bound User Database). Empty = shown to everyone. |
↳ menu.subMenu.subMenu.security.roleMatch | enum | any | any = holds at least one role; all = holds every listed role. Options: any · all. |
↳ menu.subMenu.subMenu.security.denyBehavior | enum | hide | hide = remove the item; disable = grey it out and block clicks. Options: hide · disable. |
↳ menu.subMenu.subMenu.subMenu | array | [] | — |
↳ menu.subMenu.subMenu.subMenu.label | string | New Item | — |
↳ menu.subMenu.subMenu.subMenu.key | string | "" | Stable id for this item, available to the Menu item click event as {{item.key}}. |
↳ menu.subMenu.subMenu.subMenu.icon | icon | Circle | Lucide icon name |
↳ menu.subMenu.subMenu.subMenu.description | string | "" | — |
↳ menu.subMenu.subMenu.subMenu.visible | boolean | true | Off = the item is removed entirely and leaves no space. 1.0.8 |
↳ menu.subMenu.subMenu.subMenu.disabled | boolean | false | Grey the item out and block clicks (and, for a group, opening it). Applies to its sub-items too. 1.0.8 |
↳ menu.subMenu.subMenu.subMenu.position | number | — | Sort order within this level (lower first). Empty = its place in the list. 1.0.8 |