@bundle-stats/ui 3.2.5-beta.1 → 3.2.6-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 (74) hide show
  1. package/CHANGELOG.md +28 -3
  2. package/lib/app/app.module.css +7 -0
  3. package/lib/components/bundle-assets/bundle-assets.js +15 -7
  4. package/lib/components/bundle-assets/bundle-assets.module.css +13 -26
  5. package/lib/components/bundle-packages/bundle-packages.js +8 -4
  6. package/lib/components/bundle-packages/bundle-packages.module.css +4 -12
  7. package/lib/components/delta/delta.module.css +1 -0
  8. package/lib/components/metrics-table-search/metrics-table-search.module.css +5 -4
  9. package/lib/css/default.css +14 -3
  10. package/lib/css/variables.css +18 -18
  11. package/lib/layout/box/box.module.css +9 -0
  12. package/lib/layout/index.js +8 -0
  13. package/lib/layout/separator.js +48 -0
  14. package/lib/layout/separator.module.css +5 -0
  15. package/lib/ui/dropdown/dropdown.js +1 -2
  16. package/lib/ui/dropdown/dropdown.module.css +7 -8
  17. package/lib/ui/filters/filters.js +10 -5
  18. package/lib/ui/filters/filters.module.css +10 -0
  19. package/lib/ui/index.js +8 -0
  20. package/lib/ui/table/table.module.css +0 -4
  21. package/lib/ui/tag/index.js +18 -0
  22. package/lib/ui/tag/tag.js +72 -0
  23. package/lib/ui/tag/tag.module.css +55 -0
  24. package/lib/ui/tag/tag.stories.js +38 -0
  25. package/lib/ui/tooltip/tooltip.module.css +1 -1
  26. package/lib-esm/app/app.module.css +7 -0
  27. package/lib-esm/components/bundle-assets/bundle-assets.js +14 -7
  28. package/lib-esm/components/bundle-assets/bundle-assets.module.css +13 -26
  29. package/lib-esm/components/bundle-packages/bundle-packages.js +7 -4
  30. package/lib-esm/components/bundle-packages/bundle-packages.module.css +4 -12
  31. package/lib-esm/components/delta/delta.module.css +1 -0
  32. package/lib-esm/components/metrics-table-search/metrics-table-search.module.css +5 -4
  33. package/lib-esm/css/default.css +14 -3
  34. package/lib-esm/css/variables.css +18 -18
  35. package/lib-esm/layout/box/box.module.css +9 -0
  36. package/lib-esm/layout/index.js +1 -0
  37. package/lib-esm/layout/separator.js +28 -0
  38. package/lib-esm/layout/separator.module.css +5 -0
  39. package/lib-esm/ui/dropdown/dropdown.js +1 -2
  40. package/lib-esm/ui/dropdown/dropdown.module.css +7 -8
  41. package/lib-esm/ui/filters/filters.js +9 -4
  42. package/lib-esm/ui/filters/filters.module.css +10 -0
  43. package/lib-esm/ui/index.js +1 -0
  44. package/lib-esm/ui/table/table.module.css +0 -4
  45. package/lib-esm/ui/tag/index.js +1 -0
  46. package/lib-esm/ui/tag/tag.js +45 -0
  47. package/lib-esm/ui/tag/tag.module.css +55 -0
  48. package/lib-esm/ui/tag/tag.stories.js +23 -0
  49. package/lib-esm/ui/tooltip/tooltip.module.css +1 -1
  50. package/package.json +17 -16
  51. package/src/app/app.jsx +6 -2
  52. package/src/app/app.module.css +7 -0
  53. package/src/components/bundle-assets/bundle-assets.jsx +58 -41
  54. package/src/components/bundle-assets/bundle-assets.module.css +13 -26
  55. package/src/components/bundle-packages/bundle-packages.jsx +10 -5
  56. package/src/components/bundle-packages/bundle-packages.module.css +4 -12
  57. package/src/components/delta/delta.module.css +1 -0
  58. package/src/components/metrics-table-search/metrics-table-search.module.css +5 -4
  59. package/src/css/default.css +14 -3
  60. package/src/css/variables.css +18 -18
  61. package/src/layout/box/box.module.css +9 -0
  62. package/src/layout/index.js +1 -0
  63. package/src/layout/separator.jsx +25 -0
  64. package/src/layout/separator.module.css +5 -0
  65. package/src/ui/dropdown/dropdown.jsx +4 -6
  66. package/src/ui/dropdown/dropdown.module.css +7 -8
  67. package/src/ui/filters/filters.jsx +53 -50
  68. package/src/ui/filters/filters.module.css +10 -0
  69. package/src/ui/index.js +1 -0
  70. package/src/ui/table/table.module.css +0 -4
  71. package/src/ui/tag/index.js +1 -0
  72. package/src/ui/tag/tag.jsx +49 -0
  73. package/src/ui/tag/tag.module.css +55 -0
  74. package/src/ui/tooltip/tooltip.module.css +1 -1
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import cx from 'classnames';
4
+
5
+ import css from './separator.module.css';
6
+
7
+ const propTypes = {
8
+ className: PropTypes.string,
9
+ };
10
+
11
+ const defaultProps = {
12
+ className: '',
13
+ };
14
+
15
+ /**
16
+ * @param {PropTypes.InferProps<typeof propTypes>} props
17
+ * @return {React.FunctionComponentElement}
18
+ */
19
+ export const Separator = (props) => {
20
+ const { className, ...restProps } = props;
21
+ return <div className={cx(css.root, className)} {...restProps} />;
22
+ };
23
+
24
+ Separator.propTypes = propTypes;
25
+ Separator.defaultProps = defaultProps;
@@ -0,0 +1,5 @@
1
+ .root {
2
+ background: var(--color-outline);
3
+ width: 100%;
4
+ height: 1px;
5
+ }
@@ -11,27 +11,25 @@ export const Dropdown = (props) => {
11
11
  const { className, label, ariaLabel, glyph, activeLabel, children } = props;
12
12
  const rootClassName = cx(css.root, activeLabel && css.activeLabel, className);
13
13
 
14
- const menu = useMenuState({baseId: process.env.NODE_ENV === 'test' && 'id-test', modal: true });
14
+ const menu = useMenuState({ baseId: process.env.NODE_ENV === 'test' && 'id-test', modal: true });
15
15
 
16
16
  return (
17
17
  <>
18
18
  <MenuButton {...menu} className={rootClassName} tabIndex={null}>
19
- <FlexStack space="xxxsmall" className={css.label}>
19
+ <FlexStack space="xxxsmall">
20
20
  {glyph && <Icon className={css.labelIcon} glyph={glyph} />}
21
21
  {label}
22
22
  </FlexStack>
23
23
  </MenuButton>
24
24
  <Menu {...menu} aria-label={ariaLabel || label} className={css.dropdown}>
25
25
  {typeof children === 'function'
26
- ?
27
- children({
26
+ ? children({
28
27
  MenuItem,
29
28
  menu,
30
29
  menuItemClassName: css.menuItem,
31
30
  menuItemActiveClassName: css.menuItemActive,
32
31
  })
33
- : children
34
- }
32
+ : children}
35
33
  </Menu>
36
34
  </>
37
35
  );
@@ -2,15 +2,9 @@
2
2
  background: none;
3
3
  border: none;
4
4
  padding: 0;
5
- }
6
5
 
7
- .root:focus {
8
- outline: none;
9
- box-shadow: 0 0 var(--space-xxxsmall) var(--color-shadow);
10
- }
11
-
12
- .label {
13
6
  border: 1px solid var(--color-outline);
7
+ border-radius: var(--radius-small);
14
8
  padding: calc(var(--space-xxsmall) - 1px);
15
9
  display: flex;
16
10
  align-items: center;
@@ -24,7 +18,11 @@
24
18
  color: var(--color-text-light);
25
19
  }
26
20
 
27
- .label:hover {
21
+ .root:hover,
22
+ .root:focus,
23
+ .root:active {
24
+ outline: none;
25
+ box-shadow: 0 0 var(--space-xxxsmall) var(--color-shadow);
28
26
  border-color: var(--color-outline-dark);
29
27
  color: var(--color-text);
30
28
  }
@@ -33,6 +31,7 @@
33
31
  position: absolute;
34
32
  left: 0;
35
33
  top: 100%;
34
+ border-radius: var(--radius-medium);
36
35
  box-shadow: 0 2px var(--space-xxsmall) var(--color-shadow);
37
36
  background: var(--color-background);
38
37
  min-width: 180px;
@@ -18,25 +18,15 @@ const Filter = (props) => {
18
18
  <div className={rootClassName}>
19
19
  {/* eslint-disable */}
20
20
  <FlexStack space="xxxsmall" as="label" className={css.filterCheckbox}>
21
- {/* eslint-enabled */}
22
- <input
23
- className={css.filterInput}
24
- type="checkbox"
25
- id={id}
26
- name={name}
27
- {...inputProps}
28
- />
21
+ {/* eslint-enabled */}
22
+ <input className={css.filterInput} type="checkbox" id={id} name={name} {...inputProps} />
29
23
  <span className={css.filterLabel} title={label}>
30
24
  {label}
31
25
  </span>
32
26
  </FlexStack>
33
27
 
34
28
  {getOnOnlyClick && (
35
- <button
36
- className={css.filterOnlyButton}
37
- type="button"
38
- onClick={getOnOnlyClick(name)}
39
- >
29
+ <button className={css.filterOnlyButton} type="button" onClick={getOnOnlyClick(name)}>
40
30
  only
41
31
  </button>
42
32
  )}
@@ -57,13 +47,17 @@ Filter.defaultProps = {
57
47
  };
58
48
 
59
49
  const FilterGroup = (props) => {
60
- const { groupKey, data, values, onCheckboxChange, toggleFilters } = props;
50
+ const { className, groupKey, data, values, onCheckboxChange, toggleFilters } = props;
61
51
 
62
52
  const { label: groupLabel, ...groupData } = data;
63
53
 
64
54
  const groupItems = Object.entries(groupData);
65
- const groupCheckboxes = groupItems.filter(([itemKey, item]) => typeof item?.defaultValue !== 'undefined');
66
- const isGroupChecked = groupCheckboxes.map(([itemKey]) => get(values, `${groupKey}.${itemKey}`)).reduce((agg, val) => agg && val, true);
55
+ const groupCheckboxes = groupItems.filter(
56
+ ([itemKey, item]) => typeof item?.defaultValue !== 'undefined',
57
+ );
58
+ const isGroupChecked = groupCheckboxes
59
+ .map(([itemKey]) => get(values, `${groupKey}.${itemKey}`))
60
+ .reduce((agg, val) => agg && val, true);
67
61
 
68
62
  const filterSuffix = getGroupFiltersLabelSuffix(groupItems);
69
63
  const hasCustomFilterSuffix = !Object.values(LABELS).includes(filterSuffix);
@@ -71,26 +65,33 @@ const FilterGroup = (props) => {
71
65
  <>
72
66
  {`${groupLabel}:`}
73
67
  &nbsp;
74
- <span className={cx(hasCustomFilterSuffix && css.labelSuffixCustom)}>
75
- {filterSuffix}
76
- </span>
68
+ <span className={cx(hasCustomFilterSuffix && css.labelSuffixCustom)}>{filterSuffix}</span>
77
69
  </>
78
70
  );
79
71
 
80
- const getOnGroupCheck = (value, overrides = {}) => () => {
81
- const newFilters = groupCheckboxes.reduce((agg, [itemKey]) => ({
82
- ...agg,
83
- [`${groupKey}.${itemKey}`]: value,
84
- }), {});
85
-
86
- toggleFilters({
87
- ...newFilters,
88
- ...overrides,
89
- });
90
- };
72
+ const getOnGroupCheck =
73
+ (value, overrides = {}) =>
74
+ () => {
75
+ const newFilters = groupCheckboxes.reduce(
76
+ (agg, [itemKey]) => ({
77
+ ...agg,
78
+ [`${groupKey}.${itemKey}`]: value,
79
+ }),
80
+ {},
81
+ );
82
+
83
+ toggleFilters({
84
+ ...newFilters,
85
+ ...overrides,
86
+ });
87
+ };
91
88
 
92
89
  return (
93
- <Dropdown label={dropdownLabel} ariaLabel={`${groupLabel}: ${filterSuffix}`}>
90
+ <Dropdown
91
+ className={className}
92
+ label={dropdownLabel}
93
+ ariaLabel={`${groupLabel}: ${filterSuffix}`}
94
+ >
94
95
  {({ MenuItem, menu, menuItemClassName }) => {
95
96
  return (
96
97
  <>
@@ -100,7 +101,11 @@ const FilterGroup = (props) => {
100
101
  const getOnOnlyClick = () => getOnGroupCheck(false, { [id]: true });
101
102
 
102
103
  return (
103
- <MenuItem key={id} {...menu} className={cx(menuItemClassName, css.filterGroupItem)}>
104
+ <MenuItem
105
+ key={id}
106
+ {...menu}
107
+ className={cx(menuItemClassName, css.filterGroupItem)}
108
+ >
104
109
  <Filter
105
110
  name={id}
106
111
  label={itemData.label}
@@ -138,12 +143,13 @@ const FilterGroup = (props) => {
138
143
  </div>
139
144
  </>
140
145
  );
141
- }}
146
+ }}
142
147
  </Dropdown>
143
148
  );
144
149
  };
145
150
 
146
151
  FilterGroup.propTypes = {
152
+ className: PropTypes.string,
147
153
  groupKey: PropTypes.string.isRequired,
148
154
  data: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
149
155
  values: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
@@ -151,14 +157,12 @@ FilterGroup.propTypes = {
151
157
  toggleFilters: PropTypes.func.isRequired,
152
158
  };
153
159
 
160
+ FilterGroup.defaultProps = {
161
+ className: '',
162
+ };
163
+
154
164
  export const Filters = (props) => {
155
- const {
156
- className,
157
- values,
158
- filters,
159
- toggleFilter,
160
- toggleFilters,
161
- } = props;
165
+ const { className, values, filters, toggleFilter, toggleFilters } = props;
162
166
 
163
167
  const onCheckboxChange = ({ target }) => toggleFilter(target.name, target.checked);
164
168
  const rootClassName = cx(css.root, className);
@@ -182,16 +186,15 @@ export const Filters = (props) => {
182
186
  }
183
187
 
184
188
  return (
185
- <div className={css.item}>
186
- <FilterGroup
187
- key={name}
188
- groupKey={name}
189
- data={data}
190
- values={values}
191
- onCheckboxChange={onCheckboxChange}
192
- toggleFilters={toggleFilters}
193
- />
194
- </div>
189
+ <FilterGroup
190
+ className={css.item}
191
+ key={name}
192
+ groupKey={name}
193
+ data={data}
194
+ values={values}
195
+ onCheckboxChange={onCheckboxChange}
196
+ toggleFilters={toggleFilters}
197
+ />
195
198
  );
196
199
  })}
197
200
  </FlexStack>
@@ -11,6 +11,7 @@
11
11
  }
12
12
 
13
13
  .filterInput {
14
+ border-radius: var(--radius-small) 0 0 var(--radius-small);
14
15
  flex: 0 0 auto;
15
16
  height: 1em;
16
17
  cursor: pointer;
@@ -129,11 +130,20 @@
129
130
  }
130
131
 
131
132
  .item {
133
+ border-radius: 0;
132
134
  position: relative;
133
135
  flex: 0 0 auto;
134
136
  margin-right: -1px;
135
137
  }
136
138
 
139
+ .item:first-child {
140
+ border-radius: var(--radius-small) 0 0 var(--radius-small);
141
+ }
142
+
143
+ .item:last-child {
144
+ border-radius: 0 var(--radius-small) var(--radius-small) 0;
145
+ }
146
+
137
147
  .item:hover {
138
148
  z-index: var(--layer-low); /* show collapsed border */
139
149
  }
package/src/ui/index.js CHANGED
@@ -15,4 +15,5 @@ export { Skeleton } from './skeleton';
15
15
  export { SortDropdown } from './sort-dropdown';
16
16
  export { Table } from './table';
17
17
  export { Tabs } from './tabs';
18
+ export { Tag } from './tag';
18
19
  export { Tooltip } from './tooltip';
@@ -13,10 +13,6 @@
13
13
  text-align: left;
14
14
  }
15
15
 
16
- tr:last-child .cell {
17
- border-bottom-width: 1px;
18
- }
19
-
20
16
  .root thead .cell {
21
17
  border-width: 0 0 2px;
22
18
  text-transform: uppercase;
@@ -0,0 +1 @@
1
+ export * from './tag';
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import cx from 'classnames';
4
+
5
+ import css from './tag.module.css';
6
+
7
+ export const KINDS = {
8
+ DEFAULT: 'default',
9
+ SUCCESS: 'success',
10
+ INFO: 'info',
11
+ WARNING: 'warning',
12
+ DANGER: 'danger',
13
+ };
14
+
15
+ export const SIZES = {
16
+ SMALL: 'small',
17
+ MEDIUM: 'medium',
18
+ LARGE: 'large',
19
+ };
20
+
21
+ export const Tag = (props) => {
22
+ const {
23
+ className = '',
24
+ as: Component = 'span',
25
+ kind = KINDS.DEFAULT,
26
+ size = SIZES.MEDIUM,
27
+ ...restProps
28
+ } = props;
29
+ const rootClassName = cx(css.root, className, css[kind], css[size]);
30
+
31
+ return <Component className={rootClassName} {...restProps} />;
32
+ };
33
+
34
+ Tag.propTypes = {
35
+ className: PropTypes.string,
36
+ as: PropTypes.elementType,
37
+ kind: PropTypes.oneOf(Object.values(KINDS)),
38
+ size: PropTypes.oneOf(Object.values(SIZES)),
39
+ };
40
+
41
+ Tag.defaultProps = {
42
+ className: '',
43
+ as: 'span',
44
+ kind: KINDS.DEFAULT,
45
+ size: SIZES.MEDIUM,
46
+ };
47
+
48
+ Tag.KINDS = KINDS;
49
+ Tag.SIZES = SIZES;
@@ -0,0 +1,55 @@
1
+ .root {
2
+ display: inline-block;
3
+ font-family: var(--font-family);
4
+ font-weight: bold;
5
+ background: var(--color-text-light);
6
+ color: var(--color-light);
7
+ text-align: center;
8
+ text-transform: uppercase;
9
+ }
10
+
11
+ /** Kind variation */
12
+ .success {
13
+ background: var(--color-success);
14
+ }
15
+
16
+ .info {
17
+ background: var(--color-info);
18
+ }
19
+
20
+ .warning {
21
+ background: var(--color-warning-dark);
22
+ }
23
+
24
+ .danger {
25
+ background: var(--color-danger);
26
+ }
27
+
28
+ /** Size variation */
29
+ /** default: medium */
30
+ .root {
31
+ border-radius: var(--radius-medium);
32
+ padding: var(--space-xxxsmall);
33
+ min-width: var(--space-small);
34
+ height: var(--space-small);
35
+ font-size: 9px;
36
+ line-height: 1;
37
+ }
38
+
39
+ .small {
40
+ border-radius: var(--radius-small);
41
+ padding: calc(var(--space-xxxsmall) / 2);
42
+ height: var(--space-xsmall);
43
+ min-width: var(--space-xsmall);
44
+ font-size: 8px;
45
+ line-height: 1;
46
+ }
47
+
48
+ .large {
49
+ border-radius: var(--radius-large);
50
+ padding: var(--space-xxxsmall) var(--space-xxsmall);
51
+ min-width: var(--space-medium);
52
+ height: var(--space-medium);
53
+ font-size: 12px;
54
+ line-height: var(--space-small);
55
+ }
@@ -12,7 +12,7 @@
12
12
 
13
13
  .tooltip {
14
14
  padding: var(--space-xxxsmall) var(--space-xxsmall);
15
- border-radius: var(--radius-small);
15
+ border-radius: var(--radius-medium);
16
16
  background: var(--color-light);
17
17
  color: var(--color-text);
18
18
  filter: drop-shadow(0 0 var(--space-xxxsmall) var(--color-shadow));