@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
@@ -4,21 +4,16 @@ import get from 'lodash/get';
4
4
  import { METRIC_COMPONENT_LINKS } from '@bundle-stats/utils';
5
5
 
6
6
  import {
7
- METRICS_WEBPACK_ASSETS,
7
+ METRICS_GROUP_ASSETS,
8
+ METRICS_GROUP_MODULES,
9
+ METRICS_GROUP_PACKAGES,
8
10
  METRICS_WEBPACK_GENERAL,
9
- METRICS_WEBPACK_MODULES,
10
- METRICS_WEBPACK_PACKAGES,
11
11
  } from '../../constants';
12
12
  import { Box } from '../../layout/box';
13
13
  import { ComponentLink } from '../component-link';
14
14
  import { MetricRunInfo, MetricRunInfoProps } from '../metric-run-info';
15
15
  import css from './summary.module.css';
16
-
17
- const METRICS_WEBPACK_OTHERS = [
18
- ...METRICS_WEBPACK_ASSETS,
19
- ...METRICS_WEBPACK_MODULES,
20
- ...METRICS_WEBPACK_PACKAGES,
21
- ];
16
+ import { Stack } from '../../layout';
22
17
 
23
18
  interface SummaryItemProps {
24
19
  metricId: string;
@@ -46,15 +41,7 @@ const SummaryItem = (props: SummaryItemProps & React.ComponentProps<'div'>) => {
46
41
  const metricData = get(data, metricId, { current: 0, baseline: 0 });
47
42
 
48
43
  return (
49
- <Box
50
- key={metricId}
51
- outline
52
- outlineHover
53
- padding="small"
54
- as={SummaryItemCustomLink}
55
- {...componentLink?.link}
56
- className={className}
57
- >
44
+ <SummaryItemCustomLink key={metricId} {...componentLink?.link} className={className}>
58
45
  <MetricRunInfo
59
46
  metricId={metricId}
60
47
  current={metricData.current}
@@ -64,7 +51,7 @@ const SummaryItem = (props: SummaryItemProps & React.ComponentProps<'div'>) => {
64
51
  size={size}
65
52
  loading={loading}
66
53
  />
67
- </Box>
54
+ </SummaryItemCustomLink>
68
55
  );
69
56
  };
70
57
 
@@ -90,38 +77,48 @@ export const Summary = ({
90
77
  summaryItemLink = ComponentLink,
91
78
  }: SummaryProps & React.ComponentProps<'div'>) => (
92
79
  <Box className={cx(css.root, className)}>
93
- <div className={css.wrapper}>
94
- <div className={css.items}>
95
- {METRICS_WEBPACK_GENERAL.map((metricId) => (
96
- <SummaryItem
97
- key={metricId}
98
- className={css.item}
99
- metricId={metricId}
100
- data={data}
101
- size="large"
102
- loading={loading}
103
- customLink={summaryItemLink}
104
- showDelta={showSummaryItemDelta}
105
- showBaseline={showSummaryItemBaseline}
106
- />
107
- ))}
108
- </div>
80
+ <div className={css.row}>
81
+ <Box outline padding="small" className={css.rowGroup}>
82
+ <div className={css.items}>
83
+ {METRICS_WEBPACK_GENERAL.map((metricId) => (
84
+ <SummaryItem
85
+ key={metricId}
86
+ className={css.item}
87
+ metricId={metricId}
88
+ data={data}
89
+ size="xlarge"
90
+ loading={loading}
91
+ customLink={summaryItemLink}
92
+ showDelta={showSummaryItemDelta}
93
+ showBaseline={showSummaryItemBaseline}
94
+ />
95
+ ))}
96
+ </div>
97
+ </Box>
109
98
  </div>
110
- <div className={css.wrapper}>
111
- <div className={css.items}>
112
- {METRICS_WEBPACK_OTHERS.map((metricId) => (
113
- <SummaryItem
114
- key={metricId}
115
- className={cx(css.item, css.itemSmall)}
116
- metricId={metricId}
117
- data={data}
118
- customLink={summaryItemLink}
119
- loading={loading}
120
- showDelta={showSummaryItemDelta}
121
- showBaseline={false}
122
- />
123
- ))}
124
- </div>
99
+ <div className={css.row}>
100
+ {[METRICS_GROUP_ASSETS, METRICS_GROUP_MODULES, METRICS_GROUP_PACKAGES].map((metricGroup) => (
101
+ <Stack className={css.rowGroup} key={metricGroup.title}>
102
+ <h3 className={css.rowGroupTitle}>{metricGroup.title}</h3>
103
+ <Box outline padding="small">
104
+ <div className={css.items}>
105
+ {metricGroup.metrics.map((metricId) => (
106
+ <SummaryItem
107
+ key={metricId}
108
+ className={css.item}
109
+ metricId={metricId}
110
+ data={data}
111
+ size="large"
112
+ loading={loading}
113
+ customLink={summaryItemLink}
114
+ showDelta={showSummaryItemDelta}
115
+ showBaseline={showSummaryItemBaseline}
116
+ />
117
+ ))}
118
+ </div>
119
+ </Box>
120
+ </Stack>
121
+ ))}
125
122
  </div>
126
123
  </Box>
127
124
  );
package/src/constants.ts CHANGED
@@ -36,6 +36,19 @@ export const METRICS_WEBPACK_MODULES = [
36
36
  ];
37
37
  export const METRICS_WEBPACK_PACKAGES = ['webpack.packageCount', 'webpack.duplicatePackagesCount'];
38
38
 
39
+ export const METRICS_GROUP_ASSETS = {
40
+ title: 'Assets',
41
+ metrics: METRICS_WEBPACK_ASSETS,
42
+ };
43
+ export const METRICS_GROUP_MODULES = {
44
+ title: 'Modules',
45
+ metrics: METRICS_WEBPACK_MODULES,
46
+ };
47
+ export const METRICS_GROUP_PACKAGES = {
48
+ title: 'Packages',
49
+ metrics: METRICS_WEBPACK_PACKAGES,
50
+ };
51
+
39
52
  export const SORT = {
40
53
  ASC: 'asc',
41
54
  DESC: 'desc',
@@ -1,4 +1,4 @@
1
- @import url('~modern-css-reset/dist/reset.css');
1
+ @import url('modern-css-reset/dist/reset.css');
2
2
 
3
3
  /** modern-css-reset updates */
4
4
  pre,
@@ -32,22 +32,21 @@
32
32
  --line-height-number: 1.2em;
33
33
 
34
34
  /*
35
- * Color scheme:
36
- * https://coolors.co/287acc-da444e-55b950-efcc1a-192339
37
- * http://mcg.mbitson.com/#!?mcgpalette0=%23da444e&mcgpalette1=%2355b950&mcgpalette2=%23ebc013&mcgpalette3=%232a2933&mcgpalette4=%23287acc&themename=bundle-stats
38
- * https://hihayk.github.io/scale/#4/5/50/90/-51/0/0/14/353138/53/49/56/white
35
+ * Color scheme: https://coolors.co/287acc-da444e-55b950-e5c110-192339-353538
39
36
  */
40
- --color-gray-25: #f9f9f9;
41
- --color-gray-50: #e5e5e7;
42
- --color-gray-100: #d2d2d4;
43
- --color-gray-200: #959499;
44
- --color-gray-300: #6a6970;
45
- --color-gray-400: #4a4952;
46
- --color-gray-500: #2a2933;
47
- --color-gray-600: #25242e;
48
- --color-gray-700: #1f1f27;
49
- --color-gray-800: #191920;
50
- --color-gray-900: #0f0f14;
37
+
38
+ --color-gray-25: #f9f9f9;
39
+ /** https://hihayk.github.io/scale/#4/5/60/90/0/-0/0/0/3F3F47/63/63/71/white */
40
+ --color-gray-50: #ececed;
41
+ --color-gray-100: #c9c9cc;
42
+ --color-gray-200: #a7a7aa;
43
+ --color-gray-300: #848489;
44
+ --color-gray-400: #626268;
45
+ --color-gray-500: #3f3f47;
46
+ --color-gray-600: #36363c;
47
+ --color-gray-700: #2c2c32;
48
+ --color-gray-800: #232327;
49
+ --color-gray-900: #19191c;
51
50
 
52
51
  --color-gray-ultra-light: var(--color-gray-200);
53
52
  --color-gray-light: var(--color-gray-300);
@@ -56,16 +55,17 @@
56
55
  --color-gray-ultra-dark: var(--color-gray-900);
57
56
 
58
57
  --color-red-25: #fdf5f6;
59
- --color-red-50: #fbe9ea;
60
- --color-red-100: #f4c7ca;
61
- --color-red-200: #eda2a7;
62
- --color-red-300: #e57c83;
63
- --color-red-400: #e06069;
58
+ /* https://hihayk.github.io/scale/#4/5/60/90/0/-0/0/100/DA444E/218/68/78/white */
59
+ --color-red-50: #fbeced;
60
+ --color-red-100: #f5cbcd;
61
+ --color-red-200: #eea9ae;
62
+ --color-red-300: #e7878e;
63
+ --color-red-400: #e1666e;
64
64
  --color-red-500: #da444e;
65
- --color-red-600: #d63e47;
66
- --color-red-700: #d0353d;
67
- --color-red-800: #cb2d35;
68
- --color-red-900: #c21f25;
65
+ --color-red-600: #c92a35;
66
+ --color-red-700: #b31520;
67
+ --color-red-800: #8c0710;
68
+ --color-red-900: #660005;
69
69
  --color-red-ultra-light: var(--color-red-100);
70
70
  --color-red-light: var(--color-red-300);
71
71
  --color-red: var(--color-red-500);
@@ -73,16 +73,17 @@
73
73
  --color-red-ultra-dark: var(--color-red-900);
74
74
 
75
75
  --color-blue-25: #f3f8fd;
76
- --color-blue-50: #e5eff9;
77
- --color-blue-100: #bfd7f0;
78
- --color-blue-200: #94bde6;
79
- --color-blue-300: #69a2db;
80
- --color-blue-400: #488ed4;
76
+ /* https://hihayk.github.io/scale/#4/5/60/90/0/-0/0/100/287ACC/40/122/204/white */
77
+ --color-blue-50: #eaf2fa;
78
+ --color-blue-100: #c3daf1;
79
+ --color-blue-200: #9cc2e8;
80
+ --color-blue-300: #75aade;
81
+ --color-blue-400: #4f92d5;
81
82
  --color-blue-500: #287acc;
82
- --color-blue-600: #2472c7;
83
- --color-blue-700: #1e67c0;
84
- --color-blue-800: #185db9;
85
- --color-blue-900: #0f4aad;
83
+ --color-blue-600: #1168bf;
84
+ --color-blue-700: #0055ac;
85
+ --color-blue-800: #00438c;
86
+ --color-blue-900: #003166;
86
87
 
87
88
  --color-blue-ultra-light: var(--color-blue-100);
88
89
  --color-blue-light: var(--color-blue-300);
@@ -91,16 +92,17 @@
91
92
  --color-blue-ultra-dark: var(--color-blue-900);
92
93
 
93
94
  --color-green-25: #f6fbf6;
94
- --color-green-50: #ebf7ea;
95
- --color-green-100: #cceacb;
96
- --color-green-200: #aadca8;
97
- --color-green-300: #88ce85;
98
- --color-green-400: #6fc46a;
99
- --color-green-500: #55b950;
100
- --color-green-600: #4eb249;
101
- --color-green-700: #44aa40;
102
- --color-green-800: #3ba237;
103
- --color-green-900: #2a9327;
95
+ /* https://hihayk.github.io/scale/#4/5/60/90/0/-0/0/100/55b950/85/185/80/white */
96
+ --color-green-50: #eef8ee;
97
+ --color-green-100: #cfebce;
98
+ --color-green-200: #b1dfaf;
99
+ --color-green-300: #92d28f;
100
+ --color-green-400: #74c670;
101
+ --color-green-500: #55B950;
102
+ --color-green-600: #3ea839;
103
+ --color-green-700: #2b9426;
104
+ --color-green-800: #1b7b16;
105
+ --color-green-900: #0f5f0b;
104
106
 
105
107
  --color-green-ultra-light: var(--color-green-100);
106
108
  --color-green-light: var(--color-green-300);
@@ -109,18 +111,18 @@
109
111
  --color-green-ultra-dark: var(--color-green-900);
110
112
 
111
113
  --color-yellow-25: #fffdf2;
112
- --color-yellow-50: #fdf7e3;
113
- --color-yellow-100: #f9ecb8;
114
- --color-yellow-200: #f5e089;
115
- --color-yellow-300: #f1d35a;
116
- --color-yellow-400: #eec936;
117
- --color-yellow-500: #ebc013;
118
- --color-yellow-600: #e9ba11;
119
- --color-yellow-700: #e5b20e;
120
- --color-yellow-800: #e2aa0b;
121
- --color-yellow-900: #dd9c06;
122
-
123
- --color-yellow-light-background: var(--color-yellow-25);
114
+ /* https://hihayk.github.io/scale/#4/5/40/80/0/-0/0/0/E5C110/229/193/16/white */
115
+ --color-yellow-50: #faf3cf;
116
+ --color-yellow-100: #f6e9a9;
117
+ --color-yellow-200: #f2df83;
118
+ --color-yellow-300: #edd55d;
119
+ --color-yellow-400: #e9cb36;
120
+ --color-yellow-500: #e5c110;
121
+ --color-yellow-600: #ceae0e;
122
+ --color-yellow-700: #b79a0d;
123
+ --color-yellow-800: #a0870b;
124
+ --color-yellow-900: #89740a;
125
+
124
126
  --color-yellow-ultra-light: var(--color-yellow-100);
125
127
  --color-yellow-light: var(--color-yellow-300);
126
128
  --color-yellow: var(--color-yellow-500);
@@ -130,11 +132,13 @@
130
132
  --color-dark: #111;
131
133
  --color-light: #fff;
132
134
 
133
- /* Functional color variables */
134
135
  --color-branding-light: #2b76d4;
135
136
  --color-branding: #1a477f;
136
137
  --color-branding-dark: #09182a;
138
+ }
137
139
 
140
+ body {
141
+ /* Functional color variables */
138
142
  --color-text-ultra-light: var(--color-gray-ultra-light);
139
143
  --color-text-light: var(--color-gray-light);
140
144
  --color-text: var(--color-gray);
@@ -183,8 +187,8 @@
183
187
  --color-backdrop: rgba(0, 0, 0, 0.05);
184
188
  --color-shadow: rgba(0, 0, 0, 0.25);
185
189
 
186
- --transition-duration-in: 0.2s;
187
- --transition-duration-out: 0.17s;
190
+ --transition-duration-in: 0.16s;
191
+ --transition-duration-out: 0.10s;
188
192
  --transition-in: all var(--transition-duration-in) ease-in;
189
193
  --transition-out: all var(--transition-duration-out) ease-out;
190
194
 
@@ -219,3 +223,12 @@
219
223
  --entry-info-width: 64rem;
220
224
  --entry-info-top: var(--header-height);
221
225
  }
226
+
227
+ @media (prefers-reduced-motion: reduce) {
228
+ * {
229
+ animation-duration: 0s !important;
230
+ animation-delay: 0s !important;
231
+ transition-duration: 0s !important;
232
+ transition-delay: 0s !important;
233
+ }
234
+ }
@@ -20,15 +20,18 @@ const getSortDirection = (directionParam: string | undefined): SortAction['direc
20
20
  return '';
21
21
  };
22
22
 
23
- export const getSortFn =
24
- <TRow>(fieldPath: string, getCustomSort: UseRowsSortParams<TRow>['getCustomSort']) =>
25
- (item: TRow) => {
23
+ export function getSortFn<TRow>(
24
+ fieldPath: string,
25
+ getCustomSort: UseRowsSortParams<TRow>['getCustomSort'],
26
+ ) {
27
+ return (item: TRow) => {
26
28
  if (!fieldPath) {
27
29
  return getCustomSort(item);
28
30
  }
29
31
 
30
32
  return get(item, fieldPath) || 0;
31
33
  };
34
+ }
32
35
 
33
36
  interface UseRowsSortParams<TRow> {
34
37
  rows: Array<TRow>;
@@ -47,13 +50,13 @@ interface UseRowsSort<TRow> {
47
50
  updateSort: (params: SortAction) => void;
48
51
  }
49
52
 
50
- export const useRowsSort = <TRow>({
53
+ export function useRowsSort<TRow>({
51
54
  rows,
52
55
  initialField = 'runs[0].delta',
53
56
  initialDirection = 'desc',
54
57
  getCustomSort,
55
58
  setQueryState,
56
- }: UseRowsSortParams<TRow>): UseRowsSort<TRow> => {
59
+ }: UseRowsSortParams<TRow>): UseRowsSort<TRow> {
57
60
  const [sort, setSort] = useState({
58
61
  field: initialField,
59
62
  direction: getSortDirection(initialDirection),
@@ -85,4 +88,4 @@ export const useRowsSort = <TRow>({
85
88
  updateSort,
86
89
  items: orderedRows,
87
90
  };
88
- };
91
+ }
@@ -1,49 +1,56 @@
1
- import React from 'react';
2
- import type { Meta, Story } from '@storybook/react';
1
+ import type { Meta, StoryObj } from '@storybook/react';
3
2
 
4
3
  import { getWrapperDecorator } from '../../stories';
5
4
  import { Box } from '.';
6
5
 
7
- export default {
6
+ const meta = {
8
7
  title: 'Layout/Box',
9
8
  component: Box,
10
9
  decorators: [getWrapperDecorator()],
11
- } as Meta<typeof Box>;
10
+ args: {
11
+ style: { border: '1px dotted magenta' },
12
+ children: 'Lorem ipsum',
13
+ },
14
+ } satisfies Meta<typeof Box>;
12
15
 
13
- const Template: Story = (props: any) => (
14
- <Box style={{ border: '1px dotted magenta' }} {...props}>
15
- Lorem ipsum
16
- </Box>
17
- );
16
+ export default meta;
18
17
 
19
- export const Default = Template.bind({});
18
+ type Story = StoryObj<typeof meta>;
20
19
 
21
- export const WithPadding = Template.bind({});
22
- WithPadding.args = {
23
- padding: 'medium',
20
+ export const Default: Story = {};
21
+
22
+ export const WithPadding: Story = {
23
+ args: {
24
+ padding: 'medium',
25
+ },
24
26
  };
25
27
 
26
- export const WithHorizontalPadding = Template.bind({});
27
- WithHorizontalPadding.args = {
28
- horizontalPadding: 'medium',
28
+ export const WithHorizontalPadding: Story = {
29
+ args: {
30
+ horizontalPadding: 'medium',
31
+ },
29
32
  };
30
33
 
31
- export const WithVerticalPadding = Template.bind({});
32
- WithVerticalPadding.args = {
33
- verticalPadding: 'medium',
34
+ export const WithVerticalPadding: Story = {
35
+ args: {
36
+ verticalPadding: 'medium',
37
+ },
34
38
  };
35
39
 
36
- export const WithHorizontalAndVerticalPadding = Template.bind({});
37
- WithHorizontalAndVerticalPadding.args = {
38
- padding: ['xxsmall', 'medium'],
40
+ export const WithHorizontalAndVerticalPadding: Story = {
41
+ args: {
42
+ padding: ['xxsmall', 'medium'],
43
+ },
39
44
  };
40
45
 
41
- export const WithOutline = Template.bind({});
42
- WithOutline.args = {
43
- outline: true,
46
+ export const WithOutline: Story = {
47
+ args: {
48
+ outline: true,
49
+ },
44
50
  };
45
51
 
46
- export const WithOutlineHover = Template.bind({});
47
- WithOutlineHover.args = {
48
- outlineHover: true,
52
+ export const WithOutlineHover: Story = {
53
+ args: {
54
+ outlineHover: true,
55
+ },
49
56
  };
@@ -1,59 +1,90 @@
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 { Box } from '../box';
5
6
  import { FlexStack } from '.';
6
7
 
7
- export default {
8
+ const meta = {
8
9
  title: 'Layout/FlexStack',
9
10
  component: FlexStack,
10
11
  decorators: [getWrapperDecorator()],
12
+ } satisfies Meta<typeof FlexStack>;
13
+
14
+ export default meta;
15
+
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ export const Default: Story = {
19
+ args: {
20
+ children: (
21
+ <>
22
+ <Box outline>Lorem ipsum 1</Box>
23
+ <Box outline>Lorem ipsum 2</Box>
24
+ {null}
25
+ Lorem ipsum 3
26
+ </>
27
+ ),
28
+ },
29
+ };
30
+
31
+ export const withCustomWrapper: Story = {
32
+ args: {
33
+ as: 'main',
34
+ className: 'wrapper',
35
+ children: (
36
+ <>
37
+ <Box outline>Lorem ipsum 1</Box>
38
+ <Box outline>Lorem ipsum 2</Box>
39
+ </>
40
+ ),
41
+ },
42
+ };
43
+
44
+ export const withLargeSpace: Story = {
45
+ args: {
46
+ space: 'large',
47
+ children: (
48
+ <>
49
+ <Box outline>Lorem ipsum 1</Box>
50
+ <Box outline>Lorem ipsum 2</Box>
51
+ <Box outline>Lorem ipsum 3</Box>
52
+ </>
53
+ ),
54
+ },
55
+ };
56
+
57
+ export const withNestedStack: Story = {
58
+ args: {
59
+ space: 'large',
60
+ children: (
61
+ <>
62
+ <Box outline>Lorem ipsum 1</Box>
63
+ <Box outline>Lorem ipsum 2</Box>
64
+ <FlexStack space="small">
65
+ <Box outline>Lorem ipsum 3.1</Box>
66
+ <Box outline>Lorem ipsum 3.2</Box>
67
+ </FlexStack>
68
+ </>
69
+ ),
70
+ },
11
71
  };
12
72
 
13
- export const Default = () => (
14
- <FlexStack>
15
- <Box outline>Lorem ipsum 1</Box>
16
- <Box outline>Lorem ipsum 2</Box>
17
- {null}
18
- Lorem ipsum 3
19
- </FlexStack>
20
- );
21
-
22
- export const withCustomWrapper = () => (
23
- <FlexStack as="main" className="wrapper">
24
- <Box outline>Lorem ipsum 1</Box>
25
- <Box outline>Lorem ipsum 2</Box>
26
- </FlexStack>
27
- );
28
-
29
- export const withLargeSpace = () => (
30
- <FlexStack space="large">
31
- <Box outline>Lorem ipsum 1</Box>
32
- <Box outline>Lorem ipsum 2</Box>
33
- <Box outline>Lorem ipsum 3</Box>
34
- </FlexStack>
35
- );
36
-
37
- export const withNestedStack = () => (
38
- <FlexStack space="large">
39
- <Box outline>Lorem ipsum 1</Box>
40
- <Box outline>Lorem ipsum 2</Box>
41
- <FlexStack space="small">
42
- <Box outline>Lorem ipsum 3.1</Box>
43
- <Box outline>Lorem ipsum 3.2</Box>
44
- </FlexStack>
45
- </FlexStack>
46
- );
47
-
48
- export const singleItem = () => (
49
- <FlexStack>
50
- <Box outline>Lorem ipsum</Box>
51
- </FlexStack>
52
- );
53
-
54
- export const withAlignItems = () => (
55
- <FlexStack alignItems="center" space="medium">
56
- <h1>Title</h1>
57
- <a href="#test">Option 1</a>
58
- </FlexStack>
59
- );
73
+ export const singleItem: Story = {
74
+ args: {
75
+ children: <Box outline>Lorem ipsum</Box>,
76
+ },
77
+ };
78
+
79
+ export const withAlignItems: Story = {
80
+ args: {
81
+ alignItems: 'center',
82
+ space: 'medium',
83
+ children: (
84
+ <>
85
+ <h1>Title</h1>
86
+ <a href="#test">Option 1</a>
87
+ </>
88
+ ),
89
+ },
90
+ };
@@ -0,0 +1,30 @@
1
+ import type React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+
4
+ import { getWrapperDecorator } from '../../stories';
5
+ import { Footer } from '.';
6
+
7
+ // Footer 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 TypedFooter = Footer as unknown as React.ComponentType<{
10
+ className?: string;
11
+ version?: string;
12
+ }>;
13
+
14
+ const meta = {
15
+ title: 'Layout/Footer',
16
+ component: TypedFooter,
17
+ decorators: [getWrapperDecorator()],
18
+ } satisfies Meta<typeof TypedFooter>;
19
+
20
+ export default meta;
21
+
22
+ type Story = StoryObj<typeof meta>;
23
+
24
+ export const Default: Story = {};
25
+
26
+ export const WithVersion: Story = {
27
+ args: {
28
+ version: '1.0.0',
29
+ },
30
+ };