@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.
Files changed (128) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/client.cjs +406 -362
  4. package/dist/client.css +560 -511
  5. package/dist/client.d.cts +27 -5
  6. package/dist/client.d.ts +27 -5
  7. package/dist/client.js +405 -362
  8. package/dist/index.cjs +406 -362
  9. package/dist/index.css +560 -511
  10. package/dist/index.d.cts +27 -5
  11. package/dist/index.d.ts +27 -5
  12. package/dist/index.js +405 -362
  13. package/package.json +4 -2
  14. package/src/components/interaction/Button/Button.mdx +73 -0
  15. package/src/components/interaction/Button/Button.module.css +12 -20
  16. package/src/components/interaction/Button/Button.stories.tsx +0 -1
  17. package/src/components/interaction/Command/Command.mdx +28 -0
  18. package/src/components/interaction/Command/Command.module.css +2 -1
  19. package/src/components/interaction/Command/Command.stories.tsx +3 -3
  20. package/src/components/interaction/Dialog/Dialog.mdx +57 -0
  21. package/src/components/interaction/Dialog/Dialog.module.css +1 -1
  22. package/src/components/interaction/Dialog/Dialog.stories.tsx +0 -1
  23. package/src/components/interaction/Drawer/Drawer.mdx +35 -0
  24. package/src/components/interaction/Drawer/Drawer.module.css +3 -9
  25. package/src/components/interaction/Drawer/Drawer.stories.tsx +3 -3
  26. package/src/components/interaction/Drawer/Drawer.tsx +5 -3
  27. package/src/components/interaction/DropdownMenu/DropdownMenu.mdx +40 -0
  28. package/src/components/interaction/DropdownMenu/DropdownMenu.stories.tsx +5 -5
  29. package/src/components/interaction/Popover/Popover.mdx +34 -0
  30. package/src/components/interaction/Popover/Popover.stories.tsx +3 -3
  31. package/src/components/interaction/Rating/Rating.mdx +38 -0
  32. package/src/components/interaction/Rating/Rating.stories.tsx +0 -1
  33. package/src/components/interaction/Toast/Toast.mdx +78 -0
  34. package/src/components/interaction/Toast/Toast.module.css +21 -7
  35. package/src/components/interaction/Toast/Toast.stories.tsx +0 -1
  36. package/src/components/interaction/form/Checkbox/Checkbox.mdx +57 -0
  37. package/src/components/interaction/form/Checkbox/Checkbox.stories.tsx +0 -1
  38. package/src/components/interaction/form/Combobox/Combobox.mdx +37 -0
  39. package/src/components/interaction/form/Combobox/Combobox.stories.tsx +0 -1
  40. package/src/components/interaction/form/FileInput/FileInput.mdx +38 -0
  41. package/src/components/interaction/form/FileInput/FileInput.stories.tsx +0 -1
  42. package/src/components/interaction/form/FormInput/FormInput.mdx +54 -0
  43. package/src/components/interaction/form/FormInput/FormInput.stories.tsx +0 -1
  44. package/src/components/interaction/form/NumberInput/NumberInput.mdx +38 -0
  45. package/src/components/interaction/form/NumberInput/NumberInput.stories.tsx +0 -1
  46. package/src/components/interaction/form/Radio/Radio.mdx +60 -0
  47. package/src/components/interaction/form/Radio/Radio.module.css +24 -11
  48. package/src/components/interaction/form/Radio/Radio.stories.tsx +5 -5
  49. package/src/components/interaction/form/Radio/Radio.tsx +6 -2
  50. package/src/components/interaction/form/Select/Select.mdx +58 -0
  51. package/src/components/interaction/form/Select/Select.stories.tsx +0 -1
  52. package/src/components/interaction/form/Slider/Slider.mdx +58 -0
  53. package/src/components/interaction/form/Slider/Slider.stories.tsx +0 -1
  54. package/src/components/interaction/form/Switch/Switch.mdx +61 -0
  55. package/src/components/interaction/form/Switch/Switch.module.css +6 -10
  56. package/src/components/interaction/form/Switch/Switch.stories.tsx +0 -1
  57. package/src/components/interaction/form/Textarea/Textarea.mdx +41 -0
  58. package/src/components/interaction/form/Textarea/Textarea.stories.tsx +0 -1
  59. package/src/components/layout/ButtonGroup/ButtonGroup.mdx +47 -0
  60. package/src/components/layout/ButtonGroup/ButtonGroup.module.css +10 -10
  61. package/src/components/layout/ButtonGroup/ButtonGroup.stories.tsx +1 -2
  62. package/src/components/layout/Card/Card.mdx +58 -0
  63. package/src/components/layout/Card/Card.stories.tsx +0 -1
  64. package/src/components/layout/IconWrapper/IconWrapper.mdx +39 -0
  65. package/src/components/layout/IconWrapper/IconWrapper.stories.tsx +0 -1
  66. package/src/components/layout/SectionHeader/SectionHeader.mdx +38 -0
  67. package/src/components/layout/SectionHeader/SectionHeader.stories.tsx +0 -1
  68. package/src/components/ui/Accordion/Accordion.mdx +40 -0
  69. package/src/components/ui/Accordion/Accordion.stories.tsx +0 -1
  70. package/src/components/ui/Alert/Alert.mdx +63 -0
  71. package/src/components/ui/Alert/Alert.module.css +3 -7
  72. package/src/components/ui/Alert/Alert.stories.tsx +0 -1
  73. package/src/components/ui/Avatar/Avatar.mdx +53 -0
  74. package/src/components/ui/Avatar/Avatar.module.css +4 -8
  75. package/src/components/ui/Avatar/Avatar.stories.tsx +0 -1
  76. package/src/components/ui/Badge/Badge.mdx +62 -0
  77. package/src/components/ui/Badge/Badge.module.css +4 -10
  78. package/src/components/ui/Badge/Badge.stories.tsx +0 -1
  79. package/src/components/ui/Breadcrumb/Breadcrumb.mdx +36 -0
  80. package/src/components/ui/Breadcrumb/Breadcrumb.stories.tsx +0 -1
  81. package/src/components/ui/Calendar/Calendar.mdx +34 -0
  82. package/src/components/ui/Calendar/Calendar.stories.tsx +0 -1
  83. package/src/components/ui/Carousel/Carousel.mdx +31 -0
  84. package/src/components/ui/Carousel/Carousel.stories.tsx +0 -1
  85. package/src/components/ui/Collapsible/Collapsible.mdx +59 -0
  86. package/src/components/ui/Collapsible/Collapsible.module.css +76 -0
  87. package/src/components/ui/Collapsible/Collapsible.spec.tsx +75 -0
  88. package/src/components/ui/Collapsible/Collapsible.stories.tsx +57 -0
  89. package/src/components/ui/Collapsible/Collapsible.tsx +55 -0
  90. package/src/components/ui/Collapsible/index.ts +2 -0
  91. package/src/components/ui/DescriptionList/DescriptionList.mdx +28 -0
  92. package/src/components/ui/DescriptionList/DescriptionList.stories.tsx +0 -1
  93. package/src/components/ui/Link/Link.mdx +44 -0
  94. package/src/components/ui/Link/Link.module.css +2 -5
  95. package/src/components/ui/Link/Link.stories.tsx +0 -1
  96. package/src/components/ui/Loading/Loading.mdx +52 -0
  97. package/src/components/ui/Loading/Loading.stories.tsx +0 -1
  98. package/src/components/ui/NotificationBanner/NotificationBanner.mdx +45 -0
  99. package/src/components/ui/NotificationBanner/NotificationBanner.module.css +3 -7
  100. package/src/components/ui/NotificationBanner/NotificationBanner.stories.tsx +2 -2
  101. package/src/components/ui/Pagination/Pagination.mdx +39 -0
  102. package/src/components/ui/Pagination/Pagination.module.css +3 -7
  103. package/src/components/ui/Pagination/Pagination.stories.tsx +0 -1
  104. package/src/components/ui/Progress/Progress.mdx +52 -0
  105. package/src/components/ui/Progress/Progress.module.css +1 -3
  106. package/src/components/ui/Progress/Progress.stories.tsx +0 -1
  107. package/src/components/ui/ProgressCircle/ProgressCircle.mdx +46 -0
  108. package/src/components/ui/ProgressCircle/ProgressCircle.stories.tsx +0 -1
  109. package/src/components/ui/Separator/Separator.mdx +29 -0
  110. package/src/components/ui/Separator/Separator.stories.tsx +0 -1
  111. package/src/components/ui/Skeleton/Skeleton.mdx +36 -0
  112. package/src/components/ui/Skeleton/Skeleton.stories.tsx +0 -1
  113. package/src/components/ui/SkipLink/SkipLink.mdx +34 -0
  114. package/src/components/ui/SkipLink/SkipLink.stories.tsx +0 -1
  115. package/src/components/ui/Table/Table.mdx +38 -0
  116. package/src/components/ui/Table/Table.stories.tsx +0 -1
  117. package/src/components/ui/Tabs/Tabs.mdx +40 -0
  118. package/src/components/ui/Tabs/Tabs.module.css +2 -5
  119. package/src/components/ui/Tabs/Tabs.stories.tsx +0 -1
  120. package/src/components/ui/Tooltip/Tooltip.mdx +43 -0
  121. package/src/components/ui/Tooltip/Tooltip.module.css +2 -5
  122. package/src/components/ui/Tooltip/Tooltip.stories.tsx +6 -6
  123. package/src/components/ui/Typography/Typography.mdx +41 -0
  124. package/src/components/ui/Typography/Typography.stories.tsx +0 -1
  125. package/src/index.ts +2 -0
  126. package/src/static/logo.svg +8 -0
  127. package/src/stories/Introduction.css +17 -0
  128. package/src/stories/Introduction.mdx +129 -0
