@boostdev/design-system-components 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/README.md +1 -1
- package/dist/client.cjs +406 -362
- package/dist/client.css +560 -511
- package/dist/client.d.cts +27 -5
- package/dist/client.d.ts +27 -5
- package/dist/client.js +405 -362
- package/dist/index.cjs +406 -362
- package/dist/index.css +560 -511
- package/dist/index.d.cts +27 -5
- package/dist/index.d.ts +27 -5
- package/dist/index.js +405 -362
- package/package.json +4 -2
- package/src/components/interaction/Button/Button.mdx +73 -0
- package/src/components/interaction/Button/Button.module.css +12 -20
- package/src/components/interaction/Button/Button.stories.tsx +0 -1
- package/src/components/interaction/Command/Command.mdx +28 -0
- package/src/components/interaction/Command/Command.module.css +2 -1
- package/src/components/interaction/Command/Command.stories.tsx +3 -3
- package/src/components/interaction/Dialog/Dialog.mdx +57 -0
- package/src/components/interaction/Dialog/Dialog.module.css +1 -1
- package/src/components/interaction/Dialog/Dialog.stories.tsx +0 -1
- package/src/components/interaction/Drawer/Drawer.mdx +35 -0
- package/src/components/interaction/Drawer/Drawer.module.css +3 -9
- package/src/components/interaction/Drawer/Drawer.stories.tsx +3 -3
- package/src/components/interaction/Drawer/Drawer.tsx +5 -3
- package/src/components/interaction/DropdownMenu/DropdownMenu.mdx +40 -0
- package/src/components/interaction/DropdownMenu/DropdownMenu.stories.tsx +5 -5
- package/src/components/interaction/Popover/Popover.mdx +34 -0
- package/src/components/interaction/Popover/Popover.stories.tsx +3 -3
- package/src/components/interaction/Rating/Rating.mdx +38 -0
- package/src/components/interaction/Rating/Rating.stories.tsx +0 -1
- package/src/components/interaction/Toast/Toast.mdx +78 -0
- package/src/components/interaction/Toast/Toast.module.css +21 -7
- package/src/components/interaction/Toast/Toast.stories.tsx +0 -1
- package/src/components/interaction/form/Checkbox/Checkbox.mdx +57 -0
- package/src/components/interaction/form/Checkbox/Checkbox.stories.tsx +0 -1
- package/src/components/interaction/form/Combobox/Combobox.mdx +37 -0
- package/src/components/interaction/form/Combobox/Combobox.stories.tsx +0 -1
- package/src/components/interaction/form/FileInput/FileInput.mdx +38 -0
- package/src/components/interaction/form/FileInput/FileInput.stories.tsx +0 -1
- package/src/components/interaction/form/FormInput/FormInput.mdx +54 -0
- package/src/components/interaction/form/FormInput/FormInput.stories.tsx +0 -1
- package/src/components/interaction/form/NumberInput/NumberInput.mdx +38 -0
- package/src/components/interaction/form/NumberInput/NumberInput.stories.tsx +0 -1
- package/src/components/interaction/form/Radio/Radio.mdx +60 -0
- package/src/components/interaction/form/Radio/Radio.module.css +24 -11
- package/src/components/interaction/form/Radio/Radio.stories.tsx +5 -5
- package/src/components/interaction/form/Radio/Radio.tsx +6 -2
- package/src/components/interaction/form/Select/Select.mdx +58 -0
- package/src/components/interaction/form/Select/Select.stories.tsx +0 -1
- package/src/components/interaction/form/Slider/Slider.mdx +58 -0
- package/src/components/interaction/form/Slider/Slider.stories.tsx +0 -1
- package/src/components/interaction/form/Switch/Switch.mdx +61 -0
- package/src/components/interaction/form/Switch/Switch.module.css +6 -10
- package/src/components/interaction/form/Switch/Switch.stories.tsx +0 -1
- package/src/components/interaction/form/Textarea/Textarea.mdx +41 -0
- package/src/components/interaction/form/Textarea/Textarea.stories.tsx +0 -1
- package/src/components/layout/ButtonGroup/ButtonGroup.mdx +47 -0
- package/src/components/layout/ButtonGroup/ButtonGroup.module.css +10 -10
- package/src/components/layout/ButtonGroup/ButtonGroup.stories.tsx +1 -2
- package/src/components/layout/Card/Card.mdx +58 -0
- package/src/components/layout/Card/Card.stories.tsx +0 -1
- package/src/components/layout/IconWrapper/IconWrapper.mdx +39 -0
- package/src/components/layout/IconWrapper/IconWrapper.stories.tsx +0 -1
- package/src/components/layout/SectionHeader/SectionHeader.mdx +38 -0
- package/src/components/layout/SectionHeader/SectionHeader.stories.tsx +0 -1
- package/src/components/ui/Accordion/Accordion.mdx +40 -0
- package/src/components/ui/Accordion/Accordion.stories.tsx +0 -1
- package/src/components/ui/Alert/Alert.mdx +63 -0
- package/src/components/ui/Alert/Alert.module.css +3 -7
- package/src/components/ui/Alert/Alert.stories.tsx +0 -1
- package/src/components/ui/Avatar/Avatar.mdx +53 -0
- package/src/components/ui/Avatar/Avatar.module.css +4 -8
- package/src/components/ui/Avatar/Avatar.stories.tsx +0 -1
- package/src/components/ui/Badge/Badge.mdx +62 -0
- package/src/components/ui/Badge/Badge.module.css +4 -10
- package/src/components/ui/Badge/Badge.stories.tsx +0 -1
- package/src/components/ui/Breadcrumb/Breadcrumb.mdx +36 -0
- package/src/components/ui/Breadcrumb/Breadcrumb.stories.tsx +0 -1
- package/src/components/ui/Calendar/Calendar.mdx +34 -0
- package/src/components/ui/Calendar/Calendar.stories.tsx +0 -1
- package/src/components/ui/Carousel/Carousel.mdx +31 -0
- package/src/components/ui/Carousel/Carousel.stories.tsx +0 -1
- package/src/components/ui/Collapsible/Collapsible.mdx +59 -0
- package/src/components/ui/Collapsible/Collapsible.module.css +76 -0
- package/src/components/ui/Collapsible/Collapsible.spec.tsx +75 -0
- package/src/components/ui/Collapsible/Collapsible.stories.tsx +57 -0
- package/src/components/ui/Collapsible/Collapsible.tsx +55 -0
- package/src/components/ui/Collapsible/index.ts +2 -0
- package/src/components/ui/DescriptionList/DescriptionList.mdx +28 -0
- package/src/components/ui/DescriptionList/DescriptionList.stories.tsx +0 -1
- package/src/components/ui/Link/Link.mdx +44 -0
- package/src/components/ui/Link/Link.module.css +2 -5
- package/src/components/ui/Link/Link.stories.tsx +0 -1
- package/src/components/ui/Loading/Loading.mdx +52 -0
- package/src/components/ui/Loading/Loading.stories.tsx +0 -1
- package/src/components/ui/NotificationBanner/NotificationBanner.mdx +45 -0
- package/src/components/ui/NotificationBanner/NotificationBanner.module.css +3 -7
- package/src/components/ui/NotificationBanner/NotificationBanner.stories.tsx +2 -2
- package/src/components/ui/Pagination/Pagination.mdx +39 -0
- package/src/components/ui/Pagination/Pagination.module.css +3 -7
- package/src/components/ui/Pagination/Pagination.stories.tsx +0 -1
- package/src/components/ui/Progress/Progress.mdx +52 -0
- package/src/components/ui/Progress/Progress.module.css +1 -3
- package/src/components/ui/Progress/Progress.stories.tsx +0 -1
- package/src/components/ui/ProgressCircle/ProgressCircle.mdx +46 -0
- package/src/components/ui/ProgressCircle/ProgressCircle.stories.tsx +0 -1
- package/src/components/ui/Separator/Separator.mdx +29 -0
- package/src/components/ui/Separator/Separator.stories.tsx +0 -1
- package/src/components/ui/Skeleton/Skeleton.mdx +36 -0
- package/src/components/ui/Skeleton/Skeleton.stories.tsx +0 -1
- package/src/components/ui/SkipLink/SkipLink.mdx +34 -0
- package/src/components/ui/SkipLink/SkipLink.stories.tsx +0 -1
- package/src/components/ui/Table/Table.mdx +38 -0
- package/src/components/ui/Table/Table.stories.tsx +0 -1
- package/src/components/ui/Tabs/Tabs.mdx +40 -0
- package/src/components/ui/Tabs/Tabs.module.css +2 -5
- package/src/components/ui/Tabs/Tabs.stories.tsx +0 -1
- package/src/components/ui/Tooltip/Tooltip.mdx +43 -0
- package/src/components/ui/Tooltip/Tooltip.module.css +2 -5
- package/src/components/ui/Tooltip/Tooltip.stories.tsx +6 -6
- package/src/components/ui/Typography/Typography.mdx +41 -0
- package/src/components/ui/Typography/Typography.stories.tsx +0 -1
- package/src/index.ts +2 -0
- package/src/static/logo.svg +8 -0
- package/src/stories/Introduction.css +17 -0
- package/src/stories/Introduction.mdx +129 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Link.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Link
|
|
7
|
+
|
|
8
|
+
Styled anchor element with three visual variants. Renders as `<a>` by default, but can be rendered as a `<button>` or any other element via the `component` prop.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Navigation to another page or route
|
|
12
|
+
- Inline text links within paragraphs
|
|
13
|
+
|
|
14
|
+
## When not to use
|
|
15
|
+
- An action that does not navigate — use `Button` instead
|
|
16
|
+
|
|
17
|
+
## Examples
|
|
18
|
+
|
|
19
|
+
### Default
|
|
20
|
+
<Canvas of={Stories.Default} />
|
|
21
|
+
|
|
22
|
+
### Subtle
|
|
23
|
+
<Canvas of={Stories.Subtle} />
|
|
24
|
+
|
|
25
|
+
### Standalone
|
|
26
|
+
<Canvas of={Stories.Standalone} />
|
|
27
|
+
|
|
28
|
+
### External
|
|
29
|
+
<Canvas of={Stories.External} />
|
|
30
|
+
|
|
31
|
+
### All variants
|
|
32
|
+
<Canvas of={Stories.AllVariants} />
|
|
33
|
+
|
|
34
|
+
### Inline usage
|
|
35
|
+
<Canvas of={Stories.InlineUsage} />
|
|
36
|
+
|
|
37
|
+
## Props
|
|
38
|
+
|
|
39
|
+
<ArgTypes of={Stories} />
|
|
40
|
+
|
|
41
|
+
## Accessibility
|
|
42
|
+
|
|
43
|
+
- External links add `target="_blank"` with `rel="noopener noreferrer"` and a visually-hidden "(opens in new tab)" label
|
|
44
|
+
- The `as` prop allows any element while maintaining link semantics via `role`
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
@layer component {
|
|
2
2
|
.link {
|
|
3
|
-
--link_color
|
|
4
|
-
--link_color-hover: var(--color_blue--strong);
|
|
5
|
-
|
|
6
|
-
color: var(--link_color);
|
|
3
|
+
color: var(--link_color, var(--color_interactive));
|
|
7
4
|
text-decoration: underline;
|
|
8
5
|
text-underline-offset: 0.2em;
|
|
9
6
|
transition: var(--animation_transition);
|
|
@@ -18,7 +15,7 @@
|
|
|
18
15
|
|
|
19
16
|
@media (hover: hover) and (pointer: fine) {
|
|
20
17
|
.link:hover {
|
|
21
|
-
--link_color: var(--link_color-hover);
|
|
18
|
+
--link_color: var(--link_color-hover, var(--color_blue--strong));
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
21
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Loading.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Loading
|
|
7
|
+
|
|
8
|
+
Animated spinner that communicates an in-progress operation.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Inline within a button, card, or container while content is being fetched
|
|
12
|
+
- As a full-section overlay during page transitions
|
|
13
|
+
|
|
14
|
+
## When not to use
|
|
15
|
+
- When the loading duration exceeds ~10 seconds — consider a progress bar instead
|
|
16
|
+
- As a skeleton replacement — use `Skeleton` for layout-preserving placeholders
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### Sizes
|
|
21
|
+
<Canvas of={Stories.AllSizes} />
|
|
22
|
+
|
|
23
|
+
### Small
|
|
24
|
+
<Canvas of={Stories.Small} />
|
|
25
|
+
|
|
26
|
+
### Medium
|
|
27
|
+
<Canvas of={Stories.Medium} />
|
|
28
|
+
|
|
29
|
+
### Large
|
|
30
|
+
<Canvas of={Stories.Large} />
|
|
31
|
+
|
|
32
|
+
## Props
|
|
33
|
+
|
|
34
|
+
<ArgTypes of={Stories} />
|
|
35
|
+
|
|
36
|
+
## CSS variables
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<table>
|
|
40
|
+
<thead>
|
|
41
|
+
<tr><th>Variable</th><th>Description</th></tr>
|
|
42
|
+
</thead>
|
|
43
|
+
<tbody>
|
|
44
|
+
<tr><td>`--loading_color`</td><td>Spinner stroke colour (defaults to `currentcolor`)</td></tr>
|
|
45
|
+
</tbody>
|
|
46
|
+
</table>
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## Accessibility
|
|
50
|
+
|
|
51
|
+
- Renders with `role="status"` and a visually-hidden "Loading…" label
|
|
52
|
+
- Animation respects `prefers-reduced-motion` — the spinner fades instead of spinning
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './NotificationBanner.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# NotificationBanner
|
|
7
|
+
|
|
8
|
+
Full-width banner for page-level system messages. Sits at the top of the page or a major section.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Maintenance windows, feature announcements, or system-wide errors
|
|
12
|
+
- When the message applies to the entire page rather than a specific component
|
|
13
|
+
|
|
14
|
+
## When not to use
|
|
15
|
+
- Inline content feedback — use `Alert` instead
|
|
16
|
+
- Transient feedback after a user action — use `Toast`
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### Info
|
|
21
|
+
<Canvas of={Stories.Info} />
|
|
22
|
+
|
|
23
|
+
### Success
|
|
24
|
+
<Canvas of={Stories.Success} />
|
|
25
|
+
|
|
26
|
+
### Warning
|
|
27
|
+
<Canvas of={Stories.Warning} />
|
|
28
|
+
|
|
29
|
+
### Error
|
|
30
|
+
<Canvas of={Stories.Error} />
|
|
31
|
+
|
|
32
|
+
### With action
|
|
33
|
+
<Canvas of={Stories.WithAction} />
|
|
34
|
+
|
|
35
|
+
### Dismissible
|
|
36
|
+
<Canvas of={Stories.Dismissible} />
|
|
37
|
+
|
|
38
|
+
## Props
|
|
39
|
+
|
|
40
|
+
<ArgTypes of={Stories} />
|
|
41
|
+
|
|
42
|
+
## Accessibility
|
|
43
|
+
|
|
44
|
+
- Uses `role="alert"` for error/warning variants and `role="status"` for info/success
|
|
45
|
+
- Dismiss button has `aria-label="Dismiss notification"`
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
@layer component {
|
|
2
2
|
.banner {
|
|
3
|
-
--banner_bg: var(--color_blue--subtle);
|
|
4
|
-
--banner_text: var(--color_on-blue--subtle);
|
|
5
|
-
--banner_border: var(--color_blue);
|
|
6
|
-
|
|
7
3
|
display: flex;
|
|
8
4
|
align-items: center;
|
|
9
5
|
gap: var(--space_m);
|
|
10
6
|
padding: var(--space_s) var(--space_m);
|
|
11
|
-
background-color: var(--banner_bg);
|
|
12
|
-
color: var(--banner_text);
|
|
13
|
-
border-block-end: 3px solid var(--banner_border);
|
|
7
|
+
background-color: var(--banner_bg, var(--color_blue--subtle));
|
|
8
|
+
color: var(--banner_text, var(--color_on-blue--subtle));
|
|
9
|
+
border-block-end: 3px solid var(--banner_border, var(--color_blue));
|
|
14
10
|
font-size: var(--font_size--body);
|
|
15
11
|
line-height: var(--font_line-height--body);
|
|
16
12
|
width: 100%;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { NotificationBanner } from './NotificationBanner';
|
|
3
|
+
import { Button } from '../../interaction/Button/Button';
|
|
3
4
|
|
|
4
5
|
const meta = {
|
|
5
6
|
title: 'UI/NotificationBanner',
|
|
6
7
|
component: NotificationBanner,
|
|
7
|
-
tags: ['autodocs'],
|
|
8
8
|
} satisfies Meta<typeof NotificationBanner>;
|
|
9
9
|
|
|
10
10
|
export default meta;
|
|
@@ -18,7 +18,7 @@ export const WithAction: Story = {
|
|
|
18
18
|
args: {
|
|
19
19
|
variant: 'info',
|
|
20
20
|
children: 'A new version is available.',
|
|
21
|
-
action: <
|
|
21
|
+
action: <Button size="small">Update now</Button>,
|
|
22
22
|
},
|
|
23
23
|
};
|
|
24
24
|
export const Dismissible: Story = {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Pagination.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Pagination
|
|
7
|
+
|
|
8
|
+
Navigation control for paged data sets. Renders prev/next buttons plus numbered page links.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Tables, lists, and search results with more items than fit on one screen
|
|
12
|
+
- When infinite scroll is not appropriate (e.g. users need to return to a specific page)
|
|
13
|
+
|
|
14
|
+
## Examples
|
|
15
|
+
|
|
16
|
+
### Default
|
|
17
|
+
<Canvas of={Stories.Default} />
|
|
18
|
+
|
|
19
|
+
### First page
|
|
20
|
+
<Canvas of={Stories.FirstPage} />
|
|
21
|
+
|
|
22
|
+
### Last page
|
|
23
|
+
<Canvas of={Stories.LastPage} />
|
|
24
|
+
|
|
25
|
+
### Many pages
|
|
26
|
+
<Canvas of={Stories.ManyPages} />
|
|
27
|
+
|
|
28
|
+
### Interactive
|
|
29
|
+
<Canvas of={Stories.Interactive} />
|
|
30
|
+
|
|
31
|
+
## Props
|
|
32
|
+
|
|
33
|
+
<ArgTypes of={Stories} />
|
|
34
|
+
|
|
35
|
+
## Accessibility
|
|
36
|
+
|
|
37
|
+
- Wraps in `<nav aria-label="Pagination">`
|
|
38
|
+
- Current page button has `aria-current="page"`
|
|
39
|
+
- Prev/next buttons are disabled (not just hidden) when at the boundary
|
|
@@ -14,10 +14,6 @@
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
.button {
|
|
17
|
-
--btn_bg: transparent;
|
|
18
|
-
--btn_color: var(--color_on-bg);
|
|
19
|
-
--btn_border: var(--color_bg--subtle);
|
|
20
|
-
|
|
21
17
|
all: unset;
|
|
22
18
|
display: inline-flex;
|
|
23
19
|
align-items: center;
|
|
@@ -26,9 +22,9 @@
|
|
|
26
22
|
height: 2.25rem;
|
|
27
23
|
padding-inline: var(--space_xs);
|
|
28
24
|
border-radius: var(--border_radius--xs);
|
|
29
|
-
border: 1px solid var(--btn_border);
|
|
30
|
-
background-color: var(--btn_bg);
|
|
31
|
-
color: var(--btn_color);
|
|
25
|
+
border: 1px solid var(--btn_border, var(--color_bg--subtle));
|
|
26
|
+
background-color: var(--btn_bg, transparent);
|
|
27
|
+
color: var(--btn_color, var(--color_on-bg));
|
|
32
28
|
font-family: var(--font_family--body);
|
|
33
29
|
font-size: var(--font_size--body);
|
|
34
30
|
font-variant-numeric: tabular-nums;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Progress.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Progress
|
|
7
|
+
|
|
8
|
+
Horizontal progress bar communicating completion towards a goal.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- File uploads, form step completion, onboarding flows
|
|
12
|
+
- Any process with a known total and measurable progress
|
|
13
|
+
|
|
14
|
+
## Examples
|
|
15
|
+
|
|
16
|
+
### Default
|
|
17
|
+
<Canvas of={Stories.Default} />
|
|
18
|
+
|
|
19
|
+
### With label
|
|
20
|
+
<Canvas of={Stories.WithLabel} />
|
|
21
|
+
|
|
22
|
+
### All sizes
|
|
23
|
+
<Canvas of={Stories.AllSizes} />
|
|
24
|
+
|
|
25
|
+
### Complete
|
|
26
|
+
<Canvas of={Stories.Complete} />
|
|
27
|
+
|
|
28
|
+
### Empty
|
|
29
|
+
<Canvas of={Stories.Empty} />
|
|
30
|
+
|
|
31
|
+
## Props
|
|
32
|
+
|
|
33
|
+
<ArgTypes of={Stories} />
|
|
34
|
+
|
|
35
|
+
## CSS variables
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
<table>
|
|
39
|
+
<thead>
|
|
40
|
+
<tr><th>Variable</th><th>Description</th></tr>
|
|
41
|
+
</thead>
|
|
42
|
+
<tbody>
|
|
43
|
+
<tr><td>`--progress_color-active`</td><td>Filled track colour (defaults to `var(--color_active)`)</td></tr>
|
|
44
|
+
<tr><td>`--progress_color-track`</td><td>Empty track colour</td></tr>
|
|
45
|
+
</tbody>
|
|
46
|
+
</table>
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## Accessibility
|
|
50
|
+
|
|
51
|
+
- Uses `<progress>` element with `aria-valuenow`, `aria-valuemin`, `aria-valuemax`
|
|
52
|
+
- `label` prop sets `aria-label` — always provide a meaningful label
|
|
@@ -23,10 +23,8 @@
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
.track {
|
|
26
|
-
--progress_height: var(--space_xs);
|
|
27
|
-
|
|
28
26
|
width: 100%;
|
|
29
|
-
height: var(--progress_height);
|
|
27
|
+
height: var(--progress_height, var(--space_xs));
|
|
30
28
|
background-color: var(--color_bg--subtle);
|
|
31
29
|
border-radius: 999px;
|
|
32
30
|
overflow: hidden;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './ProgressCircle.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# ProgressCircle
|
|
7
|
+
|
|
8
|
+
Circular progress indicator. Use when a compact representation fits better than a horizontal bar.
|
|
9
|
+
|
|
10
|
+
## Examples
|
|
11
|
+
|
|
12
|
+
### Default
|
|
13
|
+
<Canvas of={Stories.Default} />
|
|
14
|
+
|
|
15
|
+
### With value
|
|
16
|
+
<Canvas of={Stories.WithValue} />
|
|
17
|
+
|
|
18
|
+
### Sizes
|
|
19
|
+
<Canvas of={Stories.Small} />
|
|
20
|
+
<Canvas of={Stories.Large} />
|
|
21
|
+
|
|
22
|
+
### Complete
|
|
23
|
+
<Canvas of={Stories.Complete} />
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
<ArgTypes of={Stories} />
|
|
28
|
+
|
|
29
|
+
## CSS variables
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<table>
|
|
33
|
+
<thead>
|
|
34
|
+
<tr><th>Variable</th><th>Description</th></tr>
|
|
35
|
+
</thead>
|
|
36
|
+
<tbody>
|
|
37
|
+
<tr><td>`--progress-circle_color-active`</td><td>Arc stroke colour</td></tr>
|
|
38
|
+
<tr><td>`--progress-circle_color-track`</td><td>Background circle colour</td></tr>
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- SVG uses `role="img"` with an `aria-label` derived from `label` and current value
|
|
46
|
+
- Numeric value is visually rendered when `showValue` is true; screen readers announce via `aria-valuenow`
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Separator.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Separator
|
|
7
|
+
|
|
8
|
+
Visual divider between content sections. Renders a semantic `<hr>` (horizontal) or a `<div role="separator">` (vertical).
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Between logically distinct content blocks in a layout
|
|
12
|
+
- To separate items in a menu or list
|
|
13
|
+
|
|
14
|
+
## Examples
|
|
15
|
+
|
|
16
|
+
### Horizontal
|
|
17
|
+
<Canvas of={Stories.Horizontal} />
|
|
18
|
+
|
|
19
|
+
### Vertical
|
|
20
|
+
<Canvas of={Stories.Vertical} />
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
<ArgTypes of={Stories} />
|
|
25
|
+
|
|
26
|
+
## Accessibility
|
|
27
|
+
|
|
28
|
+
- Horizontal variant uses `<hr>` — natively announces a thematic break to screen readers
|
|
29
|
+
- Vertical variant uses `role="separator"` with `aria-orientation="vertical"`
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Skeleton.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Skeleton
|
|
7
|
+
|
|
8
|
+
Layout-preserving placeholder shown while content is loading. Renders a shimmer block sized by `className` or inline style.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Replace individual content areas (text lines, images, cards) during async data fetching
|
|
12
|
+
- Preserve perceived layout stability during initial page load
|
|
13
|
+
|
|
14
|
+
## When not to use
|
|
15
|
+
- For very short loads (< 300 ms) — consider a spinner instead to avoid layout shift
|
|
16
|
+
- When you cannot predict content dimensions — use a `Loading` spinner
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### Default
|
|
21
|
+
<Canvas of={Stories.Default} />
|
|
22
|
+
|
|
23
|
+
### Text line
|
|
24
|
+
<Canvas of={Stories.TextLine} />
|
|
25
|
+
|
|
26
|
+
### Card layout
|
|
27
|
+
<Canvas of={Stories.Card} />
|
|
28
|
+
|
|
29
|
+
## Props
|
|
30
|
+
|
|
31
|
+
<ArgTypes of={Stories} />
|
|
32
|
+
|
|
33
|
+
## Accessibility
|
|
34
|
+
|
|
35
|
+
- Renders `aria-hidden="true"` — skeleton blocks are invisible to screen readers
|
|
36
|
+
- The containing region should use `aria-busy="true"` while loading, then `aria-live="polite"` when content arrives
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './SkipLink.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# SkipLink
|
|
7
|
+
|
|
8
|
+
Visually hidden link that becomes visible on keyboard focus, allowing keyboard users to skip repetitive navigation and jump directly to the main content.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- At the very top of every page, before any navigation
|
|
12
|
+
- Required for WCAG 2.4.1 compliance (Bypass Blocks)
|
|
13
|
+
|
|
14
|
+
## Notes
|
|
15
|
+
|
|
16
|
+
The link is visually hidden until focused. Press **Tab** on the preview below to reveal it.
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### Default
|
|
21
|
+
<Canvas of={Stories.Default} />
|
|
22
|
+
|
|
23
|
+
### Custom target
|
|
24
|
+
<Canvas of={Stories.CustomTarget} />
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
<ArgTypes of={Stories} />
|
|
29
|
+
|
|
30
|
+
## Accessibility
|
|
31
|
+
|
|
32
|
+
- Renders as a standard `<a>` — no special ARIA needed
|
|
33
|
+
- The `href` must match a valid `id` on the target element (e.g. `<main id="main-content">`)
|
|
34
|
+
- Visible focus style is required — the component applies a high-contrast outline on `:focus-visible`
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Table.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Table
|
|
7
|
+
|
|
8
|
+
Data table with optional sortable columns and caption.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Structured data with relationships across rows and columns
|
|
12
|
+
- When users need to compare values across multiple attributes
|
|
13
|
+
|
|
14
|
+
## When not to use
|
|
15
|
+
- Layout purposes — use CSS Grid or Flexbox
|
|
16
|
+
- Simple key-value data — use `DescriptionList` instead
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### Default
|
|
21
|
+
<Canvas of={Stories.Default} />
|
|
22
|
+
|
|
23
|
+
### Sortable columns
|
|
24
|
+
<Canvas of={Stories.Sortable} />
|
|
25
|
+
|
|
26
|
+
### With caption
|
|
27
|
+
<Canvas of={Stories.WithCaption} />
|
|
28
|
+
|
|
29
|
+
## Props
|
|
30
|
+
|
|
31
|
+
<ArgTypes of={Stories} />
|
|
32
|
+
|
|
33
|
+
## Accessibility
|
|
34
|
+
|
|
35
|
+
- Wraps in `<table>` with `<thead>` and `<tbody>`
|
|
36
|
+
- Column headers use `<th scope="col">`
|
|
37
|
+
- Sortable columns set `aria-sort="ascending"` / `"descending"` / `"none"`
|
|
38
|
+
- `caption` renders as `<caption>` — the accessible name of the table
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './Tabs.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# Tabs
|
|
7
|
+
|
|
8
|
+
Organises content into discrete panels accessible via a horizontal tab list.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
- Switching between related views without a page navigation
|
|
12
|
+
- When all tab panels share the same context (e.g. product details: Overview, Specs, Reviews)
|
|
13
|
+
|
|
14
|
+
## When not to use
|
|
15
|
+
- More than 5–6 tabs — consider a `Select` or sidebar navigation instead
|
|
16
|
+
- When panels are only loosely related — use separate pages or sections
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### Default
|
|
21
|
+
<Canvas of={Stories.Default} />
|
|
22
|
+
|
|
23
|
+
### With default open tab
|
|
24
|
+
<Canvas of={Stories.WithDefaultTab} />
|
|
25
|
+
|
|
26
|
+
### With disabled tab
|
|
27
|
+
<Canvas of={Stories.WithDisabledTab} />
|
|
28
|
+
|
|
29
|
+
### Rich content
|
|
30
|
+
<Canvas of={Stories.RichContent} />
|
|
31
|
+
|
|
32
|
+
## Props
|
|
33
|
+
|
|
34
|
+
<ArgTypes of={Stories} />
|
|
35
|
+
|
|
36
|
+
## Accessibility
|
|
37
|
+
|
|
38
|
+
- Implements ARIA tabs pattern: `role="tablist"`, `role="tab"`, `role="tabpanel"`
|
|
39
|
+
- Arrow keys navigate between tabs; `Enter`/`Space` activate
|
|
40
|
+
- Active tab uses `aria-selected="true"`; panel linked via `aria-labelledby`
|
|
@@ -11,9 +11,6 @@
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
.tab {
|
|
14
|
-
--tab_color: var(--color_on-bg);
|
|
15
|
-
--tab_border-color: transparent;
|
|
16
|
-
|
|
17
14
|
all: unset;
|
|
18
15
|
display: inline-flex;
|
|
19
16
|
align-items: center;
|
|
@@ -21,8 +18,8 @@
|
|
|
21
18
|
font-family: var(--font_family--body);
|
|
22
19
|
font-size: var(--font_size--body);
|
|
23
20
|
font-weight: var(--font_weight--semibold);
|
|
24
|
-
color: var(--tab_color);
|
|
25
|
-
border-bottom: 2px solid var(--tab_border-color);
|
|
21
|
+
color: var(--tab_color, var(--color_on-bg));
|
|
22
|
+
border-bottom: 2px solid var(--tab_border-color, transparent);
|
|
26
23
|
margin-bottom: -1px;
|
|
27
24
|
cursor: pointer;
|
|
28
25
|
transition: var(--animation_transition);
|