novicell-frontend icon indicating copy to clipboard operation
novicell-frontend copied to clipboard

CSS for backoffice

Open Dan9boi opened this issue 5 years ago • 11 comments

How could we do CSS for eg. styling Umbraco Grid in the backoffice?

Requirements:

A way of adding PostCss plugins for only some bundles - Eg. postcss-prefix for prefixing all classes.

Suggestion:

Add a flag to the style-task like:

npm run styles -- -prefix

Or maybe a way of adding bundles of CSS and defining which plugins they use...

Dan9boi avatar Sep 02 '19 12:09 Dan9boi

Awesome! It would be even better if the generated file is a separate file, also just deployed to the dist folder. That way, whenever a new release in the FE project is submitted, the pipeline for the implementation project just pulls in the dist folder, and nobody has to do manual copy / paste of files.

hesselberg avatar Sep 02 '19 13:09 hesselberg

When creating SPA solutions, where umbraco is just used as a content repo, umbraco (or other CMS) can be in a different solution, thus not having the ability to shared frontend code.

This is how many of the solutions in Commerce are being build these days. Please consider this when implementing new features.

soreng avatar Sep 02 '19 14:09 soreng

@soreng exactly -- in the most recent project in our team we've kept the split between our FE repo and Umbraco repo, even though there's no SPA. The Umbraco repo just pulls in the FE as a submodule when building, copying in the dist folder.

hesselberg avatar Sep 02 '19 15:09 hesselberg

...and this repository is for "non-SPA" anyways, but thanks for the concideration @soreng 💯

Dan9boi avatar Sep 02 '19 15:09 Dan9boi

@hesselberg did you try the "not-so-elegant-but-still-may-work"-solution, adding CSS like this in the backoffice.css:

.umbraco-backoffice {
  @import '../_base/_normalize.css';
  @import '../_base/_variables.css';
  @import '../_base/_base.css';
  @import '../_base/_fonts.css';
  @import '../_base/_grid.css';
}

For doing the nesting, without using a postcss-plugin...

Dan9boi avatar Sep 02 '19 15:09 Dan9boi

@Dan9boi I didn't, but thats more a case of the backoffice.css not being processed by postcss. This means that the imports will be stay as they are, rather than being inlined.

This on top of the us nesting things and then with the postcss-nested module rewriting it not to be nested, causes a lot of headaches.

Again for our current setup we keep the FE repo and the BE repo separate :-)

hesselberg avatar Sep 02 '19 15:09 hesselberg

@Dan9boi in case of that we use the Novicell frontend package for a non Umbraco site, how would this then work? It would either mean that we generate extra stylesheets that will never be used, or, you have to remember to generate the stylesheets every time.

Also, if the Umbraco setups are different, (for instance if one uses the Doc Type Grid Editor, and one doesn't), it also changes the styles and the markup.

hesselberg avatar Jan 07 '20 11:01 hesselberg

You can just decide to only make a new css module (css file in modules folder) that includes the suggested stuff, and you could nest it in whatever - doesn't need to be an umbraco selector... Maybe just:

.backoffice {
  @import '../_base/_normalize.css';
  @import '../_base/_variables.css';
  @import '../_base/_base.css';
  @import '../_base/_fonts.css';
  @import '../_base/_grid.css';
}

Dan9boi avatar Jan 07 '20 12:01 Dan9boi

If you have a better solution to the problem, please bring ideas :)

Dan9boi avatar Jan 07 '20 12:01 Dan9boi

I actually did set up a stylesheet being generated specifically for the Umbraco grid, but also the RTE.

First I added postcss-prefixwrap and postcss-import-ext-glob as devDependencies.

I created new postcss config files, similar to the normal one but also including the following plugins:

require("postcss-import-ext-glob")
require("postcss-prefixwrap")(".umb-cell-content")

Then, a few changes to the package.json file:

"config": {
    "DIST": "dist",
    "CSS_MODULES": "src/modules/*.css",
    "CSS_MODULES_UMBRACO_GRID": "src/modules/umbraco/umbraco-grid-master.css",
    "CSS_MODULES_UMBRACO_RTE": "src/modules/umbraco/umbraco-rte-master.css"
  },

"scripts": {
    "styles": "cross-env-shell postcss $npm_package_config_CSS_MODULES --dir $npm_package_config_DIST/css --ext min.css --config config/styles && npm run styles:umbraco",
    "styles:umbraco": "cross-env-shell postcss $npm_package_config_CSS_MODULES_UMBRACO_GRID --dir $npm_package_config_DIST/css --ext min.css --config config/styles-umbraco-grid && cross-env-shell postcss $npm_package_config_CSS_MODULES_UMBRACO_RTE --dir $npm_package_config_DIST/css --ext min.css --config config/styles-umbraco-rte",
}

This will also compile the umbraco stylesheets when running the default styles script.

Finally an example of the umbraco-grid-master.css:

/* Settings */
@import "../../_base/_normalize.css";
@import "../../_base/_variables.css";
@import "../../_base/_fonts.css";
@import "../../_base/_grid.css";
@import "../../_base/_typography.css";
@import "../../_base/_helpers.css";
@import "../../_base/_themes.css";

/* Atoms */
@import-glob '../../01-atoms/**/*.css';

/* Molecules */
@import-glob '../../02-molecules/**/*.css';

/* Organisms */
@import-glob '../../03-organisms/**/*.css';

/* Everything from the base stylesheet, wrapped in a body tag */
body {
... 
}

The result is a minified css file, with a prefix on all classes (and the styling of everything inside the body).

This works well because I know how to target my output, but this wouldn't work for a Premium setup, as the Premium uses two different outputs for the razor. One for the backoffice, and one for the transformed components.

TL;DR The above is a good way of having CSS for the backoffice, but it modifies the styles script, and generates extra css files that aren't necessary.

It also doesn't work for Novicell Premium, unless you are using the Novicell Premium frontend, and not a custom frontend.

Perhaps this should potentially be added as a guide, rather than a part of the normal repository?

hesselberg avatar Jan 07 '20 13:01 hesselberg

@hesselberg Any news on this? did you go with this approach or make something else? Either way, please share the guide or code :)

Dan9boi avatar Aug 14 '20 08:08 Dan9boi