@@ -4,7 +4,6 @@ import { DescriptionList } from './DescriptionList';
4
4
  const meta = {
5
5
  title: 'UI/DescriptionList',
6
6
  component: DescriptionList,
7
- tags: ['autodocs'],
8
7
  } satisfies Meta<typeof DescriptionList>;
9
8
 
10
9
  export default meta;
@@ -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: var(--color_interactive);
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
 
@@ -4,7 +4,6 @@ import { Link } from './Link';
4
4
  const meta = {
5
5
  title: 'UI/Link',
6
6
  component: Link,
7
- tags: ['autodocs'],
8
7
  argTypes: {
9
8
  variant: { control: 'radio', options: ['default', 'subtle', 'standalone'] },
10
9
  },
@@ -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
@@ -4,7 +4,6 @@ import { Loading } from './Loading';
4
4
  const meta = {
5
5
  title: 'UI/Loading',
6
6
  component: Loading,
7
- tags: ['autodocs'],
8
7
  argTypes: {
9
8
  size: { control: 'select', options: ['small', 'medium', 'large'] },
10
9
  },
@@ -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: <button type="button">Update now</button>,
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;
@@ -5,7 +5,6 @@ import { Pagination } from './Pagination';
5
5
  const meta = {
6
6
  title: 'UI/Pagination',
7
7
  component: Pagination,
8
- tags: ['autodocs'],
9
8
  } satisfies Meta<typeof Pagination>;
10
9
 
11
10
  export default meta;
@@ -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;
@@ -4,7 +4,6 @@ import { Progress } from './Progress';
4
4
  const meta = {
5
5
  title: 'UI/Progress',
6
6
  component: Progress,
7
- tags: ['autodocs'],
8
7
  argTypes: {
9
8
  size: { control: 'radio', options: ['small', 'medium', 'large'] },
10
9
  value: { control: { type: 'range', min: 0, max: 100 } },
@@ -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`
@@ -4,7 +4,6 @@ import { ProgressCircle } from './ProgressCircle';
4
4
  const meta = {
5
5
  title: 'UI/ProgressCircle',
6
6
  component: ProgressCircle,
7
- tags: ['autodocs'],
8
7
  } satisfies Meta<typeof ProgressCircle>;
9
8
 
10
9
  export default meta;
@@ -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"`
@@ -4,7 +4,6 @@ import { Separator } from './Separator';
4
4
  const meta = {
5
5
  title: 'UI/Separator',
6
6
  component: Separator,
7
- tags: ['autodocs'],
8
7
  argTypes: {
9
8
  orientation: { control: 'radio', options: ['horizontal', 'vertical'] },
10
9
  },
@@ -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
@@ -4,7 +4,6 @@ import { Skeleton } from './Skeleton';
4
4
  const meta = {
5
5
  title: 'UI/Skeleton',
6
6
  component: Skeleton,
7
- tags: ['autodocs'],
8
7
  } satisfies Meta<typeof Skeleton>;
9
8
 
10
9
  export default meta;
@@ -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`
@@ -4,7 +4,6 @@ import { SkipLink } from './SkipLink';
4
4
  const meta = {
5
5
  title: 'UI/SkipLink',
6
6
  component: SkipLink,
7
- tags: ['autodocs'],
8
7
  decorators: [
9
8
  Story => (
10
9
  <div style={{ minHeight: '4rem', position: 'relative' }}>
@@ -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
@@ -7,7 +7,6 @@ type User = { name: string; role: string; status: string; joined: string };
7
7
  const meta = {
8
8
  title: 'UI/Table',
9
9
  component: Table,
10
- tags: ['autodocs'],
11
10
  } satisfies Meta<typeof Table<User>>;
12
11
 
13
12
  export default meta;
@@ -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);