mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-28 22:43:30 +03:00
Added ability to set <main>
class using route metadata
no issue - modified `ui` service's `routeDidChange` handler to update it's `mainClass` property based on the new route's metadata - used in the future for switching screen background colours To use the feature, modify or add a `buildRouteInfoMetadata` hook in the route which you'd like to change, eg: ```js export default AuthenticatedRoute.extend({ ... buildRouteInfoMetadata() { return { bodyClasses: ['my-body-class'], mainClasses: ['grey-bg'] // <-------- }; } }); ``` The route hierarchy is taken into consideration with classes being added for all currently shown routes. For example if you wanted to add an `editor` class to all editor routes you could use the hook in `routes/editor.js` then if you added an `editor-new` class in `routes/editor/new.js` the resulting HTML output on the "New story" screen would be: ```html <main class="gh-main editor editor-new"> ```
This commit is contained in:
parent
bb7df76af0
commit
da92eadecd
@ -2,22 +2,28 @@ import Service, {inject as service} from '@ember/service';
|
|||||||
import {get} from '@ember/object';
|
import {get} from '@ember/object';
|
||||||
import {not, or, reads} from '@ember/object/computed';
|
import {not, or, reads} from '@ember/object/computed';
|
||||||
|
|
||||||
function updateBodyClasses(transition) {
|
function collectMetadataClasses(transition, prop) {
|
||||||
let oldClasses = [];
|
let oldClasses = [];
|
||||||
let newClasses = [];
|
let newClasses = [];
|
||||||
let {from, to} = transition;
|
let {from, to} = transition;
|
||||||
|
|
||||||
while (from) {
|
while (from) {
|
||||||
oldClasses = oldClasses.concat(get(from, 'metadata.bodyClasses') || []);
|
oldClasses = oldClasses.concat(get(from, `metadata.${prop}`) || []);
|
||||||
from = from.parent;
|
from = from.parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (to) {
|
while (to) {
|
||||||
newClasses = newClasses.concat(get(to, 'metadata.bodyClasses') || []);
|
newClasses = newClasses.concat(get(to, `metadata.${prop}`) || []);
|
||||||
to = to.parent;
|
to = to.parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {oldClasses, newClasses};
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateBodyClasses(transition) {
|
||||||
let {body} = document;
|
let {body} = document;
|
||||||
|
let {oldClasses, newClasses} = collectMetadataClasses(transition, 'bodyClasses');
|
||||||
|
|
||||||
oldClasses.forEach((oldClass) => {
|
oldClasses.forEach((oldClass) => {
|
||||||
body.classList.remove(oldClass);
|
body.classList.remove(oldClass);
|
||||||
});
|
});
|
||||||
@ -34,6 +40,7 @@ export default Service.extend({
|
|||||||
isFullScreen: false,
|
isFullScreen: false,
|
||||||
showMobileMenu: false,
|
showMobileMenu: false,
|
||||||
showSettingsMenu: false,
|
showSettingsMenu: false,
|
||||||
|
mainClass: '',
|
||||||
|
|
||||||
hasSideNav: not('isSideNavHidden'),
|
hasSideNav: not('isSideNavHidden'),
|
||||||
isMobile: reads('mediaQueries.isMobile'),
|
isMobile: reads('mediaQueries.isMobile'),
|
||||||
@ -41,8 +48,12 @@ export default Service.extend({
|
|||||||
|
|
||||||
init() {
|
init() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
|
|
||||||
this.router.on('routeDidChange', (transition) => {
|
this.router.on('routeDidChange', (transition) => {
|
||||||
updateBodyClasses(transition);
|
updateBodyClasses(transition);
|
||||||
|
|
||||||
|
let {newClasses: mainClasses} = collectMetadataClasses(transition, 'mainClasses');
|
||||||
|
this.set('mainClass', mainClasses.join(' '));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
}}
|
}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<main class="gh-main" role="main">
|
<main class="gh-main {{this.ui.mainClass}}" role="main">
|
||||||
{{outlet}}
|
{{outlet}}
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user