docs(docs-infra): document the implementation of styles (incl. theming) in angular.io (#42396)
PR Close #42396
This commit is contained in:
parent
4a5af60dc5
commit
1d9c6bb31d
80
aio/src/styles/README.md
Normal file
80
aio/src/styles/README.md
Normal file
@ -0,0 +1,80 @@
|
||||
# CSS styles in angular.io
|
||||
|
||||
This document gives an overview of how angular.io CSS styles are implemented and organized in files.
|
||||
|
||||
|
||||
## General
|
||||
|
||||
Styles are implemented using [Sass](https://sass-lang.com/) and stored in `.scss` files in [src/styles/](.).
|
||||
|
||||
> **NOTE:**<br />
|
||||
> We do not use inline styles for components.
|
||||
> Styles for components are defined in `.scss` files in [src/styles/](.) and are not referenced from the component files.
|
||||
|
||||
|
||||
## File organization
|
||||
|
||||
The `.scss` files are organized in the following sub-directories:
|
||||
- [0-base/](./0-base): General styles affecting the whole application.
|
||||
- [1-layouts/](./1-layouts): Styles for areas/components related to the layout of the application, such as `top-menu`, `footer`, marketing pages, etc.
|
||||
- [2-modules/](./2-modules): Styles for specialized components (such as buttons, code, labels, etc.) and specific pages (such as API list page, "Features" page, etc.).
|
||||
- [custom-themes/](./custom-themes): Entry-points for the different themes available in the application (currently `light` and `dark`).
|
||||
|
||||
There are also some top-level files in `[src/styles/](.):
|
||||
- [_app-theme.scss](./_app-theme.scss): Defines a `theme()` Sass mixin for creating an application theme.
|
||||
- [_constants.scss](./_constants.scss): Defines several constants to be used throughout the styles.
|
||||
- [_mixins.scss](./_mixins.scss): Defines Sass mixins to be used throughout the styles.
|
||||
- [_print.scss](./_print.scss): Contains styles to be applied when printing.
|
||||
- [main.scss](./main.scss): Styles entry-point.
|
||||
|
||||
|
||||
### Styles for a specific area/component
|
||||
|
||||
For each area/component, there is a sub-directory in either `1-layouts/` or `2-modules/`.
|
||||
|
||||
Each such sub-directory contains a `<name>.scss` file with styles for the corresponding area/component and may also contain a `<name>-theme.scss` file with styles related to theming.
|
||||
See the next section for more details.
|
||||
|
||||
When appropriate, the styles in these files should be scoped to the targeted component (for example, by using the component's selector).
|
||||
|
||||
|
||||
## Theming
|
||||
|
||||
Angular.io supports choosing between themes. Currently, a `light` and a `dark` theme are supported.
|
||||
See also [#41129](https://github.com/angular/angular/pull/41129) for more details/discussions around the theming implementation.
|
||||
|
||||
|
||||
## Styles for theming
|
||||
|
||||
Styles for each area/component are split between two files: `<name>.scss` and `<name>-theme.scss`.
|
||||
|
||||
The general styles go into `<name>.scss`.
|
||||
If an area/component has styles that could change based on the active theme (such as color or background), these go into the `*-theme.scss` file.
|
||||
Color-related styles in particular should always go into that file, even if the styles do not currently change between themes.
|
||||
This will make it easier to adjust/add more themes in the future.
|
||||
|
||||
Within each `*-theme.scss` file is a Sass mixin that takes in a Material theme configuration and generates the appropriate styling for that theme and component.
|
||||
|
||||
Advantages of the chosen approach:
|
||||
- Theming is contained to one file per component.
|
||||
Developers need only be aware of the existence of a single file when making theming related changes to a component
|
||||
- Themes can be lazy-loaded at runtime, preventing growth of the default styles chunk every time a new theme is implemented.
|
||||
|
||||
Disadvantages of the chosen approach:
|
||||
- Splitting styles into two files means that some selectors will be duplicated, resulting in an increase of the total styles chunk size.
|
||||
|
||||
|
||||
## Applying a theme at runtime
|
||||
|
||||
When building the app the following styles bundles are generated:
|
||||
- One [based on `main.scss`](https://github.com/angular/angular/blob/62b5a6cb079e489d91982abe88d644d73feb73f3/aio/angular.json#L44), which is always included in `index.html` and contains the general (non-theme-specific) styles.
|
||||
- [One bundle per theme](https://github.com/angular/angular/blob/62b5a6cb079e489d91982abe88d644d73feb73f3/aio/angular.json#L45-L54), which is loaded "on demand" and contains theme-specific styles.
|
||||
|
||||
A theme bundle is [loaded at runtime](https://github.com/angular/angular/blob/62b5a6cb079e489d91982abe88d644d73feb73f3/aio/src/index.html#L33-L36) using the CSS [`@import` rule](https://developer.mozilla.org/en-US/docs/Web/CSS/@import).
|
||||
The appropriate theme is chosen based on the user's preference (either through an operating system setting or a user agent setting) using the [`prefers-color-scheme` media query](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme).
|
||||
|
||||
Once the application has bootstrapped, the theme [may be updated](https://github.com/angular/angular/blob/62b5a6cb079e489d91982abe88d644d73feb73f3/aio/src/app/shared/theme-picker/theme-toggle.component.ts#L49-L72) based on a previously stored application-specific preference.
|
||||
Whenever the user explicitly changes the theme using the theme-toggle component, the new preference [is stored](https://github.com/angular/angular/blob/62b5a6cb079e489d91982abe88d644d73feb73f3/aio/src/app/shared/theme-picker/theme-toggle.component.ts#L89) for use in future visits.
|
||||
|
||||
> **NOTE:**<br />
|
||||
> The theming infrastructure is based on the [material.angular.io](https://github.com/angular/material.angular.io) implementation.
|
Loading…
x
Reference in New Issue
Block a user