@bundle-stats/ui 4.22.2 → 4.23.0-beta.1

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 (227) hide show
  1. package/.babelrc.js +65 -24
  2. package/globals.d.ts +13 -0
  3. package/lib/app/app.js +3 -0
  4. package/lib/app/app.js.map +1 -1
  5. package/lib/app/app.module.css +11 -1
  6. package/lib/components/bundle-modules/index.js.map +1 -1
  7. package/lib/components/delta/delta.js +3 -13
  8. package/lib/components/delta/delta.js.map +1 -1
  9. package/lib/components/delta/delta.module.css +13 -12
  10. package/lib/components/delta/index.js.map +1 -1
  11. package/lib/components/index.js +3 -1
  12. package/lib/components/index.js.map +1 -1
  13. package/lib/components/insight-icon/insight-icon.module.css +6 -6
  14. package/lib/components/job-name/job-name.js +1 -2
  15. package/lib/components/job-name/job-name.js.map +1 -1
  16. package/lib/components/metric-change-legend/index.js +18 -0
  17. package/lib/components/metric-change-legend/index.js.map +1 -0
  18. package/lib/components/metric-change-legend/metric-change-legend.js +91 -0
  19. package/lib/components/metric-change-legend/metric-change-legend.js.map +1 -0
  20. package/lib/components/metric-change-legend/metric-change-legend.module.css +69 -0
  21. package/lib/components/metric-run-info/metric-run-info.js +30 -7
  22. package/lib/components/metric-run-info/metric-run-info.js.map +1 -1
  23. package/lib/components/metrics-display-selector/metrics-display-selector.js +7 -9
  24. package/lib/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  25. package/lib/components/metrics-display-selector/metrics-display-selector.module.css +0 -25
  26. package/lib/components/metrics-table-header/metrics-table-header.js +8 -8
  27. package/lib/components/metrics-table-header/metrics-table-header.js.map +1 -1
  28. package/lib/components/metrics-table-header/metrics-table-header.module.css +8 -12
  29. package/lib/components/metrics-table-options/metrics-table-options.js +1 -1
  30. package/lib/components/metrics-table-options/metrics-table-options.js.map +1 -1
  31. package/lib/components/metrics-table-title/metrics-table-title.js +1 -1
  32. package/lib/components/metrics-table-title/metrics-table-title.js.map +1 -1
  33. package/lib/components/run-info/run-info.js +26 -14
  34. package/lib/components/run-info/run-info.js.map +1 -1
  35. package/lib/components/run-info/run-info.module.css +35 -26
  36. package/lib/components/summary/summary.js +9 -10
  37. package/lib/components/summary/summary.js.map +1 -1
  38. package/lib/components/summary/summary.module.css +60 -10
  39. package/lib/constants.js +13 -1
  40. package/lib/constants.js.map +1 -1
  41. package/lib/css/default.css +1 -1
  42. package/lib/css/variables.css +71 -58
  43. package/lib/hooks/rows-sort.js +13 -12
  44. package/lib/hooks/rows-sort.js.map +1 -1
  45. package/lib/ui/button/button.js.map +1 -1
  46. package/lib/ui/dialog/dialog.js +4 -2
  47. package/lib/ui/dialog/dialog.js.map +1 -1
  48. package/lib/ui/dialog/dialog.module.css +22 -0
  49. package/lib/ui/dropdown/dropdown.js +4 -3
  50. package/lib/ui/dropdown/dropdown.js.map +1 -1
  51. package/lib/ui/dropdown/dropdown.module.css +11 -0
  52. package/lib/ui/empty-set/empty-set.js +3 -3
  53. package/lib/ui/empty-set/empty-set.js.map +1 -1
  54. package/lib/ui/hover-card/hover-card.js +1 -1
  55. package/lib/ui/hover-card/hover-card.js.map +1 -1
  56. package/lib/ui/hover-card/hover-card.module.css +14 -0
  57. package/lib/ui/table/table.module.css +0 -1
  58. package/lib/ui/tooltip/tooltip.js +1 -1
  59. package/lib/ui/tooltip/tooltip.js.map +1 -1
  60. package/lib/ui/tooltip/tooltip.module.css +11 -0
  61. package/lib-esm/app/app.js +4 -1
  62. package/lib-esm/app/app.js.map +1 -1
  63. package/lib-esm/app/app.module.css +11 -1
  64. package/lib-esm/components/bundle-modules/index.js.map +1 -1
  65. package/lib-esm/components/delta/delta.js +3 -13
  66. package/lib-esm/components/delta/delta.js.map +1 -1
  67. package/lib-esm/components/delta/delta.module.css +13 -12
  68. package/lib-esm/components/delta/index.js.map +1 -1
  69. package/lib-esm/components/index.js +1 -0
  70. package/lib-esm/components/index.js.map +1 -1
  71. package/lib-esm/components/insight-icon/insight-icon.module.css +6 -6
  72. package/lib-esm/components/job-name/job-name.js +1 -2
  73. package/lib-esm/components/job-name/job-name.js.map +1 -1
  74. package/lib-esm/components/metric-change-legend/index.js +2 -0
  75. package/lib-esm/components/metric-change-legend/index.js.map +1 -0
  76. package/lib-esm/components/metric-change-legend/metric-change-legend.js +84 -0
  77. package/lib-esm/components/metric-change-legend/metric-change-legend.js.map +1 -0
  78. package/lib-esm/components/metric-change-legend/metric-change-legend.module.css +69 -0
  79. package/lib-esm/components/metric-run-info/metric-run-info.js +31 -8
  80. package/lib-esm/components/metric-run-info/metric-run-info.js.map +1 -1
  81. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js +7 -9
  82. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  83. package/lib-esm/components/metrics-display-selector/metrics-display-selector.module.css +0 -25
  84. package/lib-esm/components/metrics-table-header/metrics-table-header.js +8 -8
  85. package/lib-esm/components/metrics-table-header/metrics-table-header.js.map +1 -1
  86. package/lib-esm/components/metrics-table-header/metrics-table-header.module.css +8 -12
  87. package/lib-esm/components/metrics-table-options/metrics-table-options.js +1 -1
  88. package/lib-esm/components/metrics-table-options/metrics-table-options.js.map +1 -1
  89. package/lib-esm/components/metrics-table-title/metrics-table-title.js +1 -1
  90. package/lib-esm/components/metrics-table-title/metrics-table-title.js.map +1 -1
  91. package/lib-esm/components/run-info/run-info.js +26 -14
  92. package/lib-esm/components/run-info/run-info.js.map +1 -1
  93. package/lib-esm/components/run-info/run-info.module.css +35 -26
  94. package/lib-esm/components/summary/summary.js +10 -11
  95. package/lib-esm/components/summary/summary.js.map +1 -1
  96. package/lib-esm/components/summary/summary.module.css +60 -10
  97. package/lib-esm/constants.js +12 -0
  98. package/lib-esm/constants.js.map +1 -1
  99. package/lib-esm/css/default.css +1 -1
  100. package/lib-esm/css/variables.css +71 -58
  101. package/lib-esm/hooks/rows-sort.js +10 -8
  102. package/lib-esm/hooks/rows-sort.js.map +1 -1
  103. package/lib-esm/ui/button/button.js.map +1 -1
  104. package/lib-esm/ui/dialog/dialog.js +4 -2
  105. package/lib-esm/ui/dialog/dialog.js.map +1 -1
  106. package/lib-esm/ui/dialog/dialog.module.css +22 -0
  107. package/lib-esm/ui/dropdown/dropdown.js +4 -3
  108. package/lib-esm/ui/dropdown/dropdown.js.map +1 -1
  109. package/lib-esm/ui/dropdown/dropdown.module.css +11 -0
  110. package/lib-esm/ui/empty-set/empty-set.js +3 -3
  111. package/lib-esm/ui/empty-set/empty-set.js.map +1 -1
  112. package/lib-esm/ui/hover-card/hover-card.js +1 -1
  113. package/lib-esm/ui/hover-card/hover-card.js.map +1 -1
  114. package/lib-esm/ui/hover-card/hover-card.module.css +14 -0
  115. package/lib-esm/ui/table/table.module.css +0 -1
  116. package/lib-esm/ui/tooltip/tooltip.js +1 -1
  117. package/lib-esm/ui/tooltip/tooltip.js.map +1 -1
  118. package/lib-esm/ui/tooltip/tooltip.module.css +11 -0
  119. package/package.json +26 -15
  120. package/src/app/app.jsx +6 -1
  121. package/src/app/app.module.css +11 -1
  122. package/src/app/app.stories.tsx +2 -2
  123. package/src/components/asset-info/asset-info.stories.tsx +47 -39
  124. package/src/components/asset-name/asset-name.stories.tsx +1 -3
  125. package/src/components/asset-not-predictive/asset-not-predictive.stories.tsx +22 -15
  126. package/src/components/browsertime-table/browsertime-table.stories.tsx +45 -0
  127. package/src/components/bundle-assets-totals/bundle-assets-totals.stories.tsx +47 -0
  128. package/src/components/bundle-modules/bundle-modules.stories.tsx +191 -0
  129. package/src/components/bundle-modules/bundle-modules.tsx +1 -1
  130. package/src/components/bundle-modules/index.tsx +4 -0
  131. package/src/components/bundle-packages/bundle-packages.stories.tsx +87 -0
  132. package/src/components/delta/delta.module.css +13 -12
  133. package/src/components/delta/delta.stories.tsx +57 -0
  134. package/src/components/delta/delta.tsx +32 -0
  135. package/src/components/entry-info/entry-info.stories.tsx +49 -54
  136. package/src/components/{index.js → index.ts} +7 -2
  137. package/src/components/insight-icon/insight-icon.module.css +6 -6
  138. package/src/components/insights/insights.stories.tsx +36 -33
  139. package/src/components/job-name/job-name.jsx +2 -3
  140. package/src/components/job-name/job-name.stories.tsx +46 -0
  141. package/src/components/jobs-header/jobs-header.stories.tsx +19 -15
  142. package/src/components/lighthouse-table/lighthouse-table.stories.tsx +30 -0
  143. package/src/components/metric/metric.stories.tsx +24 -22
  144. package/src/components/metric-change-legend/index.ts +1 -0
  145. package/src/components/metric-change-legend/metric-change-legend.module.css +69 -0
  146. package/src/components/metric-change-legend/metric-change-legend.stories.tsx +13 -0
  147. package/src/components/metric-change-legend/metric-change-legend.tsx +148 -0
  148. package/src/components/metric-run-info/metric-run-info.stories.tsx +45 -41
  149. package/src/components/metric-run-info/metric-run-info.tsx +41 -17
  150. package/src/components/metrics-display-selector/metrics-display-selector.module.css +0 -25
  151. package/src/components/metrics-display-selector/metrics-display-selector.tsx +25 -37
  152. package/src/components/metrics-table/metrics-table.stories.tsx +33 -13
  153. package/src/components/metrics-table/metrics-table.tsx +1 -1
  154. package/src/components/metrics-table-header/metrics-table-header.module.css +8 -12
  155. package/src/components/metrics-table-header/metrics-table-header.tsx +14 -10
  156. package/src/components/metrics-table-options/metrics-table-options.tsx +1 -1
  157. package/src/components/metrics-table-title/metrics-table-title.jsx +1 -1
  158. package/src/components/module-info/module-info.stories.tsx +41 -30
  159. package/src/components/package-info/package-info.stories.tsx +20 -15
  160. package/src/components/run-info/run-info.module.css +35 -26
  161. package/src/components/run-info/run-info.stories.tsx +47 -39
  162. package/src/components/run-info/run-info.tsx +132 -73
  163. package/src/components/summary/summary.module.css +60 -10
  164. package/src/components/summary/summary.stories.tsx +26 -32
  165. package/src/components/summary/summary.tsx +47 -50
  166. package/src/constants.ts +13 -0
  167. package/src/css/default.css +1 -1
  168. package/src/css/variables.css +71 -58
  169. package/src/hooks/rows-sort.ts +9 -6
  170. package/src/layout/box/box.stories.tsx +35 -28
  171. package/src/layout/flex-stack/flex-stack.stories.tsx +79 -48
  172. package/src/layout/footer/footer.stories.tsx +30 -0
  173. package/src/layout/stack/stack.stories.tsx +68 -44
  174. package/src/ui/alert/alert.stories.tsx +25 -21
  175. package/src/ui/button/button.stories.tsx +181 -176
  176. package/src/ui/button/button.tsx +8 -1
  177. package/src/ui/container/container.stories.tsx +28 -21
  178. package/src/ui/control-group/control-group.stories.tsx +23 -16
  179. package/src/ui/dialog/dialog.module.css +22 -0
  180. package/src/ui/dialog/dialog.tsx +9 -2
  181. package/src/ui/dropdown/dropdown.module.css +11 -0
  182. package/src/ui/dropdown/dropdown.stories.tsx +23 -15
  183. package/src/ui/dropdown/dropdown.tsx +5 -1
  184. package/src/ui/empty-set/empty-set.jsx +16 -4
  185. package/src/ui/empty-set/empty-set.stories.tsx +41 -0
  186. package/src/ui/file-name/file-name.stories.tsx +45 -0
  187. package/src/ui/filters/filters.stories.tsx +29 -26
  188. package/src/ui/hover-card/hover-card.module.css +14 -0
  189. package/src/ui/hover-card/hover-card.stories.tsx +35 -26
  190. package/src/ui/hover-card/hover-card.tsx +1 -1
  191. package/src/ui/icon/icon.stories.tsx +36 -28
  192. package/src/ui/input/input.stories.tsx +17 -5
  193. package/src/ui/input-search/input-search.stories.tsx +31 -0
  194. package/src/ui/loader/loader.stories.tsx +22 -0
  195. package/src/ui/skeleton/skeleton.stories.tsx +42 -0
  196. package/src/ui/table/table.module.css +0 -1
  197. package/src/ui/table/table.stories.tsx +244 -218
  198. package/src/ui/tag/tag.stories.tsx +11 -10
  199. package/src/ui/toolbar/toolbar.stories.tsx +41 -0
  200. package/src/ui/tooltip/tooltip.module.css +11 -0
  201. package/src/ui/tooltip/tooltip.tsx +1 -1
  202. package/types/components/bundle-modules/bundle-modules.d.ts +1 -1
  203. package/types/components/bundle-modules/index.d.ts +2 -1
  204. package/types/components/delta/delta.d.ts +7 -21
  205. package/types/components/delta/index.d.ts +1 -1
  206. package/types/components/index.d.ts +25 -20
  207. package/types/components/metric-change-legend/index.d.ts +1 -0
  208. package/types/components/metric-change-legend/metric-change-legend.d.ts +4 -0
  209. package/types/components/metric-run-info/metric-run-info.d.ts +2 -6
  210. package/types/components/metrics-table/metrics-table.d.ts +1 -1
  211. package/types/components/metrics-table-header/metrics-table-header.d.ts +1 -1
  212. package/types/components/run-info/run-info.d.ts +16 -7
  213. package/types/constants.d.ts +12 -0
  214. package/types/hooks/rows-sort.d.ts +2 -2
  215. package/types/ui/button/button.d.ts +1 -1
  216. package/types/ui/dialog/dialog.d.ts +3 -2
  217. package/types/ui/dropdown/dropdown.d.ts +1 -0
  218. package/vitest.config.ts +47 -0
  219. package/vitest.setup.ts +26 -0
  220. package/lib/assets/icons.svg.js +0 -100
  221. package/lib/assets/icons.svg.js.map +0 -1
  222. package/lib-esm/assets/icons.svg.js +0 -63
  223. package/lib-esm/assets/icons.svg.js.map +0 -1
  224. package/src/assets/icons.svg.jsx +0 -279
  225. package/src/components/delta/delta.jsx +0 -22
  226. package/types/assets/icons.svg.d.ts +0 -2
  227. /package/src/components/delta/{index.js → index.ts} +0 -0
