summaryrefslogtreecommitdiff
path: root/docs/customization
diff options
context:
space:
mode:
Diffstat (limited to 'docs/customization')
-rw-r--r--docs/customization/build.md162
-rw-r--r--docs/customization/readme.md371
-rw-r--r--docs/customization/theme.md189
3 files changed, 722 insertions, 0 deletions
diff --git a/docs/customization/build.md b/docs/customization/build.md
new file mode 100644
index 00000000..b10fd9db
--- /dev/null
+++ b/docs/customization/build.md
@@ -0,0 +1,162 @@
+# Build Customization
+
+This document provides instructions for how to add environment specific
+modifications to the Web UI.
+
+- [Setup](#setup)
+- [Store](#store)
+- [Router](#router)
+- [App Navigation](#app-navigation)
+- [Theming](#theming)
+- [Local development](#local-development)
+- [Production build](#production-build)
+
+## Setup
+
+1. Create a `.env.<ENV_NAME>` file in the project root
+2. Add `NODE_ENV=production` key value pair in the file
+3. Add `VUE_APP_ENV_NAME` key with the value set to the new environment name
+
+Example `.env.ibm`:
+
+```
+NODE_ENV=production
+VUE_APP_ENV_NAME=ibm
+```
+
+## Store
+
+:::tip
+[Vuex store modules](https://vuex.vuejs.org/guide/modules.html) contain the
+application's API calls.
+:::
+
+1. If making customizations to the default store, add `CUSTOM_STORE=true` key
+ value pair to the new .env file.
+2. Create a `<ENV_NAME>.js` file in `src/env/store`
+ :::danger
+ The filename needs to match the `VUE_APP_ENV_NAME` value defined in the
+ .env file. The store import in `src/main.js` will resolve to this new
+ file.
+ :::
+3. Import the base store
+4. Import environment specific store modules
+5. Use the [Vuex](https://vuex.vuejs.org/api/#registermodule) `registerModule`
+ and `unregisterModule` instance methods to add/remove store modules
+6. Add default export
+
+Example `src/env/store/ibm.js`:
+
+```
+import store from '@/store; //@ aliases to src directory
+import HmcStore from './Hmc/HmcStore';
+
+store.registerModule('hmc', HmcStore);
+
+export default store;
+```
+
+## Router
+
+:::tip
+[Vue Router](https://router.vuejs.org/guide/) determines which pages are
+accessible in the UI.
+:::
+
+1. If making customizations to the default router, add `CUSTOM_ROUTER=true` key
+ value pair to the new .env file.
+2. Create a `<ENV_NAME>.js` file in `src/env/router`
+ :::danger
+ The filename needs to match the `VUE_APP_ENV_NAME` value defined in the
+ .env file. The routes import in `src/router/index.js` will resolve to this
+ new file.
+ :::
+3. Define new [routes](https://router.vuejs.org/api/#routes).
+ :::tip
+ Use static imports (over lazy-loading routes) to avoid creating separate
+ JS chunks. Static imports also helps to keep the total build size down.
+ :::
+4. Add default export
+
+## App navigation
+
+The Vue Router definition is closely tied to the app navigation but should be
+configured separately. The Vue Router is responsible for defining the
+application routes which is not always the same as what is visible in the app
+navigation. This configuration will make customizations to the rendered markup
+in src/components/AppNavigation/AppNavigation.vue.
+
+1. If making customizations to the app navigation, add `CUSTOM_APP_NAV=true` key
+ value pair to the new .env file.
+2. Create a `<ENV_NAME>.js` file in `src/env/components/AppNavigation`
+ :::danger
+ The filename needs to match the `VUE_APP_ENV_NAME` value defined in the
+ .env file. The AppNavigationMixin import in
+ `src/components/AppNavigation/AppNavigation.vue` will resolve to this new
+ file.
+ :::
+3. Your custom mixin should follow a very similar structure to the default
+ AppNavigationMixin.js file. It should include a data property named
+ `navigationItems` that should be an array of of navigation objects. Each
+ navigation object should have an `id` and `label` property defined.
+ Optionally it can include `icon`, `route`, or `children` properties.
+4. Add default export
+
+## Theming
+
+:::tip
+[Bootstrap theming](https://getbootstrap.com/docs/4.5/getting-started/theming/)
+allows for easy visual customizations.
+:::
+
+1. If making customizations to the default styles, add `CUSTOM_STYLES=true` key
+ value pair to the new .env file.
+2. Create a `_<ENV_NAME>.scss` partial in `src/env/assets/styles`
+ :::danger
+ The filename needs to match the `VUE_APP_ENV_NAME` value defined in the
+ .env file. The webpack sass loader will attempt to import a file with this
+ name.
+ :::
+3. Add style customizations. Refer to [bootstrap documentation](https://getbootstrap.com/docs/4.5/getting-started/theming/)
+ for details about [color
+ overrides](https://getbootstrap.com/docs/4.5/getting-started/theming/#variable-defaults)
+ and [other customizable
+ options](https://getbootstrap.com/docs/4.5/getting-started/theming/#sass-options).
+
+Example for adding custom colors
+
+`src/env/assets/styles/_ibm.scss`
+
+```
+// Custom theme colors
+
+$primary: rebeccapurple;
+$success: lime;
+```
+
+## Local development
+
+1. Add the same `VUE_APP_ENV_NAME` key value pair to your
+ `env.development.local` file.
+2. Use serve script
+ ```
+ npm run serve
+ ```
+
+## Production build
+
+Run npm build script with vue-cli `--mode` [option
+flag](https://cli.vuejs.org/guide/mode-and-env.html#modes). This requires
+[corresponding .env file to exist](#setup).
+
+```
+npm run build -- --mode ibm
+```
+
+**OR**
+
+pass env variable directly to script
+
+```
+VUE_APP_ENV_NAME=ibm npm run build
+```
diff --git a/docs/customization/readme.md b/docs/customization/readme.md
new file mode 100644
index 00000000..64118060
--- /dev/null
+++ b/docs/customization/readme.md
@@ -0,0 +1,371 @@
+# Presentation Layer Architecture
+
+This section discusses the structure and purpose of the SCSS files and how to
+customize the application using Bootstrap theming.
+
+[Read more about Bootstrap
+Theming](https://getbootstrap.com/docs/4.0/getting-started/theming)
+
+## SCSS Directory Structure
+
+### `bmc` Directory
+
+The `bmc` directory contains Sass helpers and default styles for customizing the OpenBMC
+Web UI.
+
+```{5}
+.
+├─ src
+ ├─ assets
+ ├─ styles
+ ├─ bmc
+ ├─ custom
+ └─ helpers
+ ├─ bootstrap
+ └─ _obmc-custom.scss
+```
+
+### `custom` Directory
+
+The `custom` Directory imports all the styles needed to customize the UI. These
+are small changes used to reach parity with the OpenBMC Design Workgroup's
+agreed-upon design. The file naming convention closely follows the Bootstrap or
+Boostrap-vue library file naming since most of the ruleset selectors in these
+files are based on these two libraries.
+
+```{6}
+.
+├─ src
+ ├─ assets
+ ├─ styles
+ ├─ bmc
+ ├─ custom
+ ├─ alert.scss
+ ├─ _badge.scss
+ ├─ _base.scss
+ ├─ _bootstrap-grid.scss
+ ├─ _buttons.scss
+ ├─ _calendar.scss
+ ├─ _card.scss
+ ├─ _dropdown.scss
+ ├─ _forms.scss
+ ├─ _index.scss
+ ├─ _kvm.scss
+ ├─ _modal.scss
+ ├─ _pagination.scss
+ ├─ _sol.scss
+ ├─ _tables.scss
+ └─ _toasts.scss
+ ├─ helpers
+ ├─ bootstrap
+ └─ _obmc-custom.scss
+```
+
+### `helpers` Directory
+
+The `helpers` directory contains a set of Sass helper files containing Sass
+variables that establish the custom theme of the application.
+
+```{6}
+.
+├─ src
+ ├─ assets
+ ├─ styles
+ ├─ bmc
+ ├─ helpers
+ ├─ _colors.scss
+ ├─ _functions.scss
+ ├─ _index.scss
+ ├─ _motion.scss
+ └─ _variables.scss
+ ├─ bootstrap
+ └─ _obmc-custom.scss
+```
+
+#### `_colors.scss`
+
+The `_colors.scss` file sets all the SASS variables and color maps for the OpenBMC
+Web UI. Any color settings needed to meet company brand guidelines will happen
+in this file.
+
+##### Sass Color Variables
+
+```scss
+$black: #000;
+$white: #fff;
+
+$blue-500: #2d60e5;
+$green-500: #0a7d06;
+$red-500: #da1416;
+$yellow-500: #efc100;
+
+$gray-100: #f4f4f4;
+$gray-200: #e6e6e6;
+$gray-300: #d8d8d8;
+$gray-400: #cccccc;
+$gray-500: #b3b3b3;
+$gray-600: #999999;
+$gray-700: #666666;
+$gray-800: #3f3f3f;
+$gray-900: #161616;
+```
+
+##### Custom Color Variables
+
+```scss
+// Sass Base Color Variables
+$blue: $blue-500;
+$green: $green-500;
+$red: $red-500;
+$yellow: $yellow-500;
+```
+
+##### Custom Colors Map
+
+```scss
+$colors: (
+ "blue": $blue,
+ "green": $green,
+ "red": $red,
+ "yellow": $yellow,
+);
+```
+
+##### Custom Theme Color Variables
+
+```scss
+// Sass Theme Color Variables
+// Can be used as variants
+$danger: $red;
+$dark: $gray-900;
+$info: $blue;
+$light: $gray-100;
+$primary: $blue;
+$secondary: $gray-800;
+$success: $green;
+$warning: $yellow;
+```
+
+##### Custom Theme Colors Map
+
+```scss
+$theme-colors: (
+ "primary": $primary,
+ "secondary": $secondary,
+ "dark": $dark,
+ "light": $light,
+ "danger": $danger,
+ "info": $info "success": $success "warning": $warning,
+);
+```
+
+##### Color Resources
+
+- [Learn more about Bootstrap
+ colors](https://getbootstrap.com/docs/4.0/getting-started/theming/#color)
+- [Learn more about Bootstrap
+ variables](https://getbootstrap.com/docs/4.0/getting-started/theming/#css-variables)
+- [View the color palette and hex values in the color
+ guidelines](/guide/guidelines/colors)
+
+#### `_functions.scss`
+
+Two functions provide a customized way to set color highlights. The
+`theme-color-light` and `theme-color-dark` are custom functions used to create
+colors for the `alert`, `badge`, `card`, and `toast` components. They have also
+set color highlights for some pseudo-elements like `: hover`.
+
+##### Functions
+
+```scss
+// This function is usually used to get a lighter
+// theme variant color to use as a background color
+@function theme-color-light($variant) {
+ @return theme-color-level($variant, -11.3);
+}
+
+@function theme-color-dark($variant) {
+ @return theme-color-level($variant, 2);
+}
+```
+
+##### Examples
+
+```scss{8-10,16}
+.b-table-sort-icon-left {
+ background-position: left calc(1.5rem / 2) center !important;
+ padding-left: calc(1.2rem + 0.65em) !important;
+ &:focus {
+ outline: none;
+ box-shadow: inset 0 0 0 2px theme-color('primary') !important;
+ }
+ &:hover {
+ background-color: theme-color-dark('light');
+ }
+ }
+}
+
+&.alert-info {
+border-left-color: theme-color("info");
+background-color: theme-color-light("info");
+fill: theme-color("info");
+}
+```
+
+#### `_motion.scss`
+
+This bezier curves and durations in this file determine the motion styles
+throughout the application. These guidelines from the Cabon Design System avoid
+easing curves that are unnatural, distracting, or purely decorative.
+
+##### Motion Styles
+
+```scss
+$duration--fast-01: 70ms; //Micro-interactions such as button and toggle
+$duration--fast-02: 110ms; //Micro-interactions such as fade
+$duration--moderate-01: 150ms; //Micro-interactions, small expansion, short distance movements
+$duration--moderate-02: 240ms; //Expansion, system communication, toast
+$duration--slow-01: 400ms; //Large expansion, important system notifications
+$duration--slow-02: 700ms; //Background dimming
+
+$standard-easing--productive: cubic-bezier(0.2, 0, 0.38, 0.9);
+$standard-easing--expressive: cubic-bezier(0.4, 0.14, 0.3, 1);
+$entrance-easing--productive: cubic-bezier(0, 0, 0.38, 0.9);
+$entrance-easing--expressive: cubic-bezier(0, 0, 0.3, 1);
+$exit-easing--productive: cubic-bezier(0.2, 0, 1, 0.9);
+$exit-easing--expressive: cubic-bezier(0.4, 0.14, 1, 1);
+```
+
+##### Example
+
+```scss{6,9}
+.link-skip-nav {
+ position: absolute;
+ top: -60px;
+ left: 0.5rem;
+ z-index: $zindex-popover;
+ transition: $duration--moderate-01 $exit-easing--expressive;
+ &:focus {
+ top: 0.5rem;
+ transition-timing-function: $entrance-easing--expressive;
+ }
+}
+```
+
+##### Motion Resources
+
+- [Including Animation In Your Design
+ System](https://www.smashingmagazine.com/2019/02/animation-design-system/)
+- [Carbon Design System motion
+ guidelines](https://www.carbondesignsystem.com/guidelines/motion/basics/)
+
+#### `_variables.scss`
+
+This file contains all the global Sass options. There are Bootstrap option
+overrides, Bootstrap global variable overrides, and custom BMC global variables.
+Read more about these in the [Customization section](/customize/theme).
+
+### `bootstrap` Directory
+
+The `bootstrap` directory contains all the import references. The references are
+split into multiple files to support import order based on dependency. Helper
+styles need to be imported before all other styles.
+
+```{6}
+.
+├─ src
+ ├─ assets
+ ├─ styles
+ ├─ bmc
+ ├─ bootstrap
+ ├─ _helpers.scss
+ └─ _index.scss
+ └─ _obmc-custom.scss
+```
+
+#### `_helpers.scss`
+
+This file contains all the helper import references for Bootstrap.
+
+#### `_index.scss`
+
+This file contains all the import references needed to support the base,
+components, and utility styles.
+
+### `_obmc-custom.scss`
+
+```{9}
+.
+├─ src
+ ├─ assets
+ ├─ styles
+ ├─ bmc
+ ├─ bootstrap
+ └─ _obmc-custom.scss
+```
+
+The `obmc-custom.scss` file defines all of the presentational layer
+dependencies.
+
+- [Read more about Bootstrap
+ options](https://getbootstrap.com/docs/4.0/getting-started/theming/#sass-options)
+- [Read more about
+ Importing](https://getbootstrap.com/docs/4.0/getting-started/theming/#importing)
+
+## Component / View Styles
+
+Some stylistic changes only apply to a single-file component or view instance.
+In this case, rather than adding a Sass file, the scoped styles include the
+styles in the component's `<style>` block. It is required to import the
+`_helpers` Sass file when using a BMC or Bootstrap variable in the component's
+`<style>` block. Without this import, webpack cannot compile the OpenBMC Web UI
+CSS styles correctly.
+
+### Scoped style block using SASS
+
+```html
+<style scoped lang="scss">
+ ...
+</style>
+```
+
+### Scoped style block using CSS
+
+```html
+<style scoped>
+ ...;
+</style>
+```
+
+### Example - PageSection.vue
+
+```html
+<style lang="scss" scoped>
+ .page-section {
+ margin-bottom: $spacer * 2;
+ }
+
+ h2 {
+ @include font-size($h3-font-size);
+ margin-bottom: $spacer;
+ &::after {
+ content: "";
+ display: block;
+ width: 100px;
+ border: 1px solid $gray-300;
+ margin-top: 10px;
+ }
+ }
+</style>
+```
+
+:::tip
+You might notice that there is an HTML element, `<h2>`, used in the example. This is an anti-pattern in global `.scss` files. However, in a single file component that generates the markup it is acceptable.
+:::
+
+[Learn more about single file components](https://vuejs.org/v2/guide/single-file-components.html)
+
+Customization of the application requires knowledge of Sass and CSS. It also
+will require becoming familiar with the Bootstrap and Bootstrap-Vue component
+libraries. This section outlines the global options and variables that can be
+removed or updated to meet organizational brand guidelines.
diff --git a/docs/customization/theme.md b/docs/customization/theme.md
new file mode 100644
index 00000000..6dbce1a9
--- /dev/null
+++ b/docs/customization/theme.md
@@ -0,0 +1,189 @@
+# Theme customization
+Customization of the application requires knowledge of Sass and CSS. It also
+will require becoming familiar with the Bootstrap and Bootstrap-Vue component
+libraries. This section outlines the global options and variables that can be
+removed or updated to meet organizational brand guidelines.
+
+## Environment specific builds
+Any organization can create a build that meets their branding and other
+customization needs. This includes customization of the state store, routing,
+application navigation, and theming.
+
+[Read more in the Build Customization section](/customization/build)
+
+### Configuring environment specific builds
+The complete instructions can be found in the `env` directory in a file called
+env.md or by viewing the [Configuring environment specific builds
+page](./env.md)
+
+## Bootstrap Sass Options
+The Bootstrap Sass options are global styling toggles. The naming convention for
+these built-in variables is `enabled-*`.
+
+### $enable-rounded
+This option enables or disables the border-radius styles on various components.
+
+- Set to `false` to remove rounded corners on all container elements and buttons
+
+### $enable-validation-icons
+This option enables or disables background-image icons within textual inputs and
+some custom forms for validation states.
+
+- Set to `false` due to inability to style icons using CSS
+
+### More information
+- [View all the Bootstrap Sass
+ Options](https://getbootstrap.com/docs/4.2/getting-started/theming/#sass-options)
+
+## Bootstrap Sass Variables
+These are global variables that Bootstrap defines in the
+`/node_modules/bootstrap/scss/variables.scss` helper file. Adding a variable
+listed in this file to the `/src/assets/styles/bmc/helpers/_variables.scss` file
+will override the Bootstrap defined value.
+
+### $transition-base
+This variable sets the base CSS transition style throughout the application.
+- Set to `all $duration--moderate-02 $standard-easing--productive`
+
+### $transition-fade
+This variable sets the transition when showing and hiding elements.
+
+- Set to `opacity $duration--moderate-01 $standard-easing--productive`
+
+### $transition-collapse
+This variable sets the CSS transitions throughout the application when expanding
+and collapsing elements.
+
+- Set to `height $duration--slow-01 $standard-easing--expressive`
+
+### More Information
+- [Carbon Design System Motion
+ Guidelines](https://www.carbondesignsystem.com/guidelines/motion/basics/)
+- [Including Animation In Your Design
+ System](https://www.smashingmagazine.com/2019/02/animation-design-system/)
+
+## OpenBMC Custom Sass Options
+
+### $responsive-layout-bp
+This variable determines when the primary navigation is hidden and when the
+hamburger menu is displayed. The breakpoint is defined using a Bootstrap
+function that only accepts a key from the Bootstrap `$grid-breakpoints` map.
+
+- xs - Navigation is always displayed
+- sm - Navigation displayed when the viewport is greater than 576px
+- md - Navigation displayed when the viewport is greater than 768px
+- lg - Navigation displayed when the viewport is greater than 992px
+- xl - Navigation displayed when the viewport is less than 1200px
+
+#### Responsive Resources
+- [Bootstrap responsive
+ breakpoints](https://getbootstrap.com/docs/4.0/layout/overview/#responsive-breakpoints)
+- [Bootstrap Sass
+ Mixins](https://getbootstrap.com/docs/4.0/layout/overview/#responsive-breakpoints)
+- [Customizing the Bootstrap
+ Grid](https://getbootstrap.com/docs/4.0/layout/overview/#responsive-breakpoints)
+
+### $header-height
+This variable determines the height of the OpenBMC Web UI header element.
+
+- Default value: 56px
+
+### $navigation-width
+This variable determines the width of the primary navigation menu when expanded.
+
+- Default value: 300px
+
+### $container-bgd
+This option sets the background of page containers. Changing the value of this
+variable will change the background color for the following elements:
+- Login page
+- Primary navigation section
+- Quick links section on the overview page
+
+#### Value
+- Default value: $gray-200
+
+### $primary-nav-hover
+The semantic naming of this variable identifies its purpose. This color should
+always be slightly darker than the `$container-bgd` value.
+
+- Default value: $gray-300
+
+## Updating Colors
+Supporting a different color palette is a simple process. The default color
+palette is supported using the Sass variables outlined in the color guidelines
+and color maps outlined in the theme's overview. The following sections provide
+directions to update the settings to meet your organization's needs.
+
+### Color
+The OpenBMC Web UI uses Sass variables and maps to build its layout and
+components. Bootstrap variables and maps use the `!default` flag to allow for
+overrides. There are three Sass maps created to establish the color palette.
+These include the `color` map, `theme-color` map, and `gray` map. These maps are
+used by Bootstrap to build the application's CSS stylesheets.
+
+#### All Colors
+The OpenBMC Web UI custom colors are available as Sass variables and a Sass map
+in `/src/assets/styles/bmc/helpers/_variables.scss`. The OpenBMC theme only
+requires a subset of the colors to create the look and feel of the application.
+Adding, removing, or updating the color variables and map is how the application
+color palette can be customized. Using these variables outside of the helper
+files is discouraged to avoid tightly coupling the OpenBMC Web UI theme to
+specific colors.
+
+The `color` map is not as important as the `theme-color` map. A tight-coupling
+of the Sass variable name to the color name makes it hard to use the `color` map
+keys for customization. Using these keys in Sass stylesheets or single-file
+components is discouraged.
+
+#### Theme Colors
+The theme color variables and the `theme-color` map consist of a subset of the
+color variables. This smaller color palette creates a scheme that is not
+dependent on specific colors like blue or green. Several of the Bootstrap
+`theme-color` map keys are required to generate the CSS styles. The OpenBMC Web
+UI `theme-color` map has the same keys as the Bootstrap `theme-color` map with
+custom values.
+
+The `theme-color` map is used heavily throughout the application. The
+Bootstrap-Vue components `variant` prop also utilizes the `theme-color` map.
+This map is the key to customizing the application's color palette. Take a look
+at the [color guidelines](/guide/guidelines/colors) to better understand default
+theme-colors map.
+
+#### Gray Colors
+The gray color palette contains nine shades of gray that range from light to
+dark. Bootstrap sets a default gray color value for each color variable from
+100-900 in increments of one hundred, for example, `$gray-100`, `$gray-200`,
+`$gray-300` through `gray-900`. Bootstrap does not create a color map for any of
+the colors except gray. The Bootstrap documentation indicates that adding color
+maps for all the default colors is scheduled to be delivered in a future patch.
+The OpenBMC Web UI color theme overrides all shades of the Bootstrap default
+gray variable values.
+
+[Learn more about Bootstrap
+colors](https://getbootstrap.com/docs/4.0/getting-started/theming/#color)
+
+### Bootstrap Color Functions
+- `color('<color map key>)`
+- `theme-color('<theme color map key>)`
+- `gray('<gray color palette key'>)`
+
+
+#### Example
+```SCSS
+.some-selector {
+ color: color("blue");
+ background: theme-color("light");
+ border: 1px solid gray("900")
+}
+```
+
+[Learn more about using Bootstrap
+functions](https://getbootstrap.com/docs/4.0/getting-started/theming/#functions)
+## Adding a logo
+The updated page header can include a small logo. The guidelines for adding a
+logo and the suggested logo dimensions are currently in progress. It may be
+challenging to meet all organization brand guidelines due to the minimal height
+of the page header. The company logo might be able to be set in the primary
+navigation, but a design supporting that option will be the focus of future
+design work.