Maintaining themes
This section contains documentation about how to maintain and create a theme.
You may also check out the section about how to use a theme in your application.
- Maintaining themes
 
Basis information
The default DNB brand theme is called: ui which stands for universal identity.
The building blocks
A theme consists of several files, which again includes SASS import declarations to single component styles.
To include new or update component themes, run yarn build.
It will find all related theme styles and put it inside the main theme file so they can get compiled to one CSS bundle.
Defining a fallback
Depending on the need of a theme, you can define a fallback to another theme.
It will use that fallback theme as a basis, but use your new theme styles instead – as soon as one exists with the same name.
Define a fallback inside a theme set:
dnb-eufemia/src/style/themes/theme-sbanken/sbanken-theme-components.scss
/*** ATTENTION: This file is auto generated by using "themeFactory".* But you still can change the content of this file on the very top.*/$THEME_FALLBACK: 'ui';/*** NB: The content below is auto generated by the "themeFactory".* You may want to update it by running "yarn build" locally.*/@import '<auto-generated>/dnb-button-theme-ui.scss';
and as soon as e.g. dnb-button-theme-sbanken.scss exists – it will be used instead of dnb-button-theme-ui.scss.
Main theming file
There is one Main Theme File, that includes all properties and element styles:
dnb-eufemia/src/style/themes/theme-ui/ui-theme-basis.scss
Creating a new main theme
First, duplicate or create new SCSS files:
dnb-eufemia/src/style/themes/theme-<YOUR-THEME>/<YOUR-THEME>-theme-basis.scss
Do the same with every component (button etc.) you want to customize:
dnb-eufemia/src/components/button/style/themes/dnb-button-theme-<YOUR-THEME>.scss
and run yarn build. All the related component theme file will then be created or updated.
Run the Portal with a different theme
What theme gets imported is handled in the Gatsby Plugin gatsby-plugin-eufemia-theme-handler.
- In the Portal Tools you can switch to a different theme (runtime).
 - You can also define a different theme in the url itself 
path/?eufemia-theme=eiendom(runtime). - Change the theme 
defaultThemename in the plugin options insidegatsby-config(build-time). - Create a new 
/packages/dnb-design-system-portal/.envfile that includes e.g.GATSBY_EUFEMIA_THEME=eiendom(build-time). 
Show theme tag in Portal
Add the property theme: 'sbanken' to the main .mdx file for a Portal page to show a tag next to it when that theme is selected. This is currently mainly intended for Sbanken.
Example: /docs/components/button.mdx
---title: 'Button'description: 'The Button component should be used as the primary call-to-action in a form, or as a user interaction mechanism.'showTabs: truetheme: 'sbanken'---
Component theming
All components have a style separation of:
- layout where positioning and raw shapes are defined.
 - skinning where colors and peculiarity are defined.
 
This way we can create more easily custom skinned themes.
Button as an example
- All the raw layout related CSS properties are in this one file 
dnb-button.scss. - While the theme file 
dnb-button-theme-ui.scsscontains colorization and font sizes (skinning). 
/button/style/dnb-button.scss // layout styles/button/style/themes/dnb-button-theme-ui.scss // main theme styles/button/style/themes/dnb-button-theme-eiendom.scss// additional theme styles
How eiendom is set up does not matter. It could either import parts from ui or be maintained independently.
CSS custom properties and :root
Whenever possible use Eufemia Properties inside Eufemia components.
When defining custom properties for a component, prefer to put them inside the component scope:
.dnb-button {--text-size: var(--font-size-medium);}
In some circumstances, you may make them share-able and place them inside :root. They should then contain the component-name as a prefix.
Local Theming setup
There are several solutions to create a new theme. One of which is by using the linking feature of Yarn.
yarn link and SASS
Make sure your project can handle *.scss files.
1. make a copy of the repository. Place it somewhere locally on your machine
2. change your command line (Terminal) directory to the sub package @dnb/eufemia (eufemia/packages/eufemia)
3. make the package ready for development by running:
$ yarn install && yarn build && yarn link
4. on your application root directory, run:
$ yarn link "@dnb/eufemia"
5. That's it. Now you can use (import/require) the NPM module in your application like:
import { Button } from 'dnb-eufemia/components'// See the "src" in the path?import 'dnb-eufemia/src/style/themes/theme-ui/ui-theme-[MY THEME].scss'
6. Don't forget to add "@dnb/eufemia": "*" with the respective version (alongside React) to your dependencies:
"dependencies": {"@dnb/eufemia": "x","react": "x","react-dom": "x",...}
Chrome Extension: Eufemia Theme Manager
Use the Chrome Browser Extension to:
- test themes on web applications
 - create new possible themes
 - look how the outcome would be if a theme would be used
 - and create areas where a different or a modified theme would make more sense
 
You can also download the Chrome Browser Extension (ZIP), and install it manually in your browser. To do so, go to chrome://extensions and drag & drop the downloaded ZIP file in the opened extensions tab.
Contributions are welcome. Heres the source code.