@@ -0,0 +1,31 @@
1
+ import React, { useState } from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+
4
+ import { getWrapperDecorator } from '../../stories';
5
+ import { InputSearch } from '.';
6
+
7
+ const meta = {
8
+ title: 'UI/InputSearch',
9
+ component: InputSearch,
10
+ decorators: [getWrapperDecorator()],
11
+ } satisfies Meta<typeof InputSearch>;
12
+
13
+ export default meta;
14
+
15
+ type Story = StoryObj<typeof meta>;
16
+
17
+ const InputSearchWithState = () => {
18
+ const [search, updateSearch] = useState('');
19
+
20
+ return (
21
+ <div>
22
+ <pre>{JSON.stringify({ search }, null, 2)}</pre>
23
+ <br />
24
+ <InputSearch placeholder="Search by name" defaultValue={search} onChange={updateSearch} />
25
+ </div>
26
+ );
27
+ };
28
+
29
+ export const Default: Story = {
30
+ render: () => <InputSearchWithState />,
31
+ };
@@ -0,0 +1,22 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+
3
+ import { getWrapperDecorator } from '../../stories';
4
+ import { Loader } from '.';
5
+
6
+ const meta = {
7
+ title: 'UI/Loader',
8
+ component: Loader,
9
+ decorators: [getWrapperDecorator()],
10
+ } satisfies Meta<typeof Loader>;
11
+
12
+ export default meta;
13
+
14
+ type Story = StoryObj<typeof meta>;
15
+
16
+ export const Default: Story = {};
17
+
18
+ export const WithSize: Story = {
19
+ args: {
20
+ size: Loader.SIZE_LARGE,
21
+ },
22
+ };
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+
4
+ import { Skeleton } from '.';
5
+
6
+ // Skeleton is a plain .jsx component with defaultProps instead of inline
7
+ // destructuring defaults, so TS can't infer its props as optional on its own.
8
+ const TypedSkeleton = Skeleton as unknown as React.ComponentType<
9
+ {
10
+ className?: string;
11
+ as?: React.ElementType;
12
+ block?: boolean;
13
+ } & React.HTMLAttributes<HTMLElement>
14
+ >;
15
+
16
+ const meta = {
17
+ title: 'UI/Skeleton',
18
+ component: TypedSkeleton,
19
+ } satisfies Meta<typeof TypedSkeleton>;
20
+
21
+ export default meta;
22
+
23
+ type Story = StoryObj<typeof meta>;
24
+
25
+ export const MultipleTextLines: Story = {
26
+ render: () => (
27
+ <>
28
+ <TypedSkeleton as="h1" style={{ outline: '1px solid magenta' }} />
29
+ <TypedSkeleton as="h2" style={{ outline: '1px solid magenta' }} />
30
+ <TypedSkeleton as="p" style={{ outline: '1px solid magenta' }} />
31
+ <TypedSkeleton style={{ outline: '1px solid pink' }} />
32
+ </>
33
+ ),
34
+ };
35
+
36
+ export const Block: Story = {
37
+ render: () => (
38
+ <div style={{ outline: '1px solid magenta' }}>
39
+ <TypedSkeleton as="div" block />
40
+ </div>
41
+ ),
42
+ };
@@ -16,7 +16,6 @@
16
16
 
