diff --git a/preview-src/ui-model.yml b/preview-src/ui-model.yml index 6e18601f..1a85dfaf 100644 --- a/preview-src/ui-model.yml +++ b/preview-src/ui-model.yml @@ -8,8 +8,22 @@ site: navGroups: | [ { "title": "Server", "startPage": "home::server.adoc", "components": ["server", "*-connector"], "url": "/index.html" }, - { "title": "Mobile", "startPage": "home::mobile.adoc", "components": ["couchbase-lite", "sync-gateway"], "url": "#" }, - { "title": "Cloud", "startPage": "home::cloud.adoc", "components": ["operator"], "url": "#" } + { "title": "Develop", + "subPages": [ + { + "title": "Mobile", + "startPage": "home::mobile.adoc", + "components": ["couchbase-lite", "sync-gateway"], + "url": "#" + }, + { + "title": "Cloud", + "startPage": "home::cloud.adoc", + "components": ["operator"], + "url": "#" + } + ] + } ] components: server: diff --git a/src/css/header.css b/src/css/header.css index 6c644910..427042b3 100644 --- a/src/css/header.css +++ b/src/css/header.css @@ -89,6 +89,18 @@ padding: var(--base-extra-small-space) var(--base-space); } +.navbar-nav .nav-item .nav-submenu { + display: none; + padding-inline-start: 0; + position: absolute; + background-color: #333; /* var(--color-brand-black); */ + z-index: 1000; +} + +.navbar-nav .nav-item:hover .nav-submenu { + display: block; +} + .navbar-nav .nav-link { color: var(--color-brand-white); text-transform: uppercase; @@ -217,11 +229,23 @@ left: -0.75em; } -.nav-item-selected { +.nav-item-selected, +.nav-submenu-item-selected, +.nav-item-selected:hover .nav-submenu-item:hover { background-color: var(--color-brand-red); } -.Columnar .nav-item-selected { +.nav-item-selected:hover { + background-color: inherit; +} + +.nav-item-selected:hover .nav-submenu-item-selected { + background-color: #f99; +} + +.Columnar .nav-item-selected, +.Columnar .nav-submenu-item-selected, +.nav-item-selected:hover .Columnar .nav-submenu-item:hover { background-color: var(--color-brand-caution); } diff --git a/src/helpers/nav-group-for-page.js b/src/helpers/nav-group-for-page.js index 49753fdd..cda2a345 100644 --- a/src/helpers/nav-group-for-page.js +++ b/src/helpers/nav-group-for-page.js @@ -9,9 +9,23 @@ module.exports = ( } ) => { const pageUrl = page.url - const navGroupByUrl = navGroups.find(({ url }) => url === pageUrl) - if (navGroupByUrl) return navGroupByUrl + + const navGroupsAndSubgroups = [ + ...navGroups, + ...navGroups.flatMap(({ subGroups }) => subGroups || [])] + + const navGroupByUrl = + navGroupsAndSubgroups.find(({ url }) => url === pageUrl) + + if (navGroupByUrl) { + return navGroupByUrl + } + const pageComponentName = page.component.name - if (pageComponentName === 'home' && page.module !== 'contribute') return - return navGroups.find(({ components }) => ~components.indexOf(pageComponentName)) + if (pageComponentName === 'home' && page.module !== 'contribute') { + return + } + + return navGroupsAndSubgroups.find( + ({ components }) => ~components.indexOf(pageComponentName)) } diff --git a/src/helpers/nav-group-selected.js b/src/helpers/nav-group-selected.js index 1a4151ff..ed662502 100644 --- a/src/helpers/nav-group-selected.js +++ b/src/helpers/nav-group-selected.js @@ -19,5 +19,6 @@ module.exports = module.exports = (navGroup, { function selected (navGroup, page) { return (navGroup.url === page?.url) || - (navGroup.components?.includes(page.component?.name)) + (navGroup.components?.includes(page.component?.name)) || + (navGroup.subGroups?.some((it) => selected(it, page))) } diff --git a/src/helpers/nav-groups.js b/src/helpers/nav-groups.js index af6e7393..61e179be 100644 --- a/src/helpers/nav-groups.js +++ b/src/helpers/nav-groups.js @@ -9,25 +9,35 @@ module.exports = ({ if (!navGroups) return [] if (navGroups._compiled) return navGroups + navGroups = JSON.parse(navGroups) const components = site.components const componentNames = Object.keys(components) - const claimed = [] + const claimed = [] // mutable array to track claimed components - navGroups = JSON.parse(navGroups).map((navGroup) => { + function processNavGroup (navGroup) { const componentNamesInGroup = (navGroup.components || []).flatMap( + // componentNamesInGroup can be a name like 'couchbase-lite' + // or a glob pattern like '*-sdk' (componentName) => componentNames.filter(globbify(componentName))) claimed.push(...componentNamesInGroup) + const navSubgroups = navGroup.subGroups?.map(processNavGroup) + if (navSubgroups) { + navGroup.subGroups = navSubgroups + console.log(navSubgroups) + } + return compileNavGroup( navGroup, componentNamesInGroup, contentCatalog, components) - }) + } + navGroups = navGroups.map(processNavGroup) const orphaned = componentNames.filter((it) => !claimed.includes(it)) if (orphaned.length) { diff --git a/src/partials/header-content.hbs b/src/partials/header-content.hbs index 87e5dec7..42e0baa0 100644 --- a/src/partials/header-content.hbs +++ b/src/partials/header-content.hbs @@ -42,7 +42,7 @@ {{#each this}} - {{#if ./url}} + {{#if (or ./url ./subGroups)}}