@bundle-stats/ui 3.2.8 → 3.2.9-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 (61) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/lib/app/app.js +124 -79
  3. package/lib/components/asset-info/asset-info.module.css +1 -0
  4. package/lib/components/bundle-assets/bundle-assets.js +97 -57
  5. package/lib/components/bundle-assets/bundle-assets.module.css +19 -13
  6. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +13 -3
  7. package/lib/components/bundle-modules/bundle-modules.js +49 -64
  8. package/lib/components/bundle-packages/bundle-packages.js +94 -46
  9. package/lib/components/bundle-packages/bundle-packages.module.css +14 -14
  10. package/lib/components/metrics-table/metrics-table.js +72 -59
  11. package/lib/components/metrics-table/metrics-table.module.css +18 -7
  12. package/lib/components/module-info/module-info.js +2 -2
  13. package/lib/hooks/search-params.js +25 -25
  14. package/lib/ui/empty-set/empty-set.js +5 -4
  15. package/lib/ui/empty-set/empty-set.module.css +2 -2
  16. package/lib/ui/hover-card/hover-card.js +6 -5
  17. package/lib/ui/hover-card/hover-card.module.css +6 -7
  18. package/lib/ui/table/table.js +5 -74
  19. package/lib/ui/table/table.module.css +23 -19
  20. package/lib/ui/table/table.stories.js +1 -1
  21. package/lib/ui/tooltip/tooltip.module.css +1 -0
  22. package/lib-esm/app/app.js +118 -76
  23. package/lib-esm/components/asset-info/asset-info.module.css +1 -0
  24. package/lib-esm/components/bundle-assets/bundle-assets.js +91 -61
  25. package/lib-esm/components/bundle-assets/bundle-assets.module.css +19 -13
  26. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +6 -3
  27. package/lib-esm/components/bundle-modules/bundle-modules.js +31 -47
  28. package/lib-esm/components/bundle-packages/bundle-packages.js +83 -43
  29. package/lib-esm/components/bundle-packages/bundle-packages.module.css +14 -14
  30. package/lib-esm/components/metrics-table/metrics-table.js +61 -53
  31. package/lib-esm/components/metrics-table/metrics-table.module.css +18 -7
  32. package/lib-esm/components/module-info/module-info.js +2 -2
  33. package/lib-esm/hooks/search-params.js +21 -22
  34. package/lib-esm/ui/empty-set/empty-set.js +4 -4
  35. package/lib-esm/ui/empty-set/empty-set.module.css +2 -2
  36. package/lib-esm/ui/hover-card/hover-card.js +6 -5
  37. package/lib-esm/ui/hover-card/hover-card.module.css +6 -7
  38. package/lib-esm/ui/table/table.js +5 -65
  39. package/lib-esm/ui/table/table.module.css +23 -19
  40. package/lib-esm/ui/table/table.stories.js +1 -1
  41. package/lib-esm/ui/tooltip/tooltip.module.css +1 -0
  42. package/package.json +3 -3
  43. package/src/app/app.jsx +135 -133
  44. package/src/components/asset-info/asset-info.module.css +1 -0
  45. package/src/components/bundle-assets/bundle-assets.jsx +94 -59
  46. package/src/components/bundle-assets/bundle-assets.module.css +19 -13
  47. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +2 -0
  48. package/src/components/bundle-modules/bundle-modules.jsx +28 -38
  49. package/src/components/bundle-packages/bundle-packages.jsx +80 -43
  50. package/src/components/bundle-packages/bundle-packages.module.css +14 -14
  51. package/src/components/metrics-table/metrics-table.jsx +53 -44
  52. package/src/components/metrics-table/metrics-table.module.css +18 -7
  53. package/src/components/module-info/module-info.jsx +2 -2
  54. package/src/hooks/search-params.js +24 -22
  55. package/src/ui/empty-set/empty-set.jsx +25 -21
  56. package/src/ui/empty-set/empty-set.module.css +2 -2
  57. package/src/ui/hover-card/hover-card.jsx +5 -10
  58. package/src/ui/hover-card/hover-card.module.css +6 -7
  59. package/src/ui/table/table.jsx +5 -52
  60. package/src/ui/table/table.module.css +23 -19
  61. package/src/ui/tooltip/tooltip.module.css +1 -0