17
17
  .root thead th {
18
18
  border-width: 0 0 1px;
19
- text-transform: uppercase;
20
19
  vertical-align: top;
21
20
  background: var(--color-highlight);
22
21
  }
@@ -1,238 +1,264 @@
1
1
  import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
2
3
 
3
4
  import { getWrapperDecorator } from '../../stories';
4
5
  import { Table } from '.';
5
6
 
6
7
  const { THead, TBody, Td, Tr, Th } = Table;
7
8
 
8
- export default {
9
+ const meta = {
9
10
  title: 'UI/Table',
10
11
  component: Table,
11
12
  decorators: [getWrapperDecorator()],
13
+ } satisfies Meta<typeof Table>;
14
+
15
+ export default meta;
16
+
17
+ type Story = StoryObj<typeof meta>;
18
+
19
+ export const Default: Story = {
20
+ render: () => (
21
+ <Table>
22
+ <TBody>
23
+ <Tr>
24
+ <Td>a1</Td>
25
+ <Td>b1</Td>
26
+ <Td>c1</Td>
27
+ </Tr>
28
+ <Tr>
29
+ <Td>a2</Td>
30
+ <Td>b2</Td>
31
+ <Td>c2</Td>
32
+ </Tr>
33
+ <Tr>
34
+ <Td>a3</Td>
35
+ <Td>b3</Td>
36
+ <Td>c3</Td>
37
+ </Tr>
38
+ </TBody>
39
+ </Table>
40
+ ),
12
41
  };
13
42
 
14
- export const Default = () => (
15
- <Table>
16
- <TBody>
17
- <Tr>
18
- <Td>a1</Td>
19
- <Td>b1</Td>
20
- <Td>c1</Td>
21
- </Tr>
22
- <Tr>
23
- <Td>a2</Td>
24
- <Td>b2</Td>
25
- <Td>c2</Td>
26
- </Tr>
27
- <Tr>
28
- <Td>a3</Td>
29
- <Td>b3</Td>
30
- <Td>c3</Td>
31
- </Tr>
32
- </TBody>
33
- </Table>
34
- );
43
+ export const Compact: Story = {
44
+ render: () => (
45
+ <Table compact>
46
+ <TBody>
47
+ <Tr>
48
+ <Td>a1</Td>
49
+ <Td>b1</Td>
50
+ <Td>c1</Td>
51
+ </Tr>
52
+ <Tr>
53
+ <Td>a2</Td>
54
+ <Td>b2</Td>
55
+ <Td>c2</Td>
56
+ </Tr>
57
+ <Tr>
58
+ <Td>a3</Td>
59
+ <Td>b3</Td>
60
+ <Td>c3</Td>
61
+ </Tr>
62
+ </TBody>
63
+ </Table>
64
+ ),
65
+ };
35
66
 
36
- export const Compact = () => (
37
- <Table compact>
38
- <TBody>
39
- <Tr>
40
- <Td>a1</Td>
41
- <Td>b1</Td>
42
- <Td>c1</Td>
43
- </Tr>
44
- <Tr>
45
- <Td>a2</Td>
46
- <Td>b2</Td>
47
- <Td>c2</Td>
48
- </Tr>
49
- <Tr>
50
- <Td>a3</Td>
51
- <Td>b3</Td>
52
- <Td>c3</Td>
53
- </Tr>
54
- </TBody>
55
- </Table>
56
- );
67
+ export const Outline: Story = {
68
+ render: () => (
69
+ <Table outline>
70
+ <TBody>
71
+ <Tr>
72
+ <Td>a1</Td>
73
+ <Td>b1</Td>
74
+ <Td>c1</Td>
75
+ </Tr>
76
+ <Tr>
77
+ <Td>a2</Td>
78
+ <Td>b2</Td>
79
+ <Td>c2</Td>
80
+ </Tr>
81
+ <Tr>
82
+ <Td>a3</Td>
83
+ <Td>b3</Td>
84
+ <Td>c3</Td>
85
+ </Tr>
86
+ </TBody>
87
+ </Table>
88
+ ),
89
+ };
57
90
 
58
- export const Outline = () => (
59
- <Table outline>
60
- <TBody>
61
- <Tr>
62
- <Td>a1</Td>
63
- <Td>b1</Td>
64
- <Td>c1</Td>
65
- </Tr>
66
- <Tr>
67
- <Td>a2</Td>
68
- <Td>b2</Td>
69
- <Td>c2</Td>
70
- </Tr>
71
- <Tr>
72
- <Td>a3</Td>
73
- <Td>b3</Td>
74
- <Td>c3</Td>
75
- </Tr>
76
- </TBody>
77
- </Table>
78
- );
91
+ export const Empty: Story = {
92
+ render: () => <Table />,
93
+ };
79
94
 
80
- export const Empty = () => <Table />;
81
- export const EmptyWithCustomElement = () => (
82
- <Table emptyMessage={<p style={{ outline: '1px solid lightgray' }}>No items available</p>} />
83
- );
95
+ export const EmptyWithCustomElement: Story = {
96
+ render: () => (
97
+ <Table emptyMessage={<p style={{ outline: '1px solid lightgray' }}>No items available</p>} />
98
+ ),
99
+ };
84
100
 
85
- export const WithHeaders = () => (
86
- <Table>
87
- <THead>
88
- <Tr>
89
- <Th>Col A</Th>
90
- <Th>Col B</Th>
91
- <Th>Col C</Th>
92
- </Tr>
93
- </THead>
94
- <TBody>
95
- <Tr>
96
- <Td>a1</Td>
97
- <Td>b1</Td>
98
- <Td>c1</Td>
99
- </Tr>
100
- <Tr>
101
- <Td>a2</Td>
102
- <Td>b2</Td>
103
- <Td>c2</Td>
104
- </Tr>
105
- <Tr>
106
- <Td>a3</Td>
107
- <Td>b3</Td>
108
- <Td>c3</Td>
109
- </Tr>
110
- </TBody>
111
- </Table>
112
- );
101
+ export const WithHeaders: Story = {
102
+ render: () => (
103
+ <Table>
104
+ <THead>
105
+ <Tr>
106
+ <Th>Col A</Th>
107
+ <Th>Col B</Th>
108
+ <Th>Col C</Th>
109
+ </Tr>
110
+ </THead>
111
+ <TBody>
112
+ <Tr>
113
+ <Td>a1</Td>
114
+ <Td>b1</Td>
115
+ <Td>c1</Td>
116
+ </Tr>
117
+ <Tr>
118
+ <Td>a2</Td>
119
+ <Td>b2</Td>
120
+ <Td>c2</Td>
121
+ </Tr>
122
+ <Tr>
123
+ <Td>a3</Td>
124
+ <Td>b3</Td>
125
+ <Td>c3</Td>
126
+ </Tr>
127
+ </TBody>
128
+ </Table>
129
+ ),
130
+ };
113
131
 
114
- export const WithHeadersAndOutline = () => (
115
- <Table outline>
116
- <THead>
117
- <Tr>
118
- <Th>Col A</Th>
119
- <Th>Col B</Th>
120
- <Th>Col C</Th>
121
- </Tr>
122
- </THead>
123
- <TBody>
124
- <Tr>
125
- <Td>a1</Td>
126
- <Td>b1</Td>
127
- <Td>c1</Td>
128
- </Tr>
129
- <Tr>
130
- <Td>a2</Td>
131
- <Td>b2</Td>
132
- <Td>c2</Td>
133
- </Tr>
134
- <Tr>
135
- <Td>a3</Td>
136
- <Td>b3</Td>
137
- <Td>c3</Td>
138
- </Tr>
139
- </TBody>
140
- </Table>
141
- );
132
+ export const WithHeadersAndOutline: Story = {
133
+ render: () => (
134
+ <Table outline>
135
+ <THead>
136
+ <Tr>
137
+ <Th>Col A</Th>
138
+ <Th>Col B</Th>
139
+ <Th>Col C</Th>
140
+ </Tr>
141
+ </THead>
142
+ <TBody>
143
+ <Tr>
144
+ <Td>a1</Td>
145
+ <Td>b1</Td>
146
+ <Td>c1</Td>
147
+ </Tr>
148
+ <Tr>
149
+ <Td>a2</Td>
150
+ <Td>b2</Td>
151
+ <Td>c2</Td>
152
+ </Tr>
153
+ <Tr>
154
+ <Td>a3</Td>
155
+ <Td>b3</Td>
156
+ <Td>c3</Td>
157
+ </Tr>
158
+ </TBody>
159
+ </Table>
160
+ ),
161
+ };
142
162
 
143
- export const WithMultipleRowsHeader = () => (
144
- <Table>
145
- <THead>
146
- <Tr>
147
- <Th> </Th>
148
- <Th colSpan={2}>Colspan</Th>
149
- </Tr>
150
- <Tr>
151
- <Th>Col A</Th>
152
- <Th>Col B</Th>
153
- <Th>Col C</Th>
154
- </Tr>
155
- </THead>
156
- <TBody>
157
- <Tr>
158
- <Td>a1</Td>
159
- <Td>b1</Td>
160
- <Td>c1</Td>
161
- </Tr>
162
- <Tr>
163
- <Td>a2</Td>
164
- <Td>b2</Td>
165
- <Td>c2</Td>
166
- </Tr>
167
- <Tr>
168
- <Td>a3</Td>
169
- <Td>b3</Td>
170
- <Td>c3</Td>
171
- </Tr>
172
- </TBody>
173
- </Table>
174
- );
163
+ export const WithMultipleRowsHeader: Story = {
164
+ render: () => (
165
+ <Table>
166
+ <THead>
167
+ <Tr>
168
+ <Th> </Th>
169
+ <Th colSpan={2}>Colspan</Th>
170
+ </Tr>
171
+ <Tr>
172
+ <Th>Col A</Th>
173
+ <Th>Col B</Th>
174
+ <Th>Col C</Th>
175
+ </Tr>
176
+ </THead>
177
+ <TBody>
178
+ <Tr>
179
+ <Td>a1</Td>
180
+ <Td>b1</Td>
181
+ <Td>c1</Td>
182
+ </Tr>
183
+ <Tr>
184
+ <Td>a2</Td>
185
+ <Td>b2</Td>
186
+ <Td>c2</Td>
187
+ </Tr>
188
+ <Tr>
189
+ <Td>a3</Td>
190
+ <Td>b3</Td>
191
+ <Td>c3</Td>
192
+ </Tr>
193
+ </TBody>
194
+ </Table>
195
+ ),
196
+ };
175
197
 
176
- export const WithRowHeaders = () => (
177
- <Table>
178
- <TBody>
179
- <Tr>
180
- <Th>row 1</Th>
181
- <Td>a1</Td>
182
- <Td>b1</Td>
183
- <Td>c1</Td>
184
- </Tr>
185
- <Tr>
186
- <Th>row 2</Th>
187
- <Td>a2</Td>
188
- <Td>b2</Td>
189
- <Td>c2</Td>
190
- </Tr>
191
- <Tr>
192
- <Th>row 3</Th>
193
- <Td>a3</Td>
194
- <Td>b3</Td>
195
- <Td>c3</Td>
196
- </Tr>
197
- </TBody>
198
- </Table>
199
- );
198
+ export const WithRowHeaders: Story = {
199
+ render: () => (
200
+ <Table>
201
+ <TBody>
202
+ <Tr>
203
+ <Th>row 1</Th>
204
+ <Td>a1</Td>
205
+ <Td>b1</Td>
206
+ <Td>c1</Td>
207
+ </Tr>
208
+ <Tr>
209
+ <Th>row 2</Th>
210
+ <Td>a2</Td>
211
+ <Td>b2</Td>
212
+ <Td>c2</Td>
213
+ </Tr>
214
+ <Tr>
215
+ <Th>row 3</Th>
216
+ <Td>a3</Td>
217
+ <Td>b3</Td>
218
+ <Td>c3</Td>
219
+ </Tr>
220
+ </TBody>
221
+ </Table>
222
+ ),
223
+ };
200
224
 
201
- export const WithCustomContentAndAttributes = () => (
202
- <Table>
203
- <THead>
204
- <Tr>
205
- <Th> </Th>
206
- <Th style={{ textAlign: 'right' }}>Col A (right)</Th>
207
- <Th style={{ textAlign: 'center' }}>Col B (center)</Th>
208
- <Th style={{ textDecoration: 'underline' }}>Col C(underline)</Th>
209
- </Tr>
210
- </THead>
211
- <TBody>
212
- <Tr>
213
- <Th>
214
- <strong>row 1</strong>
215
- </Th>
216
- <Td style={{ textAlign: 'right' }}>a1</Td>
217
- <Td style={{ textAlign: 'center', color: 'red' }}>b1</Td>
218
- <Td style={{ textDecoration: 'underline' }}>c1</Td>
219
- </Tr>
220
- <Tr style={{ color: 'blue', fontSize: '1.5em' }}>
221
- <Th>
222
- <strong>row 2</strong>
223
- </Th>
224
- <Td style={{ textAlign: 'right' }}>a2</Td>
225
- <Td style={{ textAlign: 'center' }}>b2</Td>
226
- <Td style={{ textDecoration: 'underline' }}>c2</Td>
227
- </Tr>
228
- <Tr>
229
- <Th>
230
- <strong>row 3</strong>
231
- </Th>
232
- <Td style={{ textAlign: 'right' }}>a3</Td>
233
- <Td style={{ textAlign: 'center' }}>b3</Td>
234
- <Td style={{ textDecoration: 'underline' }}>c3</Td>
235
- </Tr>
236
- </TBody>
237
- </Table>
238
- );
225
+ export const WithCustomContentAndAttributes: Story = {
226
+ render: () => (
227
+ <Table>
228
+ <THead>
229
+ <Tr>
230
+ <Th> </Th>
231
+ <Th style={{ textAlign: 'right' }}>Col A (right)</Th>
232
+ <Th style={{ textAlign: 'center' }}>Col B (center)</Th>
233
+ <Th style={{ textDecoration: 'underline' }}>Col C(underline)</Th>
234
+ </Tr>
235
+ </THead>
236
+ <TBody>
237
+ <Tr>
238
+ <Th>
239
+ <strong>row 1</strong>
240
+ </Th>
241
+ <Td style={{ textAlign: 'right' }}>a1</Td>
242
+ <Td style={{ textAlign: 'center', color: 'red' }}>b1</Td>
243
+ <Td style={{ textDecoration: 'underline' }}>c1</Td>
244
+ </Tr>
245
+ <Tr style={{ color: 'blue', fontSize: '1.5em' }}>
246
+ <Th>
247
+ <strong>row 2</strong>
248
+ </Th>
249
+ <Td style={{ textAlign: 'right' }}>a2</Td>
250
+ <Td style={{ textAlign: 'center' }}>b2</Td>
251
+ <Td style={{ textDecoration: 'underline' }}>c2</Td>
252
+ </Tr>
253
+ <Tr>
254
+ <Th>
255
+ <strong>row 3</strong>
256
+ </Th>
257
+ <Td style={{ textAlign: 'right' }}>a3</Td>
258
+ <Td style={{ textAlign: 'center' }}>b3</Td>
259
+ <Td style={{ textDecoration: 'underline' }}>c3</Td>
260
+ </Tr>
261
+ </TBody>
262
+ </Table>
263
+ ),
264
+ };
@@ -1,9 +1,8 @@
1
- import React from 'react';
2
- import { Meta, Story } from '@storybook/react';
1
+ import type { Meta, StoryObj } from '@storybook/react';
3
2
 
4
- import { Tag } from '.';
3
+ import { Tag, TagProps } from '.';
5
4
 
6
- export default {
5
+ const meta = {
7
6
  title: 'UI/Tag',
8
7
  component: Tag,
9
8
  argTypes: {
@@ -19,14 +18,16 @@ export default {
19
18
  args: {
20
19
  children: 'tag',
21
20
  },
22
- } as Meta;
21
+ } satisfies Meta<TagProps>;
23
22
 
24
- const Template: Story = (args) => <Tag {...args} />;
23
+ export default meta;
25
24
 
26
- export const Default = Template.bind({});
25
+ type Story = StoryObj<typeof meta>;
27
26
 
28
- export const OneLetter = Template.bind({});
27
+ export const Default: Story = {};
29
28
 
30
- OneLetter.args = {
31
- children: 'd',
29
+ export const OneLetter: Story = {
30
+ args: {
31
+ children: 'd',
32
+ },
32
33
  };
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+
4
+ import { getWrapperDecorator } from '../../stories';
5
+ import { Toolbar } from '.';
6
+
7
+ // Toolbar is a plain .jsx component with defaultProps instead of inline
8
+ // destructuring defaults, so TS can't infer its props as optional on its own.
9
+ const TypedToolbar = Toolbar as unknown as React.ComponentType<{
10
+ className?: string;
11
+ children: React.ReactNode;
12
+ renderActions?: (params: { actionClassName: string }) => React.ReactNode;
13
+ }>;
14
+
15
+ const meta = {
16
+ title: 'UI/Toolbar',
17
+ component: TypedToolbar,
18
+ decorators: [getWrapperDecorator()],
19
+ } satisfies Meta<typeof TypedToolbar>;
20
+
21
+ export default meta;
22
+
23
+ type Story = StoryObj<typeof meta>;
24
+
25
+ export const Default: Story = {
26
+ args: {
27
+ children: <div>Content</div>,
28
+ },
29
+ };
30
+
31
+ export const WithActions: Story = {
32
+ args: {
33
+ children: 'Content',
34
+ renderActions: ({ actionClassName }) => (
35
+ <>
36
+ <div className={actionClassName}>Action 1</div>
37
+ <div className={actionClassName}>Action 2</div>
38
+ </>
39
+ ),
40
+ },
41
+ };