Include a source code styling section in the style guide for docs, indicating to follow the Angular style guide where possible and defining hexidecimal style guidance. Closes #23691 PR Close #42227
		
			
				
	
	
		
			1407 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			1407 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Angular documentation style guide
 | |
| 
 | |
| This style guide covers the standards for writing [Angular documentation on angular.io](https://angular.io/docs).
 | |
| These standards ensure consistency in writing style, Markdown conventions, and code snippets.
 | |
| 
 | |
| ## Prerequisites
 | |
| 
 | |
| Before contributing to the Angular documentation, it is helpful if you are familiar with the following:
 | |
| 
 | |
| * `git`: for an introduction, see GitHub's [Git Handbook](https://guides.github.com/introduction/git-handbook/)
 | |
| * `GitHub`: for an introduction, see GitHub's [Hello World](https://guides.github.com/activities/hello-world/)
 | |
| * Markdown: see GitHub's [Mastering Markdown](https://guides.github.com/features/mastering-markdown/)
 | |
| * Angular coding style: see the [Angular Style Guide](guide/styleguide "Angular Application Code Style Guide")
 | |
| * Google writing style: The [Google Developer Documentation Style Guide](https://developers.google.com/style/) is a comprehensive resource that this Angular documentation style guide builds upon.
 | |
| 
 | |
| ## Kinds of Angular documentation
 | |
| 
 | |
| The categories of Angular documentation include:
 | |
| 
 | |
| * [Guides](docs): much of what's in the [documentation section of angular.io](docs).
 | |
| Guides walk the reader step-by-step through tasks to demonstrate concepts and are often accompanied by a working example.
 | |
| These include [Getting Started](start), [Tour of Heroes](tutorial), and pages about [Forms](guide/forms-overview), [Dependency Injection](guide/dependency-injection), and [HttpClient](guide/http).
 | |
| Contributing members of the community and Angular team members maintain this documentation in [Markdown](https://daringfireball.net/projects/markdown/syntax "Markdown").
 | |
| * [API documentation](api): reference documents for the [Angular Application Programming Interface, or API](api).
 | |
| These are more succinct than guides and serve as a reference for Angular features.
 | |
| They are especially helpful for people already acquainted with Angular concepts.
 | |
| The [angular.io](https://angular.io/) infrastructure generates these documents from source code and comments that contributors edit.
 | |
| * [CLI documentation](cli): the [angular.io](https://angular.io/) infrastructure generates these documents from CLI source code.
 | |
| 
 | |
| 
 | |
| ## Markdown and HTML
 | |
| 
 | |
| While the Angular guides are [Markdown](https://daringfireball.net/projects/markdown/syntax "Markdown") files, there are some sections within the guides that use HTML.
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
|   To enable HTML in an Angular guide, **always** follow every opening and closing HTML tag with a blank line.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| Notice the required blank line after the opening `<div>` in the following example:
 | |
| 
 | |
| ```html
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
|   **Always** follow every opening and closing HTML tag with _a blank line_.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| It is customary but not required to precede the closing HTML tag with a blank line as well.
 | |
| 
 | |
| ## Title
 | |
| 
 | |
| Every guide document must have a title, and it should appear at the top of the page.
 | |
| 
 | |
| Begin the title with the Markdown `#` character, which renders as an `<h1>` in the browser.
 | |
| 
 | |
| ```html
 | |
|   # Angular documentation style guide
 | |
| ```
 | |
| 
 | |
| **A document can have only one `<h1>`.**
 | |
| 
 | |
| Title text should be in _Sentence case_, which means the first word is capitalized and all other words are lower case.
 | |
| Technical terms that are always capitalized, like "Angular", are the exception.
 | |
| 
 | |
| ```html
 | |
|   # Deprecation policy in Angular
 | |
| ```
 | |
| 
 | |
| **Always follow the title with at least one blank line.**
 | |
| 
 | |
| The corresponding text in the left nav is in _Title Case_, which means that you use capital letters to start the first words and all principal words.
 | |
| Use lower case letters for secondary words such as "in", "of", and "the".
 | |
| You can also shorten the nav title to fit in the column.
 | |
| 
 | |
| ## Sections
 | |
| 
 | |
| A typical document has sections.
 | |
| 
 | |
| All section headings are in _Sentence case_, which means the first word is capitalized and all other words are lower case.
 | |
| 
 | |
| **Always follow a section heading with at least one blank line.**
 | |
| 
 | |
| ### Main section heading
 | |
| 
 | |
| There are usually one or more main sections that may be further divided into secondary sections.
 | |
| 
 | |
| Begin a main section heading with the Markdown `##` characters, which renders as an `<h2>` in the browser.
 | |
| 
 | |
| Follow main section headings with a blank line and then the content for that heading as in the following example:
 | |
| 
 | |
| ```html
 | |
|   ## Main section heading
 | |
| 
 | |
|   Content after a blank line.
 | |
| ```
 | |
| 
 | |
| ### Secondary section heading
 | |
| 
 | |
| A secondary section heading is related to a main heading and falls textually within the bounds of that main heading.
 | |
| 
 | |
| Begin a secondary heading with the Markdown `###` characters, which renders as an `<h3>` in the browser.
 | |
| 
 | |
| Follow a secondary heading by a blank line and then the content for that heading as in the following example:
 | |
| 
 | |
| ```html
 | |
|   ### Secondary section heading
 | |
| 
 | |
|   Content after a blank line.
 | |
| ```
 | |
| 
 | |
| ### Additional section headings
 | |
| 
 | |
| While you can use additional section headings, the [Table-of-contents (TOC)](#table-of-contents) generator only shows `<h2>` and `<h3>` headings in the TOC on the right of the page.
 | |
| 
 | |
| ```html
 | |
|   #### The TOC won't display this
 | |
| 
 | |
|   Content after a blank line.
 | |
| ```
 | |
| 
 | |
| ## Table of contents
 | |
| 
 | |
| Most pages display a table of contents or TOC.
 | |
| The TOC appears in the right panel when the viewport is wide.
 | |
| When narrow, the TOC appears in a collapsible region near the top of the page.
 | |
| 
 | |
| You don't need to create your own TOC by hand because the TOC generator creates one automatically from the page's  `<h2>` and `<h3>` headers.
 | |
| 
 | |
| To exclude a heading from the TOC, create the heading as an `<h2>` or `<h3>` element with a class called 'no-toc'.
 | |
| 
 | |
| ```html
 | |
| <h3 class="no-toc">
 | |
| 
 | |
| This heading is not displayed in the TOC
 | |
| 
 | |
| </h3>
 | |
| ```
 | |
| 
 | |
| You can turn off TOC generation for the entire page by writing the title with an `<h1>` tag and the `no-toc` class.
 | |
| 
 | |
| ```html
 | |
| <h1 class="no-toc">
 | |
| 
 | |
| A guide without a TOC
 | |
| 
 | |
| </h1>
 | |
| ```
 | |
| 
 | |
| ## Navigation
 | |
| 
 | |
| To generate the navigation links at the top, left, and bottom of the screen, use the JSON configuration file, `content/navigation.json`.
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| If you have an idea that would result in navigation changes, [file an issue](https://github.com/angular/angular/issues/new/choose) first so that the Angular team and community can discuss the change.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| For a new guide page, edit the `SideNav` node in `navigation.json`.
 | |
| The `SideNav` node is an array of navigation nodes.
 | |
| Each node is either an item node for a single document or a header node with child nodes.
 | |
| 
 | |
| Find the header for your page.
 | |
| For example, a guide page that describes an Angular feature is probably a child of the `Fundamentals` header.
 | |
| 
 | |
| ```html
 | |
| {
 | |
|   "title": "Fundamentals",
 | |
|   "tooltip": "The fundamentals of Angular",
 | |
|   "children": [ ... ]
 | |
| }
 | |
| ```
 | |
| 
 | |
| A header node child can be an item node or another header node.
 | |
| If your guide page belongs under a sub-header, find that sub-header in the JSON.
 | |
| 
 | |
| Add an item node for your guide page as a child of the appropriate header node as in the following example:
 | |
| 
 | |
| ```html
 | |
|   {
 | |
|     "url": "guide/docs-style-guide",
 | |
|     "title": "Doc authors style guide",
 | |
|     "tooltip": "Style guide for documentation authors.",
 | |
|   },
 | |
| ```
 | |
| 
 | |
| A navigation node has the following properties:
 | |
| 
 | |
| * `url`: the URL of the guide page, which is an item node only.
 | |
| 
 | |
| * `title`: the text displayed in the side nav.
 | |
| 
 | |
| * `tooltip`: text that appears when the reader hovers over the navigation link.
 | |
| 
 | |
| * `children`: an array of child nodes, which is a header node only.
 | |
| 
 | |
| * `hidden`: defined and set `true` if this is a guide page that should not be displayed in the navigation panel.
 | |
| 
 | |
| <div class="alert is-critical">
 | |
| 
 | |
| Do not create a node that is both a header and an item node by specifying the `url` property of a header node.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| ## Code snippets
 | |
| 
 | |
| [Angular.io](https://angular.io/docs) has a custom framework that enables authors to include code snippets directly from working example apps that are automatically tested as part of documentation builds.
 | |
| 
 | |
| In addition to working code snippets, example code can include terminal commands, a fragment of TypeScript or HTML, or an entire code file.
 | |
| 
 | |
| Whatever the source, the doc viewer renders them as code snippets, either individually with the [code-example](#code-example "code-example") component or as a tabbed collection with the [code-tabs](#code-tabs "code-tabs") component.
 | |
| 
 | |
| {@a code-example}
 | |
| 
 | |
| ### When to use code font
 | |
| 
 | |
| You can display a minimal, inline code snippet with the Markdown backtick syntax.
 | |
| Use a single backtick on either side of a term when referring to code or the
 | |
| name of a file in a sentence.
 | |
| The following are some examples:
 | |
| 
 | |
| * In the `app.component.ts`, add a `logger()` method.
 | |
| * The `name` property is `Sally`.
 | |
| * Add the component class name to the `declarations` array.
 | |
| 
 | |
| The Markdown is as follows:
 | |
| 
 | |
| ```md
 | |
| 
 | |
| * In the `app.component.ts`, add a `logger()` method.
 | |
| * The <code class="no-auto-link">item</code> property is `true`.
 | |
| * Add the component class name to the `declarations` array.
 | |
| 
 | |
| ```
 | |
| 
 | |
| ### Auto-linking in code snippets
 | |
| 
 | |
| In certain cases, when you apply backticks around a term, it may auto-link to the API documentation.
 | |
| If you do not intend the term to be a link, use the following syntax:
 | |
| 
 | |
| ```html
 | |
| The <code class="no-auto-link">item</code> property is `true`.
 | |
| ```
 | |
| 
 | |
| ### Hard-coded snippets
 | |
| 
 | |
| Ideally, you should source code snippets [from working sample code](#from-code-samples), though there are times when an inline snippet is necessary.
 | |
| 
 | |
| For terminal input and output, place the content between `<code-example>` tags and set the language attribute to `sh` as in this example:
 | |
| 
 | |
| <code-example language="sh">
 | |
| 
 | |
|   npm start
 | |
| 
 | |
| </code-example>
 | |
| 
 | |
| ```html
 | |
| <code-example language="sh">
 | |
| 
 | |
|   npm start
 | |
| 
 | |
| </code-example>
 | |
| ```
 | |
| 
 | |
| Inline, hard-coded snippets like this one are not testable and, therefore, intrinsically unreliable.
 | |
| This example belongs to the small set of pre-approved, inline snippets that includes user input in a command shell or the output of some process.
 | |
| 
 | |
| In all other cases, code snippets should be generated automatically from tested code samples.
 | |
| 
 | |
| For hypothetical examples such as illustrations of configuration options in a JSON file, use the `<code-example>` tag with the `header` attribute to identify the context.
 | |
| 
 | |
| {@a from-code-samples}
 | |
| 
 | |
| ### Compilable example apps
 | |
| 
 | |
| One of the Angular documentation design goals is that guide page code snippets be examples of working code.
 | |
| 
 | |
| Authors meet this goal by displaying code snippets directly from working sample apps, written specifically for these guide pages.
 | |
| 
 | |
| Find sample apps in sub-folders of the `content/examples` directory of the `angular/angular` repository.
 | |
| An example folder name is often the same as the guide page it supports.
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| A guide page might not have its own sample code.
 | |
| It might refer instead to a sample belonging to another page.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| The Angular CI process runs all end-to-end tests for every Angular PR.
 | |
| Angular re-tests the samples after every new version of a sample and every new version of Angular.
 | |
| 
 | |
| When possible, every snippet of code on a guide page should be derived from a code sample file. You tell the Angular documentation engine which code file—or fragment of a code file—to display by configuring `<code-example>` attributes.
 | |
| 
 | |
| {@a display-whole-file}
 | |
| 
 | |
| ### Displaying an entire code file
 | |
| 
 | |
| This Angular documentation style guide that you are currently reading has its own example application, located in the `content/examples/docs-style-guide` folder.
 | |
| 
 | |
| The following `<code-example>` displays the sample's `app.module.ts`:
 | |
| 
 | |
| <code-example path="docs-style-guide/src/app/app.module.ts" header="src/app/app.module.ts"></code-example>
 | |
| 
 | |
| The following markup produces that snippet:
 | |
| 
 | |
| ```html
 | |
| <code-example path="docs-style-guide/src/app/app.module.ts" header="src/app/app.module.ts">
 | |
| </code-example>
 | |
| ```
 | |
| 
 | |
| The `path` attribute identifies the snippet's source file at the example app folder's location within `content/examples`.
 | |
| In this example, that path is  `docs-style-guide/src/app/app.module.ts`.
 | |
| 
 | |
| The header tells the reader where to find the file.
 | |
| Following convention, set the `header` attribute to the file's location within the example app's root folder.
 | |
| 
 | |
| Unless otherwise noted, all code snippets in this page are from sample source code located in the `content/examples/docs-style-guide` directory.
 | |
| 
 | |
| <div class="alert is-important">
 | |
| 
 | |
| The documentation tooling reports an error if the file identified in the path does not exist or is in the [`.git-ignore` file](https://github.com/angular/angular/blob/master/aio/content/examples/.gitignore).
 | |
| Most `.js` files are in `.git-ignore`.
 | |
| 
 | |
| To include an ignored code file in your project and display it in a guide, remove it from `.git-ignore`. Update the `content/examples/.gitignore` as follows:
 | |
| 
 | |
| <code-example header="content/examples/.gitignore">
 | |
|   # my-guide
 | |
|   !my-guide/src/something.js
 | |
|   !my-guide/more-javascript*.js
 | |
| </code-example>
 | |
| 
 | |
| </div>
 | |
| 
 | |
| {@a region}
 | |
| 
 | |
| ### Displaying part of a code file
 | |
| 
 | |
| To include a snippet of code within a sample code file, rather than the entire file, use the `<code-example>` `region` attribute.
 | |
| The following example focuses on the `AppModule` class and its `@NgModule()` metadata:
 | |
| 
 | |
| <code-example
 | |
|   path="docs-style-guide/src/app/app.module.ts"
 | |
|   header="src/app/app.module.ts"
 | |
|   region="class">
 | |
| </code-example>
 | |
| 
 | |
| To render the above example, the HTML in the Markdown file is as follows:
 | |
| 
 | |
| ```html
 | |
| <code-example
 | |
|   path="docs-style-guide/src/app/app.module.ts"
 | |
|   region="class">
 | |
| </code-example>
 | |
| ```
 | |
| 
 | |
| The `path` points to the file, just as in examples that render the [entire file](guide/docs-style-guide#display-whole-file).
 | |
| The `region` attribute specifies a portion of the source file delineated by an opening `#docregion` and a closing `#enddocregion`.
 | |
| 
 | |
| You can see the `class` `#docregion` in the source file below.
 | |
| Notice the commented lines `#docregion` and `#enddocregion` in `content/examples/docs-style-guide/src/app/app.module.ts` with the name `class`.
 | |
| 
 | |
| <code-example header="src/app/app.module.ts">
 | |
| 
 | |
| import { NgModule }      from '@angular/core';
 | |
| import { BrowserModule } from '@angular/platform-browser';
 | |
| import { FormsModule }   from '@angular/forms';
 | |
| 
 | |
| import { AppComponent }  from './app.component';
 | |
| 
 | |
| // #docregion class
 | |
| @NgModule({
 | |
|   imports:      [ BrowserModule, FormsModule ],
 | |
|   declarations: [ AppComponent ],
 | |
|   bootstrap:    [ AppComponent ]
 | |
| })
 | |
| export class AppModule { }
 | |
| // #enddocregion class
 | |
| 
 | |
| </code-example>
 | |
| 
 | |
| The opening and ending `#docregion` lines designate any lines of code between them as being included in the code snippet.
 | |
| This is why the import statements outside of the `class` `#docregion` are not in the code snippet.
 | |
| 
 | |
| For more information on how to prepare example app files for use in guides, see
 | |
|  [Source code markup](#source-code-markup).
 | |
| 
 | |
| ### Code snippet options
 | |
| 
 | |
| Specify the `<code-example>` output with the following attributes:
 | |
| 
 | |
| * `path`: the path to the file in the `content/examples` folder.
 | |
| 
 | |
| * `header`: the header of the code listing.
 | |
|   This is the title of the code snippet and can include the path and extra information such as whether the snippet is an excerpt.
 | |
| 
 | |
| * `region`: displays the source file fragment with that region name; regions are identified by `#docregion` markup in the source file.
 | |
|   See [Displaying a code snippet](#region "Displaying a code snippet").
 | |
| 
 | |
| * `linenums`: value may be `true`, `false`, or a `number`.
 | |
|   The default is `false`, which means that the browser displays no line numbers.
 | |
|   The `number` option starts line numbering at the given value.
 | |
|   For example, `linenums=4` sets the starting line number to 4.
 | |
| 
 | |
| * `class`: code snippets can be styled with the CSS classes `no-box` and `avoid`.
 | |
| 
 | |
| * `hideCopy`: hides the copy button.
 | |
| 
 | |
| * `language`: the source code language such as `javascript`, `html`, `css`, `typescript`, `json`, or `sh`.
 | |
|   This attribute only applies to hard-coded examples.
 | |
| 
 | |
| ### Displaying bad code
 | |
| 
 | |
| Occasionally, you want to display an example of less than ideal code or design, such as with **avoid** examples in the [Angular Style Guide](guide/styleguide).
 | |
| Because it is possible for readers to copy and paste examples of inferior code in their own applications, try to minimize use of such code.
 | |
| 
 | |
| In cases where you need unacceptable examples, you can set the `class` to `avoid` or have the word `avoid` in the filename of the source file.
 | |
| By putting the word `avoid` in the filename or path, the documentation generator automatically adds the `avoid` class to the `<code-example>`.
 | |
| Either of these options frames the code snippet in bright red to grab the reader's attention.
 | |
| 
 | |
| Here's the markup for an "avoid" example in the
 | |
| [Angular Style Guide](guide/styleguide#style-05-03 "Style 05-03: components as elements") that uses the word `avoid` in the path name:
 | |
| 
 | |
| ```html
 | |
| <code-example
 | |
|   path="styleguide/src/05-03/app/heroes/shared/hero-button/hero-button.component.avoid.ts"
 | |
|   region="example"
 | |
|   header="app/heroes/hero-button/hero-button.component.ts">
 | |
| </code-example>
 | |
| ```
 | |
| 
 | |
| Having the word "avoid" in the file name causes the browser to render the code snippet with a red header and border:
 | |
| 
 | |
| <code-example path="styleguide/src/05-03/app/heroes/shared/hero-button/hero-button.component.avoid.ts" region="example" header="app/heroes/hero-button/hero-button.component.ts">
 | |
| </code-example>
 | |
| 
 | |
| Alternatively, the HTML could include the `avoid` class as in the following:
 | |
| 
 | |
| ```html
 | |
| <code-example
 | |
|   path="docs-style-guide/src/app/not-great.component.ts"
 | |
|   header="docs-style-guide/src/app/not-great.component.ts"
 | |
|   region="not-great"
 | |
|   class="avoid">
 | |
| </code-example>
 | |
| ```
 | |
| 
 | |
| Explicitly applying the class `avoid` causes the same result of a red header and red border:
 | |
| 
 | |
| <code-example path="docs-style-guide/src/app/not-great.component.ts" header="docs-style-guide/src/app/not-great.component.ts" region="not-great" class="avoid">
 | |
| 
 | |
| </code-example>
 | |
| 
 | |
| {@a code-tabs}
 | |
| 
 | |
| ### Code Tabs
 | |
| 
 | |
| Code tabs display code much like `code-examples` with the added advantage of displaying multiple code samples within a tabbed interface.
 | |
| Each tab displays code using a `code-pane`.
 | |
| 
 | |
| #### `code-tabs` attributes
 | |
| 
 | |
| * `linenums`: The value can be `true`, `false`, or a number indicating the starting line number.
 | |
| The default is `false`.
 | |
| 
 | |
| #### `code-pane` attributes
 | |
| 
 | |
| * `path`: a file in the `content/examples` folder
 | |
| * `header`: what displays in the header of a tab
 | |
| * `linenums`: overrides the `linenums` property at the `code-tabs` level for this particular pane.
 | |
| The value can be `true`, `false`, or a number indicating the starting line number.
 | |
| The default is `false`.
 | |
| 
 | |
| The following example displays multiple code tabs, each with its own header.
 | |
| It demonstrates showing line numbers in `<code-tabs>` and `<code-pane>`.
 | |
| 
 | |
| <code-tabs linenums="true">
 | |
| 
 | |
|   <code-pane
 | |
|     header="app.component.html"
 | |
|     path="docs-style-guide/src/app/app.component.html">
 | |
|   </code-pane>
 | |
|   <code-pane
 | |
|     header="app.component.ts"
 | |
|     path="docs-style-guide/src/app/app.component.ts"
 | |
|     linenums="false">
 | |
|   </code-pane>
 | |
|   <code-pane
 | |
|     header="app.component.css (heroes)"
 | |
|     path="docs-style-guide/src/app/app.component.css"
 | |
|     region="heroes">
 | |
|   </code-pane>
 | |
|   <code-pane
 | |
|     header="package.json (scripts)"
 | |
|     path="docs-style-guide/package.1.json">
 | |
|   </code-pane>
 | |
| 
 | |
| </code-tabs>
 | |
| 
 | |
| The `linenums` attribute set to `true` on `<code-tabs>` explicitly enables numbering for all panes.
 | |
| However, the `linenums` attribute set to `false` in the second `<code-pane>` disables line numbering only for itself.
 | |
| 
 | |
| ```html
 | |
| <code-tabs linenums="true">
 | |
|   <code-pane
 | |
|     header="app.component.html"
 | |
|     path="docs-style-guide/src/app/app.component.html">
 | |
|   </code-pane>
 | |
|   <code-pane
 | |
|     header="app.component.ts"
 | |
|     path="docs-style-guide/src/app/app.component.ts"
 | |
|     linenums="false">
 | |
|   </code-pane>
 | |
|   <code-pane
 | |
|     header="app.component.css (heroes)"
 | |
|     path="docs-style-guide/src/app/app.component.css"
 | |
|     region="heroes">
 | |
|   </code-pane>
 | |
|   <code-pane
 | |
|     header="package.json (scripts)"
 | |
|     path="docs-style-guide/package.1.json">
 | |
|   </code-pane>
 | |
| </code-tabs>
 | |
| ```
 | |
| 
 | |
| {@a source-code-markup}
 | |
| 
 | |
| ## Preparing source code for code snippets
 | |
| 
 | |
| To display  `<code-example>` and `<code-tabs>` snippets, add code snippet markup to sample source code files.
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| The sample source code for this page, located in `content/examples/docs-style-guide`, contains examples of every code snippet markup described in this section.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| Code snippet markup is always in the form of a comment.
 | |
| The default `#docregion` markup for a TypeScript or JavaScript file is as follows:
 | |
| 
 | |
| ```
 | |
| // #docregion
 | |
| ... some TypeScript or JavaScript code ...
 | |
| // #enddocregion
 | |
| ```
 | |
| 
 | |
| ```html
 | |
| <!-- #docregion -->
 | |
| ... some HTML ...
 | |
| <!-- #enddocregion -->
 | |
| ```
 | |
| 
 | |
| ```
 | |
| /* #docregion */
 | |
| ... some CSS ...
 | |
| /* #enddocregion */
 | |
| ```
 | |
| 
 | |
| The documentation generation process erases these comments before displaying them in the documentation viewer, StackBlitz, and sample code downloads.
 | |
| 
 | |
| <div class="alert is-important">
 | |
| 
 | |
| Because JSON does not allow comments, code snippet markup doesn't work in JSON files.
 | |
| See the section on [JSON files](#json-files) for more information.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| ### `#docregion`
 | |
| 
 | |
| Use `#docregion` in source files to mark code for use in `<code-example>` or `<code-tabs>` components.
 | |
| 
 | |
| The `#docregion` comment begins a code snippet region.
 | |
| Every line of code after that comment belongs in the region until the code fragment processor encounters the end of the file or a closing `#enddocregion`.
 | |
| 
 | |
| The following `src/main.ts` is a an example of a file with a single `#docregion` at the top of the file.
 | |
| 
 | |
| <code-example path="docs-style-guide/src/main.ts" header="src/main.ts"></code-example>
 | |
| 
 | |
| As a result, the entire file is in the `<code-example>`.
 | |
| 
 | |
| 
 | |
| ### Naming a `#docregion`
 | |
| 
 | |
| To display multiple snippets from different fragments within the same file, give each fragment its own `#docregion` name as follows, where `your-region-name` is a hyphenated lowercase string:
 | |
| 
 | |
| ```
 | |
| // #docregion your-region-name
 | |
| ... some code ...
 | |
| // #enddocregion your-region-name
 | |
| ```
 | |
| 
 | |
| Reference this region by name in the `region` attribute of the `<code-example>` or `<code-pane>` as follows:
 | |
| 
 | |
| ```html
 | |
| <code-example
 | |
|   path="your-example-app/src/app/your-file.ts"
 | |
|   region="your-region-name"></code-example>
 | |
| ```
 | |
| 
 | |
| Because the `#docregion` with no name is the default region, you do not need to set the `region` attribute when referring to the default `#docregion`.
 | |
| 
 | |
| ### Nesting a `#docregion`
 | |
| 
 | |
| Place a `#docregion` within another `#docregion` as in the following example with a nested `inner-region`:
 | |
| 
 | |
| ```
 | |
| // #docregion
 | |
| ... some code ...
 | |
| // #docregion inner-region
 | |
| ... more code ...
 | |
| // #enddocregion inner-region
 | |
| ... yet more code ...
 | |
| /// #enddocregion
 | |
| ```
 | |
| 
 | |
| ### Combining code fragments
 | |
| 
 | |
| Combine several fragments from the same file into a single code snippet by defining multiple `#docregion` sections with the same region name.
 | |
| The following example defines two nested `#docregion` sections.
 | |
| 
 | |
| The inner region, `class-skeleton`, appears twice—once to capture the code that opens the class definition and a second time to capture the code that closes the class definition.
 | |
| 
 | |
| <code-example header="src/app/app.component.ts">
 | |
| 
 | |
| // #docplaster
 | |
| ...
 | |
| // #docregion class, class-skeleton
 | |
| export class AppComponent {
 | |
| // #enddocregion class-skeleton
 | |
|   title = 'Authors Style Guide Sample';
 | |
|   heroes = HEROES;
 | |
|   selectedHero: Hero;
 | |
| 
 | |
|   onSelect(hero: Hero): void {
 | |
|     this.selectedHero = hero;
 | |
|   }
 | |
| // #docregion class-skeleton
 | |
| }
 | |
| // #enddocregion class, class-skeleton
 | |
| 
 | |
| </code-example>
 | |
| 
 | |
| The `#docplaster` marker tells the processor what text string to use—that is, the "plaster"—to join each of the fragments into a single snippet.
 | |
| Place the "plaster" text on the same line.
 | |
| For example, `#docplaster ---` would use `---` as the "plaster" text.
 | |
| In the case of the previous file, the "plaster" text is empty so there will be nothing in between each fragment.
 | |
| 
 | |
| Without `#docplaster`, the processor inserts the default plaster—an ellipsis comment—between the fragments.
 | |
| 
 | |
| Here are the two corresponding code snippets for side-by-side comparison.
 | |
| 
 | |
| <code-tabs>
 | |
| 
 | |
|   <code-pane header="app.component.ts (class #docregion)" path="docs-style-guide/src/app/app.component.ts" region="class">
 | |
| 
 | |
|   </code-pane>
 | |
|   <code-pane header="app.component.ts (class-skeleton #docregion)" path="docs-style-guide/src/app/app.component.ts" region="class-skeleton">
 | |
| 
 | |
|   </code-pane>
 | |
| 
 | |
| </code-tabs>
 | |
| 
 | |
| The above example also demonstrates that one `#docregion` or `#enddocregion` comment can specify two region names, which is a convenient way to start or stop multiple regions on the same code line.
 | |
| Alternatively, you could put these comments on separate lines as in the following example:
 | |
| 
 | |
| <code-example header="src/app/app.component.ts">
 | |
| 
 | |
| // #docplaster
 | |
| ...
 | |
| // #docregion class
 | |
| // #docregion class-skeleton
 | |
| export class AppComponent {
 | |
| // #enddocregion class-skeleton
 | |
|   title = 'Authors Style Guide Sample';
 | |
|   heroes = HEROES;
 | |
|   selectedHero: Hero;
 | |
| 
 | |
|   onSelect(hero: Hero): void {
 | |
|     this.selectedHero = hero;
 | |
|   }
 | |
| // #docregion class-skeleton
 | |
| }
 | |
| // #enddocregion class
 | |
| // #enddocregion class-skeleton
 | |
| 
 | |
| </code-example>
 | |
| 
 | |
| ### JSON files
 | |
| 
 | |
| The `<code-example>` component cannot display portions of a JSON file because JSON forbids comments.
 | |
| However, you can display an entire JSON file by referencing it in the `<code-example>` `src` attribute.
 | |
| 
 | |
| For large JSON files, you could copy the nodes-of-interest into Markdown backticks, but as it's easy to mistakenly create invalid JSON that way, consider creating a JSON partial file with the fragment you want to display.
 | |
| 
 | |
| You can't test a partial file nor use it in the application, but at least your editor can confirm that it is syntactically correct.
 | |
| You can also store the partial file next to the original, so it is more likely that the author will remember to keep the two in sync.
 | |
| 
 | |
| Here's an example that excerpts certain scripts from `package.json` into a partial file named `package.1.json`.
 | |
| 
 | |
| <code-example path="docs-style-guide/package.1.json" header="package.json (selected scripts)"></code-example>
 | |
| 
 | |
| ```html
 | |
| <code-example path="docs-style-guide/package.1.json" header="package.json (selected scripts)"></code-example>
 | |
| ```
 | |
| 
 | |
| In some cases, it is preferable to use the name of the full file rather than the partial.
 | |
| In this case, the full file is `package.json` and the partial file is `package.1.json`.
 | |
| Since the focus is generally on the full file rather than the partial, using the name of the file the reader edits, in this example `package.json`, clarifies which file to work in.
 | |
| 
 | |
| ### Partial file naming
 | |
| 
 | |
| The step-by-step nature of the guides necessitate refactoring, which means there are code snippets that evolve through a guide.
 | |
| 
 | |
| Use partial files to demonstrate intermediate versions of the final source code with fragments of code that don't appear in the final app.
 | |
| The sample naming convention adds a number before the file extension, as follows:
 | |
| 
 | |
| ```html
 | |
| package.1.json
 | |
| app.component.1.ts
 | |
| app.component.2.ts
 | |
| ```
 | |
| 
 | |
| Remember to exclude these files from StackBlitz by listing them in the `stackblitz.json` as illustrated here:
 | |
| 
 | |
| <code-example path="docs-style-guide/stackblitz.json" header="stackblitz.json"></code-example>
 | |
| 
 | |
| ### Source code styling
 | |
| 
 | |
| Source code should follow [Angular's style guide](guide/styleguide) where possible.
 | |
| 
 | |
| #### Hexadecimals
 | |
| 
 | |
| Hexadecimal should use the shorthand where possible, and use only lowercase letters.
 | |
| 
 | |
| {@a live-examples}
 | |
| 
 | |
| ## Live examples
 | |
| 
 | |
| Adding `<live-example></live-example>` to a page generates two default links: <live-example></live-example>.
 | |
| 
 | |
| The first is a link to the StackBlitz example, which the default `stackblitz.json` file defines.
 | |
| You can find the `stackblitz.json` file in the `content/examples/example-app` directory, where `example-app` is the sample application folder you're using for the guide.
 | |
| 
 | |
| By default, the documentation generator uses the name of the guide as the name of the example.
 | |
| So, if you're working on `router.md`, and use `<live-example></live-example>` in the document, the documentation generator looks for `content/examples/router`.
 | |
| Clicking this link opens the code sample on StackBlitz in a new browser tab.
 | |
| 
 | |
| The second link downloads the sample app.
 | |
| 
 | |
| Define live examples by one or more `stackblitz.json` files in the root of a code sample folder.
 | |
| Each sample folder usually has a single unnamed definition file, the default `stackblitz.json`.
 | |
| 
 | |
| ### Live Example for named StackBlitz
 | |
| 
 | |
| You can create additional, named definition files in the form `name.stackblitz.json`.
 | |
| The [Testing](guide/testing) guide (`aio/content/guide/testing.md`) references a named StackBlitz file as follows:
 | |
| 
 | |
|   ```html
 | |
|   <live-example stackblitz="specs">Tests</live-example>
 | |
|   ```
 | |
| 
 | |
| The `stackblitz` attribute value of `specs` refers to the `examples/testing/specs.stackblitz.json` file.
 | |
| If you were to leave out the `stackblitz` attribute, the default would be `examples/testing/stackblitz.json`.
 | |
| 
 | |
| ### Custom label and tooltip
 | |
| 
 | |
| Change the appearance and behavior of the live example with attributes and classes.
 | |
| The following example gives the live example anchor a custom label and tooltip by setting the `title` attribute:
 | |
| 
 | |
| ```html
 | |
| <live-example title="Live Example with title"></live-example>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <live-example title="Live Example with title"></live-example>
 | |
| 
 | |
| You can achieve the same effect by putting the label between the `<live-example>` tags:
 | |
| 
 | |
| ```html
 | |
| <live-example>Live example with content label</live-example>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <live-example>Live example with content label</live-example>
 | |
| 
 | |
| ### Live example from another guide
 | |
| 
 | |
| To link to an example in a folder where the name is not the same as the current guide page, set the `name` attribute to the name of that folder.
 | |
| 
 | |
| For example, to include the [Router](guide/router) guide example in this style guide, set the `name` attribute to `router`, that is, the name of the folder where that example resides.
 | |
| 
 | |
| ```html
 | |
| <live-example name="router">Live example from the Router guide</live-example>
 | |
| ```
 | |
| 
 | |
| <live-example name="router">Live example from the Router guide</live-example>
 | |
| 
 | |
| 
 | |
| ### Live Example without download
 | |
| 
 | |
| To omit the download link, add the `noDownload` attribute.
 | |
| 
 | |
| ```html
 | |
| <live-example noDownload>Just the StackBlitz</live-example>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <live-example noDownload>Just the StackBlitz</live-example>
 | |
| 
 | |
| 
 | |
| ### Live Example with download-only
 | |
| 
 | |
| To omit the live StackBlitz link and only link to the download, add the `downloadOnly` attribute.
 | |
| 
 | |
| ```html
 | |
| <live-example downloadOnly>Download only</live-example>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <live-example downloadOnly>Download only</live-example>
 | |
| 
 | |
| 
 | |
| ### Embedded live example
 | |
| 
 | |
| By default, a live example link opens a StackBlitz example in a separate browser tab.
 | |
| You can embed the StackBlitz example within the guide page by adding the `embedded` attribute.
 | |
| 
 | |
| For performance reasons, StackBlitz does not start right away.
 | |
| Instead, the `<live-example>` component renders an image.
 | |
| Clicking the image starts the process of launching the embedded StackBlitz within an `<iframe>`.
 | |
| 
 | |
| The following is an embedded `<live-example>` for this guide:
 | |
| 
 | |
| ```html
 | |
| <live-example embedded></live-example>
 | |
| ```
 | |
| 
 | |
| The browser renders the following `<iframe>` and a `<p>` with a link to download the example:
 | |
| 
 | |
| <live-example embedded></live-example>
 | |
| 
 | |
| {@a anchors}
 | |
| 
 | |
| ## Anchors
 | |
| 
 | |
| Every section header is also an anchor point.
 | |
| Another guide page could add a link to this "Anchors" section with the following:
 | |
| 
 | |
| ```html
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| See the ["Anchors"](guide/docs-style-guide#anchors "Style Guide—Anchors") section for details.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| See the ["Anchors"](guide/docs-style-guide#anchors "Style Guide—Anchors") section for details.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| Notice that the above example includes a title of "Style Guide—Anchors".
 | |
| Use titles on anchors to create tooltips and improve UX.
 | |
| 
 | |
| When navigating within a page, you can omit the page URL when specifying the link that [scrolls up](#anchors "Anchors") to the beginning of this section, as in the following:
 | |
| 
 | |
| ```html
 | |
| ... the link that [scrolls up](#anchors "Anchors") to ...
 | |
| ```
 | |
| 
 | |
| {@a section-anchors}
 | |
| 
 | |
| ### Section header anchors
 | |
| 
 | |
| While the documentation generator automatically creates anchors for headers based on the header wording, titles can change, which can potentially break any links to that section.
 | |
| 
 | |
| To mitigate link breakage, add a custom anchor explicitly, just above the heading or text to which it applies, using the special `{@a name}` syntax as follows:
 | |
| 
 | |
| <code-example  language="html">
 | |
|   {@a section-anchors}
 | |
| 
 | |
|   #### Section header anchors
 | |
| </code-example>
 | |
| 
 | |
| Then reference that anchor like this:
 | |
| 
 | |
| ```html
 | |
| This is a [link to that custom anchor name](#section-anchors).
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| This is a [link to that custom anchor name](#section-anchors).
 | |
| 
 | |
| When editing a file, don't remove any anchors.
 | |
| If you change the document structure, you can move an existing anchor within that same doc without breaking a link.
 | |
| You can also add more anchors with more appropriate text.
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| As an alternative, you can use the HTML `<a>` tag.
 | |
| When using the `<a>` tag, set the `id` attribute—rather than the `name` attribute because the documentation generator does not convert the `name` to the proper link URL.
 | |
| For example:
 | |
| 
 | |
| ```html
 | |
| <a id="anchors"></a>
 | |
| 
 | |
| ## Anchors
 | |
| ```
 | |
| 
 | |
| </div>
 | |
| 
 | |
| ## Alerts and callouts
 | |
| 
 | |
| Alerts and callouts present warnings, extra detail, or references to related topics.
 | |
| 
 | |
| An alert or callout should not contain anything essential to understanding the main content.
 | |
| Instructions or tutorial steps should be in the main body of a guide rather than in a subsection.
 | |
| 
 | |
| ### Alerts
 | |
| 
 | |
| Alerts draw attention to short, important points.
 | |
| For multi-line content, see [callouts](#callouts "callouts").
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
|   See the [live examples](guide/docs-style-guide#live-examples "Live examples") section for more information.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| Note that at least one blank line must follow both the opening and closing `<div>` tags.
 | |
| A blank line before the closing `</div>` is conventional but not required.
 | |
| 
 | |
| ```html
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
|   See the [live examples](guide/docs-style-guide#live-examples "Live examples") section for more information.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| There are three different levels for styling the alerts according to the importance of the content.
 | |
| 
 | |
| Use the following the `alert` class along with the appropriate `is-helpful`, `is-important`, or `is-critical` CSS class, as follows:
 | |
| 
 | |
| ```html
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| A helpful, informational alert.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| ```html
 | |
| <div class="alert is-important">
 | |
| 
 | |
| An important alert.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| ```html
 | |
| <div class="alert is-critical">
 | |
| 
 | |
| A critical alert.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <div class="alert is-helpful">
 | |
| 
 | |
| A helpful, informational alert.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| <div class="alert is-important">
 | |
| 
 | |
| An important alert.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| <div class="alert is-critical">
 | |
| 
 | |
| A critical alert.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| ### Callouts
 | |
| 
 | |
| Callouts, like alerts, highlight important points.
 | |
| Use a callout when you need a header and multi-line content.
 | |
| 
 | |
| If you have more than two paragraphs, consider creating a new page or making it part of the main content.
 | |
| 
 | |
| Callouts use the same styling levels as alerts.
 | |
| 
 | |
| Use the CSS class `callout` in conjunction with the appropriate `is-helpful`, `is-important`, or `is-critical` class.
 | |
| The following example uses the `is-helpful` class:
 | |
| 
 | |
| ```html
 | |
| <div class="callout is-helpful">
 | |
| 
 | |
| <header>A helpful or informational point</header>
 | |
| 
 | |
|   **A helpful note**. Use a helpful callout for information requiring explanation.
 | |
|   Callouts are typically multi-line notes.
 | |
|   They can also contain code snippets.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| The browser renders the three styles as follows:
 | |
| 
 | |
| <div class="callout is-helpful">
 | |
| 
 | |
|   <header>A helpful or informational point</header>
 | |
| 
 | |
|   **A helpful note**. Use a helpful callout for information requiring explanation.
 | |
|   Callouts are typically multi-line notes.
 | |
|   They can also contain code snippets.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| <div class="callout is-important">
 | |
| 
 | |
|   <header>An important point</header>
 | |
| 
 | |
|   **An important note**. Use an important callout for significant information requiring explanation.
 | |
|   Callouts are typically multi-line notes.
 | |
|   They can also contain code snippets.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| <div class="callout is-critical">
 | |
| 
 | |
|   <header>A critical point</header>
 | |
| 
 | |
|   **A critical note**. Use a critical callout for compelling information requiring explanation.
 | |
|   Callouts are typically multi-line notes.
 | |
|   They can also contain code snippets.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| When using callouts, consider the following points:
 | |
| 
 | |
| * The callout header text style is uppercase.
 | |
| * The header does not render in the table of contents.
 | |
| * You can write the callout body in Markdown.
 | |
| * A blank line separates the `<header>` tag from the Markdown content.
 | |
| * Avoid using an `<h2>`, `<h3>`, `<h4>`, `<h5>`, or `<h6>`, as the CSS for callouts styles the `<header>` element.
 | |
| 
 | |
| Use callouts sparingly to grab the user's attention.
 | |
| 
 | |
| ## Trees
 | |
| 
 | |
| Use trees to represent hierarchical data such as directory structure.
 | |
| 
 | |
| <div class='filetree'>
 | |
| 
 | |
|   <div class='file'>
 | |
|     sample-dir
 | |
|   </div>
 | |
| 
 | |
|   <div class='children'>
 | |
| 
 | |
|     <div class='file'>
 | |
|       src
 | |
|     </div>
 | |
| 
 | |
|     <div class='children'>
 | |
| 
 | |
|       <div class='file'>
 | |
|         app
 | |
|       </div>
 | |
| 
 | |
|       <div class='children'>
 | |
| 
 | |
|         <div class='file'>
 | |
|           app.component.ts
 | |
|         </div>
 | |
| 
 | |
|         <div class='file'>
 | |
|           app.module.ts
 | |
|         </div>
 | |
| 
 | |
|       </div>
 | |
| 
 | |
|       <div class='file'>
 | |
|         styles.css
 | |
|       </div>
 | |
| 
 | |
|       <div class='file'>
 | |
|         tsconfig.json
 | |
|       </div>
 | |
| 
 | |
|     </div>
 | |
| 
 | |
|     <div class='file'>
 | |
|       node_modules ...
 | |
|     </div>
 | |
| 
 | |
|     <div class='file'>
 | |
|       package.json
 | |
|     </div>
 | |
| 
 | |
|   </div>
 | |
| 
 | |
| </div>
 | |
| 
 | |
| Here is the markup for this file tree.
 | |
| 
 | |
| ```html
 | |
| <div class='filetree'>
 | |
|     <div class='file'>
 | |
|         sample-dir
 | |
|     </div>
 | |
|     <div class='children'>
 | |
|         <div class='file'>
 | |
|           src
 | |
|         </div>
 | |
|         <div class='children'>
 | |
|             <div class='file'>
 | |
|               app
 | |
|             </div>
 | |
|             <div class='children'>
 | |
|                 <div class='file'>
 | |
|                   app.component.ts
 | |
|                 </div>
 | |
|                 <div class='file'>
 | |
|                   app.module.ts
 | |
|                 </div>
 | |
|             </div>
 | |
|             <div class='file'>
 | |
|               styles.css
 | |
|             </div>
 | |
|             <div class='file'>
 | |
|               tsconfig.json
 | |
|             </div>
 | |
|         </div>
 | |
|         <div class='file'>
 | |
|           node_modules ...
 | |
|         </div>
 | |
|         <div class='file'>
 | |
|           package.json
 | |
|         </div>
 | |
|     </div>
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| ## Tables
 | |
| 
 | |
| Use HTML tables to present tabular data.
 | |
| 
 | |
| <table>
 | |
|   <tr>
 | |
|     <th>Header Type</th>
 | |
|     <th>Markdown</th>
 | |
|     <th>Use</th>
 | |
|   </tr>
 | |
|   <tr>
 | |
|     <td><code><h1></code></td>
 | |
|     <td>#</td>
 | |
|     <td>Title of page</td>
 | |
|   </tr>
 | |
|   <tr>
 | |
|     <td><code><h2></code></td>
 | |
|     <td>##</td>
 | |
|     <!-- can use Markdown too; remember blank lines -->
 | |
|     <td>
 | |
| 
 | |
|       **Second level headers**
 | |
| 
 | |
|     </td>
 | |
|   </tr>
 | |
|   <tr>
 | |
|     <td><code><h3></code></td>
 | |
|     <td>###</td>
 | |
|     <td>
 | |
| 
 | |
|       **Third level headers**
 | |
| 
 | |
|     </td>
 | |
|   </tr>
 | |
| </table>
 | |
| 
 | |
| The following is the markup for this table:
 | |
| 
 | |
| ```html
 | |
| 
 | |
| <table>
 | |
|   <tr>
 | |
|     <th>Header Type</th>
 | |
|     <th>Markdown</th>
 | |
|     <th>Use</th>
 | |
|   </tr>
 | |
|   <tr>
 | |
|     <td><code><h1></code></td>
 | |
|     <td>#</td>
 | |
|     <td>Title of page</td>
 | |
|   </tr>
 | |
|   <tr>
 | |
|     <td><code><h2></code></td>
 | |
|     <td>##</td>
 | |
|     <!-- can use Markdown too; remember blank lines -->
 | |
|     <td>
 | |
| 
 | |
|       **Second level headers**
 | |
| 
 | |
|     </td>
 | |
|   </tr>
 | |
|   <tr>
 | |
|     <td><code><h3></code></td>
 | |
|     <td>###</td>
 | |
|     <td>
 | |
| 
 | |
|       **Third level headers**
 | |
| 
 | |
|     </td>
 | |
|   </tr>
 | |
| </table>
 | |
| 
 | |
| ```
 | |
| 
 | |
| ## Images
 | |
| 
 | |
| Store images in the `content/images/guide` directory in a folder with the **same name** as the guide page.
 | |
| Because Angular documentation generation copies these images to `generated/images/guide/your-guide-directory`, set the image `src` attribute to the runtime location of `generated/images/guide/your-guide-directory`.
 | |
| 
 | |
| For example, images for this "Angular documentation style guide" are in the `content/images/guide/docs-style-guide` folder, but the `src` attribute specifies the `generated` location.
 | |
| 
 | |
| The following is the `src` attribute for the "flying hero" image belonging to this guide:
 | |
| 
 | |
| ```html
 | |
| src="generated/images/guide/docs-style-guide/flying-hero.png"
 | |
| ```
 | |
| 
 | |
| <div class="callout is-important">
 | |
| 
 | |
|   <header>Use the HTML <code><img></code> tag</header>
 | |
| 
 | |
|   Specify images using the `<img>` tag.
 | |
|   **Do not use the Markdown image syntax, \!\[\.\.\.\]\(\.\.\.\).**
 | |
| 
 | |
|   For accessibility, always set the `alt` attribute with a meaningful description of the image.
 | |
| 
 | |
|   Nest the `<img>` tag within a `<div class="lightbox">` tag, which styles the image according to the documentation standard.
 | |
| 
 | |
| 
 | |
|   ```html
 | |
|   <div class="lightbox">
 | |
|     <img src="generated/images/guide/docs-style-guide/flying-hero.png" alt="flying hero">
 | |
|   </div>
 | |
|   ```
 | |
| 
 | |
|   Note that the HTML `<img>` element does not have a closing tag.
 | |
| 
 | |
|   The browser renders the following:
 | |
| 
 | |
|   <div class="lightbox">
 | |
|     <img src="generated/images/guide/docs-style-guide/flying-hero.png" alt="flying hero">
 | |
|   </div>
 | |
| 
 | |
| </div>
 | |
| 
 | |
| ### Image captions and figure captions
 | |
| 
 | |
| A caption appears underneath the image as a concise and comprehensive summary of the image.
 | |
| Captions are optional unless you are using numbered figures, such as Figure 1, Figure 2, and so on.
 | |
| If you are using numbered figures in a page, follow the guidelines in [Figure captions](https://developers.google.com/style/images#figure-captions) in the Google Developer Documentation Style Guide.
 | |
| 
 | |
| ### Image dimensions
 | |
| 
 | |
| The doc generator reads the image dimensions from an image file and adds `width` and `height` attributes to the `<img>` tag automatically.
 | |
| 
 | |
| To control the size of the image, supply your own `width` and `height` attributes.
 | |
| 
 | |
| Here's the "flying hero" markup with a 200px width:
 | |
| 
 | |
| ```html
 | |
| 
 | |
| <div class="lightbox">
 | |
|   <img src="generated/images/guide/docs-style-guide/flying-hero.png"
 | |
|     alt="flying Angular hero"
 | |
|     width="200">
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <div class="lightbox">
 | |
| 
 | |
|   <img src="generated/images/guide/docs-style-guide/flying-hero.png"
 | |
|     alt="flying Angular hero"
 | |
|     width="200">
 | |
| 
 | |
| </div>
 | |
| 
 | |
| ### Wide images
 | |
| 
 | |
| To prevent images overflowing their viewports, **use image widths under 700px**.
 | |
| To display a larger image, provide a link to the actual image that the user can click to see the full size image separately, as in this example of `source-map-explorer` output from the "Ahead-of-time Compilation" guide:
 | |
| 
 | |
| <a href="generated/images/guide/docs-style-guide/toh-pt6-bundle.png" title="Click to view larger image">
 | |
|   <div class="lightbox">
 | |
|     <img src="generated/images/guide/docs-style-guide/toh-pt6-bundle-700w.png" alt="toh-pt6-bundle" width="300px">
 | |
|   </div>
 | |
| </a>
 | |
| 
 | |
| The following is the HTML for creating a link to the image:
 | |
| 
 | |
| ```html
 | |
| <a href="generated/images/guide/docs-style-guide/toh-pt6-bundle.png" title="Click to view larger image">
 | |
|   <div class="lightbox">
 | |
|     <img src="generated/images/guide/docs-style-guide/toh-pt6-bundle-700w.png" alt="toh-pt6-bundle" width="300px">
 | |
|   </div>
 | |
| </a>
 | |
| ```
 | |
| 
 | |
| ### Image compression
 | |
| 
 | |
| For faster load times, always compress images.
 | |
| Consider using an image compression web site such as [tinypng](https://tinypng.com/ "tinypng").
 | |
| 
 | |
| ### Floated images
 | |
| 
 | |
| You can float the image to the left or right of text by applying the class="left" or class="right" attributes respectively.
 | |
| For example:
 | |
| 
 | |
| ```html
 | |
| <img src="generated/images/guide/docs-style-guide/flying-hero.png"
 | |
|    alt="flying Angular hero"
 | |
|    width="200"
 | |
|    class="left">
 | |
| 
 | |
| This text wraps around to the right of the floating "flying hero" image.
 | |
| 
 | |
| Headings and code-examples automatically clear a floated image. If you need to force a piece of text to clear a floating image, add `<br class="clear">` where the text should break.
 | |
| 
 | |
| <br class="clear">
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <img src="generated/images/guide/docs-style-guide/flying-hero.png"
 | |
|    alt="flying Angular hero"
 | |
|    width="200"
 | |
|    class="left">
 | |
| 
 | |
| This text wraps around to the right of the floating "flying hero" image.
 | |
| 
 | |
| Headings and `<code-example>` components automatically clear a floated image.
 | |
| To explicitly clear a floated image, add `<br class="clear">` where the text should break.
 | |
| 
 | |
| <br class="clear">
 | |
| 
 | |
| Generally, you don't wrap a floated image in a `<figure>` element.
 | |
| 
 | |
| ### Floats within a subsection
 | |
| 
 | |
| If you have a floated image inside an alert, callout, or a subsection, apply the `clear-fix` class to the `<div>` to ensure that the image doesn't overflow its container.
 | |
| For example:
 | |
| 
 | |
| 
 | |
| ```html
 | |
| <div class="alert is-helpful clear-fix">
 | |
| 
 | |
|   <img src="generated/images/guide/docs-style-guide/flying-hero.png"
 | |
|     alt="flying Angular hero"
 | |
|     width="100"
 | |
|     class="right">
 | |
| 
 | |
|   A subsection with **Markdown** formatted text.
 | |
| 
 | |
| </div>
 | |
| ```
 | |
| 
 | |
| The browser renders the following:
 | |
| 
 | |
| <div class="alert is-helpful clear-fix">
 | |
| 
 | |
|   <img src="generated/images/guide/docs-style-guide/flying-hero.png"
 | |
|     alt="flying Angular hero"
 | |
|     width="100"
 | |
|     class="right">
 | |
| 
 | |
|   A subsection with **Markdown** formatted text.
 | |
| 
 | |
| </div>
 | |
| 
 | |
| ## Help with documentation style
 | |
| 
 | |
| For specific language and grammar usage, a word list, style, tone, and formatting recommendations, see the [Google Developer Documentation Style Guide](https://developers.google.com/style).
 | |
| 
 | |
| If you have any questions that this style guide doesn't answer or you would like to discuss documentation styles visit the [Angular repo](https://github.com/angular/angular) and [file a documentation issue](https://github.com/angular/angular/issues/new/choose).
 |