@@ -1,4 +1,4 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useCallback, useMemo, useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import cx from 'classnames';
4
4
  import { get, map } from 'lodash';
@@ -77,60 +77,90 @@ TooltipNotPredictive.propTypes = {
77
77
  runs: PropTypes.array, // eslint-disable-line react/forbid-prop-types
78
78
  };
79
79
 
80
- const getRenderRowHeader =
81
- ({ labels, CustomComponentLink, chunks }) =>
82
- (item) => {
83
- const { label, isNotPredictive, runs, isChunk, isEntry, isInitial } = item;
80
+ const RowHeader = ({ row, labels, chunks, CustomComponentLink }) => {
81
+ const { label, isNotPredictive, runs, isChunk, isEntry, isInitial } = row;
82
+ const [showHoverCard, setHoverCard] = useState(false);
83
+ const handleOnMouseEnter = useCallback(() => setHoverCard(true), [showHoverCard]);
84
84
 
85
- return (
86
- <HoverCard
87
- label={
88
- <FlexStack space="xxxsmall" className={css.assetName}>
89
- <div className={css.assetInfoFlags}>
90
- {isNotPredictive && (
91
- <Tooltip className={css.notPredictive} title={<TooltipNotPredictive runs={runs} />}>
92
- <Icon className={css.notPredictiveIcon} glyph="warning" />
93
- </Tooltip>
94
- )}
95
- {isChunk && (
96
- <Tag
97
- title="Chunk"
98
- size={Tag.SIZES.SMALL}
99
- kind={Tag.KINDS.INFO}
100
- className={cx(css.tag, css.tagChunk)}
101
- />
102
- )}
103
- {isEntry && (
104
- <Tag
105
- title="Entrypoint"
106
- size={Tag.SIZES.SMALL}
107
- kind={Tag.KINDS.INFO}
108
- className={cx(css.tag, css.tagEntry)}
109
- />
110
- )}
111
- {isInitial && (
112
- <Tag
113
- title="Initial"
114
- size={Tag.SIZES.SMALL}
115
- kind={Tag.KINDS.INFO}
116
- className={cx(css.tag, css.tagInitial)}
117
- />
118
- )}
119
- </div>
120
- <FileName name={label} />
121
- </FlexStack>
122
- }
123
- >
124
- <AssetInfo
125
- className={css.assetInfo}
126
- item={item}
127
- labels={labels}
128
- chunks={chunks}
129
- CustomComponentLink={CustomComponentLink}
130
- />
131
- </HoverCard>
132
- );
133
- };
85
+ const content = useMemo(
86
+ () => (
87
+ <span className={css.assetName}>
88
+ <span className={css.assetNameTags}>
89
+ {isNotPredictive && (
90
+ <Tooltip className={css.notPredictive} title={<TooltipNotPredictive runs={runs} />}>
91
+ <Icon className={css.notPredictiveIcon} glyph="warning" />
92
+ </Tooltip>
93
+ )}
94
+ {isChunk && (
95
+ <Tag
96
+ className={cx(css.assetNameTag, css.assetNameTagChunk)}
97
+ title="Chunk"
98
+ size={Tag.SIZES.SMALL}
99
+ kind={Tag.KINDS.INFO}
100
+ />
101
+ )}
102
+ {isEntry && (
103
+ <Tag
104
+ className={cx(css.assetNameTag, css.assetNameTagEntry)}
105
+ title="Entrypoint"
106
+ size={Tag.SIZES.SMALL}
107
+ kind={Tag.KINDS.INFO}
108
+ />
109
+ )}
110
+ {isInitial && (
111
+ <Tag
112
+ className={cx(css.assetNameTag, css.assetNameTagInitial)}
113
+ title="Initial"
114
+ size={Tag.SIZES.SMALL}
115
+ kind={Tag.KINDS.INFO}
116
+ />
117
+ )}
118
+ </span>
119
+ <FileName className={css.assetNameText} name={label} />
120
+ </span>
121
+ ),
122
+ [isChunk, isEntry, isInitial, isNotPredictive, runs],
123
+ );
124
+
125
+ if (!showHoverCard) {
126
+ return <span onMouseEnter={handleOnMouseEnter}>{content}</span>;
127
+ }
128
+
129
+ return (
130
+ <HoverCard label={content}>
131
+ <AssetInfo
132
+ className={css.assetInfo}
133
+ item={row}
134
+ labels={labels}
135
+ chunks={chunks}
136
+ CustomComponentLink={CustomComponentLink}
137
+ />
138
+ </HoverCard>
139
+ );
140
+ };
141
+
142
+ RowHeader.propTypes = {
143
+ row: PropTypes.shape({
144
+ label: PropTypes.string,
145
+ isNotPredictive: PropTypes.bool,
146
+ isChunk: PropTypes.bool,
147
+ isInitial: PropTypes.bool,
148
+ isEntry: PropTypes.bool,
149
+ runs: PropTypes.arrayOf(PropTypes.object),
150
+ }).isRequired,
151
+ chunks: PropTypes.arrayOf(
152
+ PropTypes.shape({
153
+ id: PropTypes.string,
154
+ name: PropTypes.string,
155
+ }),
156
+ ),
157
+ labels: PropTypes.arrayOf(PropTypes.string).isRequired,
158
+ CustomComponentLink: PropTypes.elementType.isRequired,
159
+ };
160
+
161
+ RowHeader.defaultProps = {
162
+ chunks: [],
163
+ };
134
164
 
