-
Notifications
You must be signed in to change notification settings - Fork 77
documentation conventions
Stencil uses JSDoc for their API reference generation. Stencil generates a docs-json
output target, which is parsed and displayed on the SDK site. The API reference includes property/attribute names, descriptions, types, values, and description notes (e.g. required, optional, deprecated). The SDK site updates the API reference after Calcite Component releases.
Follow these conventions when adding or editing API reference:
- Use complete sentences with proper grammar, capitalization, and punctuation.
- No abbreviations, e.g. use "property" instead of "prop".
- Verbs must be in present tense.
- Use the full tag name when referencing other Calcite Components (prefix with
calcite-
), e.g.calcite-button
instead ofbutton
. - For plural context, use
calcite-button
s instead ofcalcite-button
elements. - Use backticks (
`
) for the names of slots, events, properties, CSS variables, and component names (e.g.calcite-button
instead of calcite-button andselectionMode
instead of "selectionMode"). Also use backticks for the values of properties and event details (e.g.true
). If the value is a string, use both backticks and double quotes (e.g."single-persist"
). - Only use single quotes (
'
) as apostrophes. - No links or URLs allowed in descriptions. If a link is necessary, a custom JSDoc tag should be added and parsed in the SDK site.
- Refrain from using "e.g." or "i.e." references. Leverage "such as" (or similar) where examples are referenced.
- Use "Accessible" instead of "Aria" or "a11y" language.
- Verify slots and properties/attributes don't use the text "optional" in their descriptions.
There are two ways to document deprecations, depending on the API reference. In both cases a deprecated chip will be displayed in the SDK site within the component's API reference section.
- The
@deprecated
JSDoc tag is used for JavaScript properties, events, and methods in the<component-name>.tsx
file. Notes can accompany the JSDoc tag, such as "use<property>
instead". - The
[Deprecated]
text is added at the beginning of the JSDoc description for slots (@slots
) in the<component-name>.tsx
file and CSS variables in the<component-name>.scss
file. The text is parsed and removed from the description in the SDK site.
You can provide code snippets demonstrating a specific behavior or pattern for a component. Within the component's directory, create a new usage
directory. Then, create a Markdown file with the filename as the title of the snippet. There should only be one snippet per Markdown file. Stencil will add the usage snippets to the component's README after building. These usage snippets will then be displayed in Storybook.
Calcite Components uses Storybook to provide an interactive showcase of components with accompanying documentation and also to provide previews for screenshot testing. Storybook is deployed with prerelease versions, whereas the SDK site is only updated during releases. Storybook is a great resource for testing the newest changes and viewing the newest API reference.
For each main component (i.e. one that can be used by itself), there should be a <component-name>.stories.ts
file in its component folder.
Each component should use the Component Story Format (CSF) with at least two stories. If your component has properties that effect visual styles, you can use the storybook knobs addon to allow people to manipulate properties and see live updates in the documentation. A minimal stories file might look something like this (explained below):
import { boolean } from "@storybook/addon-knobs";
import { modesDarkDefault } from "../../../.storybook/utils";
import { storyFilters } from "../../../.storybook/helpers";
import { html } from "../../../support/formatting";
import notes from "./readme.md";
export default {
title: "Components/My Component",
parameters: { notes },
...storyFilters(),
};
export const simple = (): string =>
html`<my-component demo-prop="${boolean("demo-prop", true)}"></my-component>`;
export const darkModeRTL_TestOnly = (): string =>
html`<my-component
demo-prop
dir="rtl"
class="calcite-mode-dark"
></my-component>`;
darkModeRTL_TestOnly.parameters = { modes: modesDarkDefault };
Make sure to import the README generated by Stencil so that it can be viewed in Storybook. Parent components should also import the READMEs for their children:
import accordionReadme from "./readme.md";
import accordionItemReadme from "../accordion-item/readme.md";
export default {
title: "Components/Accordion",
parameters: {
notes: {
accordion: accordionReadme,
accordionItem: accordionItemReadme
},
...
};
- Story names should be camelCased
- All stories need to import the
storyFilters
util and include it in the default export so stories can be properly filtered - Update the main custom theme story instead of adding a specific story showing how to use a custom CSS prop
- Should only have HTML for the component or use case itself (e.g., no need to wrap in calcite-label)
- Update the
simple
story with a corresponding knob instead of adding a story specific to a new prop - Don't add or update a story if it is covered by an existing one
- Should have knobs configured to allow users to toggle different options available to the component
- The simplest, base configuration should be named
simple
for consistency - This story should have as many knobs possible for developers to interact with
- Should have one story per unique, supported use case
- Stories that can be covered by adding a new prop/knob should instead update an existing playground story (with the exception of
_TestOnly
stories, explained below)
- Should have the minimal HTML needed to reproduce the test scenario
- Should not have knobs since screenshot tests cannot interact with them
- Stories that are only meant for testing should use the
_TestOnly
suffix, which ensures it is only used for the screenshot test build. For example, if a snapshot with specific properties is needed for testing, it wouldn't need to be included in the playground where knobs can be used to display the state in thesimple
story. - Stories that are not meant for testing should use the
_NoTest
suffix, which ensures it is only used for the internal playground build. For example, stories that requires interaction not supported by the screenshot test environment, such as changing knobs. - The
simple
story and any other significant configuration should have a matchingdarkModeRTL_TestOnly
story- In order to reduce snapshot count, dark mode and RTL visual tests have been combined
There are a variety of Storybook helpers and utilities that should be used for common patterns. You can use existing stories as a reference for when/how the utilities and helpers should be used.