From 94358f7700feb07c8083e755ae0b568b2a56cfbf Mon Sep 17 00:00:00 2001 From: Ze Yu Date: Fri, 30 Apr 2021 12:50:32 +0800 Subject: [PATCH 01/14] Use portals for mobile site and page nav --- packages/core/src/html/NodeProcessor.js | 4 +- ...rocessor.js => siteAndPageNavProcessor.js} | 21 +++++++ packages/vue-components/package.json | 1 + packages/vue-components/src/Navbar.vue | 5 -- packages/vue-components/src/Overlay.vue | 59 ++++--------------- packages/vue-components/src/OverlaySource.vue | 38 ++++++++++++ packages/vue-components/src/PageNavButton.vue | 32 +++------- packages/vue-components/src/SiteNavButton.vue | 23 +++----- packages/vue-components/src/index.js | 2 + 9 files changed, 95 insertions(+), 90 deletions(-) rename packages/core/src/html/{siteNavProcessor.js => siteAndPageNavProcessor.js} (79%) create mode 100644 packages/vue-components/src/OverlaySource.vue diff --git a/packages/core/src/html/NodeProcessor.js b/packages/core/src/html/NodeProcessor.js index 5c6e2de08d..f452d64343 100644 --- a/packages/core/src/html/NodeProcessor.js +++ b/packages/core/src/html/NodeProcessor.js @@ -9,7 +9,7 @@ _.cloneDeep = require('lodash/cloneDeep'); _.has = require('lodash/has'); _.find = require('lodash/find'); -const { renderSiteNav } = require('./siteNavProcessor'); +const { renderSiteNav, addSitePageNavPortal } = require('./siteAndPageNavProcessor'); const { processInclude, processPanelSrc } = require('./includePanelProcessor'); const { Context } = require('./Context'); const linkProcessor = require('./linkProcessor'); @@ -297,6 +297,8 @@ class NodeProcessor { this.postProcessNode(node); + addSitePageNavPortal(node); + if (isHeadingTag && !node.attribs.id) { // do this one more time, in case the first one assigned a blank id setHeadingId(node, this.config); diff --git a/packages/core/src/html/siteNavProcessor.js b/packages/core/src/html/siteAndPageNavProcessor.js similarity index 79% rename from packages/core/src/html/siteNavProcessor.js rename to packages/core/src/html/siteAndPageNavProcessor.js index 97861da5a6..1830987df6 100644 --- a/packages/core/src/html/siteNavProcessor.js +++ b/packages/core/src/html/siteAndPageNavProcessor.js @@ -28,6 +28,7 @@ function renderSiteNav(node) { const nestingLevel = $(ulElem).parents('ul').length; $(ulElem).addClass(SITE_NAV_LIST_CLASS); if (nestingLevel === 0) { + $(ulElem).attr('mb-site-nav', true); $(ulElem).addClass(SITE_NAV_LIST_CLASS_ROOT); } const listItemLevelClass = `${SITE_NAV_LIST_ITEM_CLASS}-${nestingLevel}`; @@ -70,6 +71,26 @@ function renderSiteNav(node) { $original.append($('site-nav').children()); } +function addOverlayPortalSource(node, to) { + node.attribs['tag-name'] = node.name; + node.attribs.to = to; + node.name = 'overlay-source'; +} + +/** + * Wrap id="site/page-nav" with a vue component. + * This component portals said element into the mobile navbar menus as needed. + */ +function addSitePageNavPortal(node) { + if (node.attribs.id === 'site-nav' || node.attribs.id === 'page-nav' || node.attribs.id === 'mb-page-nav') { + addOverlayPortalSource(node, node.attribs.id); + } else if (node.attribs['mb-site-nav']) { + addOverlayPortalSource(node, 'mb-site-nav'); + delete node.attribs['mb-site-nav']; + } +} + module.exports = { renderSiteNav, + addSitePageNavPortal, }; diff --git a/packages/vue-components/package.json b/packages/vue-components/package.json index 6853d553b4..58cfbcc0fc 100644 --- a/packages/vue-components/package.json +++ b/packages/vue-components/package.json @@ -40,6 +40,7 @@ "eslint-plugin-vue": "^7.9.0", "jest": "^26.1.0", "jest-serializer-vue": "^2.0.2", + "portal-vue": "^2.1.7", "vue-jest": "^3.0.6", "vue-loader": "^15.9.3" }, diff --git a/packages/vue-components/src/Navbar.vue b/packages/vue-components/src/Navbar.vue index 7d7df6d91b..8b941d36af 100644 --- a/packages/vue-components/src/Navbar.vue +++ b/packages/vue-components/src/Navbar.vue @@ -70,11 +70,6 @@ export default { default: 'sibling-or-child', }, }, - provide() { - return { - toggleLowerNavbar: this.toggleLowerNavbar, - }; - }, data() { return { id: 'bs-example-navbar-collapse-1', diff --git a/packages/vue-components/src/Overlay.vue b/packages/vue-components/src/Overlay.vue index c0060aec87..f81b054e0b 100644 --- a/packages/vue-components/src/Overlay.vue +++ b/packages/vue-components/src/Overlay.vue @@ -7,52 +7,31 @@
- -
+
diff --git a/packages/vue-components/src/PageNavButton.vue b/packages/vue-components/src/PageNavButton.vue index ae8a4af174..a3cbee42f5 100644 --- a/packages/vue-components/src/PageNavButton.vue +++ b/packages/vue-components/src/PageNavButton.vue @@ -2,10 +2,7 @@