135
165
  export const BundleAssets = (props) => {
136
166
  const {
@@ -160,11 +190,16 @@ export const BundleAssets = (props) => {
160
190
  />
161
191
  );
162
192
 
163
- const chunks = jobs[0]?.meta?.webpack?.chunks || [];
164
-
165
- const renderRowHeader = useMemo(
166
- () => getRenderRowHeader({ labels: map(jobs, 'label'), CustomComponentLink, chunks }),
167
- [jobs, chunks],
193
+ const renderRowHeader = useCallback(
194
+ (row) => (
195
+ <RowHeader
196
+ row={row}
197
+ labels={map(jobs, 'label')}
198
+ chunks={jobs[0]?.meta?.webpack?.chunks || []}
199
+ CustomComponentLink={CustomComponentLink}
200
+ />
201
+ ),
202
+ [jobs, CustomComponentLink],
168
203
  );
169
204
 
170
205
  return (
@@ -8,10 +8,7 @@
8
8
  margin-right: -1px; /** collapse border */
9
9
  }
10
10
 
11
- .assetName {
12
- display: inline-flex;
13
- align-items: center;
14
- }
11
+ .assetName {}
15
12
 
16
13
  .notPredictive {
17
14
  margin-right: var(--space-xxsmall);
@@ -26,39 +23,48 @@
26
23
  vertical-align: top;
27
24
  }
28
25
 
29
- .assetInfoFlags {
30
- display: inline-block;
26
+ .assetNameTags {
27
+ display: inline;
31
28
  margin-right: var(--space-xxxsmall);
32
29
  }
33
30
 
34
- .assetInfoFlags:empty {
31
+ .assetNameTags:empty {
35
32
  display: none;
36
33
  }
37
34
 
38
- .tag + .tag {
35
+ .assetNameTag {
36
+ vertical-align: middle;
37
+ }
38
+
39
+ .assetNameTag + .assetNameTag {
39
40
  margin-left: 2px;
40
41
  }
41
42
 
42
- .tagEntry {
43
+ .assetNameTagEntry {
43
44
  background: var(--color-info-light);
44
45
  }
45
46
 
46
- .tagEntry::before {
47
+ .assetNameTagEntry::before {
47
48
  content: 'e';
48
49
  }
49
50
 
50
- .tagInitial {
51
+ .assetNameTagInitial {
51
52
  background: var(--color-info-light);
52
53
  }
53
54
 
54
- .tagInitial::before {
55
+ .assetNameTagInitial::before {
55
56
  content: 'i';
56
57
  }
57
58
 
58
- .tagChunk::before {
59
+ .assetNameTagChunk::before {
59
60
  content: 'c';
60
61
  }
61
62
 
63
+ .assetNameText {
64
+ display: inline;
65
+ vertical-align: middle;
66
+ }
67
+
62
68
  /* Tooltip not predictive */
63
69
  .tooltipNotPredictive {
64
70
  text-align: left;
@@ -11,6 +11,7 @@ export const BundleAssetsTotalsTable = ({
11
11
  className,
12
12
  jobs,
13
13
  customComponentLink: CustomComponentLink,
14
+ ...restProps
14
15
  }) => {
15
16
  const items = webpack.compareBySection.sizes(jobs);
16
17
 
@@ -32,6 +33,7 @@ export const BundleAssetsTotalsTable = ({
32
33
  items={items}
33
34
  renderRowHeader={renderRowHeader}
34
35
  showHeaderSum
36
+ {...restProps}
35
37
  />
36
38
  );
37
39
  };
@@ -31,30 +31,25 @@ import css from './bundle-modules.module.css';
31
31
  const RowHeader = ({ row, chunks, labels, CustomComponentLink }) => {
32
32
  const chunkIds = map(chunks, 'id');
33
33
 
34
- const [showPopopver, setPopover] = useState(false);
35
- const handleOnMouseEnter = useCallback(() => setPopover(true), [showPopopver]);
36
- const content = <FileName name={row.label} />;
34
+ const [showHoverCard, setHoverCard] = useState(false);
35
+ const handleOnMouseEnter = useCallback(() => setHoverCard(true), [showHoverCard]);
36
+ const content = useMemo(() => <FileName name={row.label} />, [row.label]);
37
+
38
+ if (!showHoverCard) {
39
+ return <div onMouseEnter={handleOnMouseEnter}>{content}</div>;
40
+ }
37
41
 
38
42
  return (
39
- <div onMouseEnter={handleOnMouseEnter}>
40
- {!showPopopver ? (
41
- content
42
- ) : (
43
- <HoverCard label={content}>
44
- {({ close }) => (
45
- <ModuleInfo
46
- className={css.namePopover}
47
- item={row}
48
- chunks={chunks}
49
- chunkIds={chunkIds}
50
- labels={labels}
51
- customComponentLink={CustomComponentLink}
52
- onClick={close}
53
- />
54
- )}
55
- </HoverCard>
56
- )}
57
- </div>
43
+ <HoverCard label={content}>
44
+ <ModuleInfo
45
+ className={css.namePopover}
46
+ item={row}
47
+ chunks={chunks}
48
+ chunkIds={chunkIds}
49
+ labels={labels}
50
+ customComponentLink={CustomComponentLink}
51
+ />
52
+ </HoverCard>
58
53
  );
59
54
  };
60
55
 
@@ -76,18 +71,6 @@ RowHeader.defaultProps = {
76
71
  chunks: [],
77
72
  };
78
73
 
79
- const getRenderRowHeader =
80
- ({ labels, chunks, CustomComponentLink }) =>
81
- (row) =>
82
- (
83
- <RowHeader
84
- row={row}
85
- chunks={chunks}
86
- labels={labels}
87
- CustomComponentLink={CustomComponentLink}
88
- />
89
- );
90
-
91
74
  export const BundleModules = ({
92
75
  className,
93
76
  jobs,
@@ -108,11 +91,18 @@ export const BundleModules = ({
108
91
  }) => {
109
92
  const rootClassName = cx(css.root, className);
110
93
 
111
- const labels = useMemo(() => map(jobs, 'label'), [jobs]);
112
- const renderRowHeader = useMemo(
113
- () => getRenderRowHeader({ labels, chunks, CustomComponentLink }),
114
- [labels, chunks],
94
+ const renderRowHeader = useCallback(
95
+ (row) => (
96
+ <RowHeader
97
+ row={row}
98
+ chunks={chunks}
99
+ labels={map(jobs, 'label')}
100
+ CustomComponentLink={CustomComponentLink}
101
+ />
102
+ ),
103
+ [jobs, chunks, CustomComponentLink],
115
104
  );
105
+
116
106
  const emptyMessage = (
117
107
  <EmptySet
118
108
  resources="modules"
@@ -1,4 +1,4 @@
1
- import React, { useCallback } from 'react';
1
+ import React, { useCallback, useMemo, useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import cx from 'classnames';
4
4
  import {
@@ -33,23 +33,23 @@ const PackagePopoverContent = ({ name, fullName, path, duplicate, CustomComponen
33
33
  const [normalizedName, packageId] = name.split(PACKAGE_ID_SEPARATOR);
34
34
 
35
35
  return (
36
- <Stack space="xxsmall" className={css.packagePopover}>
36
+ <Stack space="xsmall" className={css.packageHoverCard}>
37
37
  <Stack space="xxxsmall">
38
- <h3 className={css.packagePopoverTitle}>
38
+ <h3 className={css.packageHoverCardTitle}>
39
39
  {normalizedName}
40
40
  {packageId && (
41
- <span className={css.packagePopoverTitleIndex}>
41
+ <span className={css.packageHoverCardTitleIndex}>
42
42
  {`${PACKAGE_ID_SEPARATOR}${packageId}`}
43
43
  </span>
44
44
  )}
45
45
  </h3>
46
- <p className={css.packagePopoverPath}>
47
- <FileName className={css.packagePopoverPathValue} name={normalizedPackagePath} />
46
+ <p className={css.packageHoverCardPath}>
47
+ <FileName className={css.packageHoverCardPathValue} name={normalizedPackagePath} />
48
48
  </p>
49
49
  </Stack>
50
50
 
51
- <ul className={css.packagePopoverList}>
52
- <li className={css.packagePopoverItem}>
51
+ <ul className={css.packageHoverCardList}>
52
+ <li className={css.packageHoverCardItem}>
53
53
  <a
54
54
  href={`https://www.npmjs.com/package/${normalizedName}`}
55
55
  target="_blank"
@@ -58,7 +58,7 @@ const PackagePopoverContent = ({ name, fullName, path, duplicate, CustomComponen
58
58
  npmjs.com
59
59
  </a>
60
60
  </li>
61
- <li className={css.packagePopoverItem}>
61
+ <li className={css.packageHoverCardItem}>
62
62
  <a
63
63
  href={`https://bundlephobia.com/result?p=${normalizedName}`}
64
64
  target="_blank"
@@ -69,7 +69,7 @@ const PackagePopoverContent = ({ name, fullName, path, duplicate, CustomComponen
69
69
  </li>
70
70
  </ul>
71
71
 
72
- <Stack space="xxxsmall" className={css.packagePopover.actions}>
72
+ <Stack space="xxxsmall" className={css.packageHoverCardActions}>
73
73
  {duplicate && (
74
74
  <div>
75
75
  <CustomComponentLink {...getBundlePackagesByNameComponentLink(normalizedName)}>
@@ -98,49 +98,86 @@ PackagePopoverContent.defaultProps = {
98
98
  path: '',
99
99
  };
100
100
 
101
- const PackageRowHeader = ({ item, CustomComponentLink }) => {
102
- const packageNames = item.label.split(PACKAGES_SEPARATOR);
103
- const { path } = item.runs[0] || {};
101
+ const PackageName = ({ packageName, path, showDuplicateFlag, row, CustomComponentLink }) => {
102
+ const [showHoverCard, setHoverCard] = useState(false);
103
+ const handleOnMouseEnter = useCallback(() => setHoverCard(true), [showHoverCard]);
104
104
 
105
- return (
106
- <span className={css.packageNames}>
107
- {packageNames.map((packageName, index) => {
108
- // Render duplicate flag only for the last entry
109
- const duplicateFlag = index === packageNames.length - 1 && item.duplicate && (
105
+ const label = useMemo(
106
+ () => (
107
+ <>
108
+ {showDuplicateFlag && row.duplicate && (
110
109
  <Tag
110
+ className={css.packageNameTagDuplicate}
111
111
  title="Duplicate package"
112
112
  kind={Tag.KINDS.DANGER}
113
113
  size={Tag.SIZES.SMALL}
114
- className={css.tagDuplicate}
115
114
  />
116
- );
115
+ )}
116
+ <span className={css.packageNameLabel}>{packageName}</span>
117
+ </>
118
+ ),
119
+ [packageName, showDuplicateFlag, row],
120
+ );
117
121
 
118
- return (
119
- <HoverCard
120
- className={css.packageName}
121
- label={
122
- <FlexStack space="xxxsmall" className={css.packageNameLabel}>
123
- {duplicateFlag}
124
- <span>{packageName}</span>
125
- </FlexStack>
126
- }
127
- >
128
- <PackagePopoverContent
129
- name={packageName}
130
- path={path}
131
- fullName={item.label}
132
- duplicate={item.duplicate}
133
- CustomComponentLink={CustomComponentLink}
134
- />
135
- </HoverCard>
136
- );
137
- })}
122
+ if (!showHoverCard) {
123
+ return (
124
+ <span className={css.packageName} onMouseEnter={handleOnMouseEnter}>
125
+ {label}
126
+ </span>
127
+ );
128
+ }
129
+
130
+ return (
131
+ <HoverCard className={css.packageName} label={<span className={css.packageName}>{label}</span>}>
132
+ <PackagePopoverContent
133
+ name={packageName}
134
+ path={path}
135
+ fullName={row.label}
136
+ duplicate={row.duplicate}
137
+ CustomComponentLink={CustomComponentLink}
138
+ />
139
+ </HoverCard>
140
+ );
141
+ };
142
+
143
+ PackageName.propTypes = {
144
+ packageName: PropTypes.string.isRequired,
145
+ path: PropTypes.string.isRequired,
146
+ showDuplicateFlag: PropTypes.bool.isRequired,
147
+ row: PropTypes.shape({
148
+ label: PropTypes.string,
149
+ duplicate: PropTypes.bool,
150
+ runs: PropTypes.arrayOf(
151
+ PropTypes.shape({
152
+ path: PropTypes.string,
153
+ }),
154
+ ).isRequired,
155
+ }).isRequired,
156
+ CustomComponentLink: PropTypes.elementType.isRequired,
157
+ };
158
+
159
+ const RowHeader = ({ row, CustomComponentLink }) => {
160
+ const packageNames = row.label.split(PACKAGES_SEPARATOR);
161
+ const { path } = row.runs[0] || {};
162
+
163
+ return (
164
+ <span className={css.packageNames}>
165
+ {packageNames.map((packageName, index) => (
166
+ <PackageName
167
+ packageName={packageName}
168
+ path={path}
169
+ // Render duplicate flag only for the last entry
170
+ showDuplicateFlag={index === packageNames.length - 1}
171
+ row={row}
172
+ CustomComponentLink={CustomComponentLink}
173
+ />
174
+ ))}
138
175
  </span>
139
176
  );
140
177
  };
141
178
 
142
- PackageRowHeader.propTypes = {
143
- item: PropTypes.shape({
179
+ RowHeader.propTypes = {
180
+ row: PropTypes.shape({
144
181
  label: PropTypes.string,
145
182
  duplicate: PropTypes.bool,
146
183
  runs: PropTypes.arrayOf(
@@ -181,7 +218,7 @@ export const BundlePackages = (props) => {
181
218
  );
182
219
 
183
220
  const renderRowHeader = useCallback(
184
- (item) => <PackageRowHeader item={item} CustomComponentLink={CustomComponentLink} />,
221
+ (row) => <RowHeader row={row} CustomComponentLink={CustomComponentLink} />,
185
222
  [CustomComponentLink],
186
223
  );
187
224
 
@@ -12,15 +12,8 @@
12
12
  margin-right: -1px; /** collapse border */
13
13
  }
14
14
 
15
- .tagDuplicate {
16
- margin-right: var(--space-xxxsmall);
17
- }
18
-
19
- .tagDuplicate::before {
20
- content: 'd';
21
- }
22
-
23
15
  .packageName {
16
+ display: inline-block;
24
17
  color: var(--color-text-light);
25
18
  }
26
19
 
@@ -35,26 +28,33 @@
35
28
  color: var(--color-text-ultra-light);
36
29
  }
37
30
 
31
+ .packageNameTagDuplicate {
32
+ margin-right: var(--space-xxxsmall);
33
+ vertical-align: middle;
34
+ }
35
+
38
36
  .packageNameLabel {
39
- align-items: center;
37
+ vertical-align: middle;
40
38
  }
41
39
 
42
- .packagePopover {
43
- min-width: 320px;
40
+ .packageNameTagDuplicate::before {
41
+ content: 'd';
44
42
  }
45
43
 
46
- .packagePopoverTitleIndex {
44
+
45
+ .packageHoverCardTitleIndex {
47
46
  color: var(--color-text-light);
48
47
  font-weight: normal;
49
48
  }
50
49
 
51
- .packagePopoverPathValue {
50
+ .packageHoverCardPathValue {
51
+ width: 100%;
52
52
  padding: var(--space-xxxsmall);
53
53
  background: var(--color-highlight-warning);
54
54
  font-family: var(--font-family-monospace);
55
55
  }
56
56
 
57
- .packagePopoverList {
57
+ .packageHoverCardList {
58
58
  padding: 0;
59
59
  list-style: inside;
60
60
  }