@bundle-stats/ui 4.23.0-beta.10 → 4.23.0-beta.11

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 (81) hide show
  1. package/lib/app/app.js +15 -5
  2. package/lib/app/app.js.map +1 -1
  3. package/lib/app/app.module.css +8 -3
  4. package/lib/components/entry-info/entry-info.module.css +1 -0
  5. package/lib/components/metrics-display-selector/metrics-display-selector.module.css +4 -2
  6. package/lib/components/metrics-treemap/tile/tile.module.css +5 -4
  7. package/lib/components/metrics-treemap/tile-group/tile-group.module.css +7 -5
  8. package/lib/components/metrics-treemap/tile-group-title/tile-group-title.module.css +2 -6
  9. package/lib/components/run-info/run-info.module.css +6 -6
  10. package/lib/components/sort-button/sort-button.module.css +5 -2
  11. package/lib/components/summary/summary.module.css +8 -4
  12. package/lib/css/default.css +4 -2
  13. package/lib/css/variables.css +6 -3
  14. package/lib/layout/box/box.module.css +4 -2
  15. package/lib/ui/button/button.module.css +4 -2
  16. package/lib/ui/copy-to-clipboard/copy-to-clipboard.module.css +4 -2
  17. package/lib/ui/dialog/dialog.module.css +11 -5
  18. package/lib/ui/dropdown/dropdown.module.css +10 -5
  19. package/lib/ui/filters/filters.module.css +4 -2
  20. package/lib/ui/hover-card/hover-card.module.css +10 -5
  21. package/lib/ui/input/input.module.css +4 -2
  22. package/lib/ui/table/table.module.css +4 -2
  23. package/lib/ui/tabs/tabs.module.css +9 -5
  24. package/lib/ui/textarea/textarea.module.css +4 -2
  25. package/lib/ui/tooltip/tooltip.module.css +4 -2
  26. package/lib/utils/portal.js +17 -1
  27. package/lib/utils/portal.js.map +1 -1
  28. package/lib-esm/app/app.js +15 -5
  29. package/lib-esm/app/app.js.map +1 -1
  30. package/lib-esm/app/app.module.css +8 -3
  31. package/lib-esm/components/entry-info/entry-info.module.css +1 -0
  32. package/lib-esm/components/metrics-display-selector/metrics-display-selector.module.css +4 -2
  33. package/lib-esm/components/metrics-treemap/tile/tile.module.css +5 -4
  34. package/lib-esm/components/metrics-treemap/tile-group/tile-group.module.css +7 -5
  35. package/lib-esm/components/metrics-treemap/tile-group-title/tile-group-title.module.css +2 -6
  36. package/lib-esm/components/run-info/run-info.module.css +6 -6
  37. package/lib-esm/components/sort-button/sort-button.module.css +5 -2
  38. package/lib-esm/components/summary/summary.module.css +8 -4
  39. package/lib-esm/css/default.css +4 -2
  40. package/lib-esm/css/variables.css +6 -3
  41. package/lib-esm/layout/box/box.module.css +4 -2
  42. package/lib-esm/ui/button/button.module.css +4 -2
  43. package/lib-esm/ui/copy-to-clipboard/copy-to-clipboard.module.css +4 -2
  44. package/lib-esm/ui/dialog/dialog.module.css +11 -5
  45. package/lib-esm/ui/dropdown/dropdown.module.css +10 -5
  46. package/lib-esm/ui/filters/filters.module.css +4 -2
  47. package/lib-esm/ui/hover-card/hover-card.module.css +10 -5
  48. package/lib-esm/ui/input/input.module.css +4 -2
  49. package/lib-esm/ui/table/table.module.css +4 -2
  50. package/lib-esm/ui/tabs/tabs.module.css +9 -5
  51. package/lib-esm/ui/textarea/textarea.module.css +4 -2
  52. package/lib-esm/ui/tooltip/tooltip.module.css +4 -2
  53. package/lib-esm/utils/portal.js +15 -0
  54. package/lib-esm/utils/portal.js.map +1 -1
  55. package/package.json +8 -8
  56. package/src/app/app.jsx +30 -12
  57. package/src/app/app.module.css +8 -3
  58. package/src/components/entry-info/entry-info.module.css +1 -0
  59. package/src/components/metrics-display-selector/metrics-display-selector.module.css +4 -2
  60. package/src/components/metrics-treemap/tile/tile.module.css +5 -4
  61. package/src/components/metrics-treemap/tile-group/tile-group.module.css +7 -5
  62. package/src/components/metrics-treemap/tile-group-title/tile-group-title.module.css +2 -6
  63. package/src/components/run-info/run-info.module.css +6 -6
  64. package/src/components/sort-button/sort-button.module.css +5 -2
  65. package/src/components/summary/summary.module.css +8 -4
  66. package/src/css/default.css +4 -2
  67. package/src/css/variables.css +6 -3
  68. package/src/layout/box/box.module.css +4 -2
  69. package/src/ui/button/button.module.css +4 -2
  70. package/src/ui/copy-to-clipboard/copy-to-clipboard.module.css +4 -2
  71. package/src/ui/dialog/dialog.module.css +11 -5
  72. package/src/ui/dropdown/dropdown.module.css +10 -5
  73. package/src/ui/filters/filters.module.css +4 -2
  74. package/src/ui/hover-card/hover-card.module.css +10 -5
  75. package/src/ui/input/input.module.css +4 -2
  76. package/src/ui/table/table.module.css +4 -2
  77. package/src/ui/tabs/tabs.module.css +9 -5
  78. package/src/ui/textarea/textarea.module.css +4 -2
  79. package/src/ui/tooltip/tooltip.module.css +4 -2
  80. package/src/utils/portal.ts +25 -0
  81. package/types/utils/portal.d.ts +1 -0
@@ -3,7 +3,9 @@
3
3
  border-radius: var(--radius-small);
4
4
  color: var(--color-text-light);
5
5
  width: 100%;
6
- transition: var(--transition-out);
6
+ transition-property: color, border-color;
7
+ transition-duration: var(--transition-duration-out);
8
+ transition-timing-function: var(--transition-timing-function);
7
9
  appearance: none;
8
10
  outline: none;
9
11
  }
@@ -27,7 +29,7 @@
27
29
  .root:focus {
28
30
  border-color: var(--color-outline-dark);
29
31
  color: inherit;
30
- transition: var(--transition-in);
32
+ transition-duration: var(--transition-duration-in);
31
33
  }
32
34
 
33
35
  /** Size modifier */
@@ -48,13 +48,15 @@
48
48
  /* hover current row */
49
49
  .root tbody tr th,
50
50
  .root tbody tr td {
51
- transition: var(--transition-out);
51
+ transition-property: background-color;
52
+ transition-duration: var(--transition-duration-out);
53
+ transition-timing-function: var(--transition-timing-function);
52
54
  }
53
55
 
54
56
  .root tbody tr:hover th,
55
57
  .root tbody tr:hover td {
56
58
  background-color: var(--color-highlight-warning);
57
- transition: var(--transition-in);
59
+ transition-duration: var(--transition-duration-in);
58
60
  }
59
61
 
60
62
  .empty {
@@ -13,7 +13,9 @@
13
13
  color: var(--color-text-ultra-light);
14
14
  font-weight: bold;
15
15
  text-decoration: none;
16
- transition: var(--transition-out);
16
+ transition-property: color;
17
+ transition-duration: var(--transition-duration-out);
18
+ transition-timing-function: var(--transition-timing-function);
17
19
  }
18
20
 
19
21
  .item::after {
@@ -26,7 +28,9 @@
26
28
  height: 2px;
27
29
  background: currentColor;
28
30
  opacity: 0;
29
- transition: var(--transition-out);
31
+ transition-property: opacity;
32
+ transition-duration: var(--transition-duration-out);
33
+ transition-timing-function: var(--transition-timing-function);
30
34
  }
31
35
 
32
36
  .item:focus,
@@ -40,15 +44,15 @@
40
44
  .item:active::after,
41
45
  .item:focus::after {
42
46
  opacity: 1;
43
- transition: var(--transition-in);
47
+ transition-duration: var(--transition-duration-in);
44
48
  }
45
49
 
46
50
  .itemActive {
47
51
  color: var(--color-accent);
48
- transition: var(--transition-in);
52
+ transition-duration: var(--transition-duration-in);
49
53
  }
50
54
 
51
55
  .itemActive::after {
52
56
  opacity: 1;
53
- transition: var(--transition-in);
57
+ transition-duration: var(--transition-duration-in);
54
58
  }
@@ -4,7 +4,9 @@
4
4
  color: var(--color-text-light);
5
5
  width: 100%;
6
6
  resize: vertical;
7
- transition: var(--transition-out);
7
+ transition-property: color, border-color;
8
+ transition-duration: var(--transition-duration-out);
9
+ transition-timing-function: var(--transition-timing-function);
8
10
  appearance: none;
9
11
  outline: none;
10
12
  }
@@ -28,7 +30,7 @@
28
30
  .root:focus {
29
31
  border-color: var(--color-outline-dark);
30
32
  color: inherit;
31
- transition: var(--transition-in);
33
+ transition-duration: var(--transition-duration-in);
32
34
  }
33
35
 
34
36
  .root[readonly=''] {
@@ -22,12 +22,14 @@
22
22
  filter: drop-shadow(var(--shadow-layer));
23
23
  will-change: filter;
24
24
  opacity: 0;
25
- transition: var(--transition-out);
25
+ transition-property: opacity;
26
+ transition-duration: var(--transition-duration-out);
27
+ transition-timing-function: var(--transition-timing-function);
26
28
  }
27
29
 
28
30
  .tooltip[data-enter] {
29
31
  opacity: 1;
30
- transition: var(--transition-in);
32
+ transition-duration: var(--transition-duration-in);
31
33
  }
32
34
 
33
35
  .tooltip[data-leave] {
@@ -1,6 +1,21 @@
1
+ import { useEffect, useState } from 'react';
1
2
  export const getCreatePortalElement = (className) => (element) => {
2
3
  const portalElement = element.ownerDocument.createElement('div');
3
4
  portalElement.className = className;
4
5
  return portalElement;
5
6
  };
7
+ export const usePortalRoot = (className) => {
8
+ const [portalRoot, setPortalRoot] = useState(null);
9
+ useEffect(() => {
10
+ const element = document.createElement('div');
11
+ element.className = className;
12
+ document.body.appendChild(element);
13
+ setPortalRoot(element);
14
+ return () => {
15
+ element.remove();
16
+ setPortalRoot(null);
17
+ };
18
+ }, [className]);
19
+ return portalRoot;
20
+ };
6
21
  //# sourceMappingURL=portal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/utils/portal.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,CAAC,OAAoB,EAAE,EAAE;IACpF,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjE,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;IACpC,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC"}
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/utils/portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAM5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,CAAC,OAAoB,EAAE,EAAE;IACpF,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjE,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;IACpC,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAsB,EAAE;IACrE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAEvE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,aAAa,CAAC,OAAO,CAAC,CAAC;QAEvB,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,aAAa,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bundle-stats/ui",
3
- "version": "4.23.0-beta.10",
3
+ "version": "4.23.0-beta.11",
4
4
  "description": "UI components for BundleStats projects.",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-esm/index.js",
@@ -41,9 +41,9 @@
41
41
  "@babel/preset-env": "8.0.7",
42
42
  "@babel/preset-react": "8.0.1",
43
43
  "@babel/preset-typescript": "8.0.7",
44
- "@storybook/addon-vitest": "10.6.2",
45
- "@storybook/react": "10.6.2",
46
- "@storybook/react-vite": "10.6.2",
44
+ "@storybook/addon-vitest": "10.6.5",
45
+ "@storybook/react": "10.6.5",
46
+ "@storybook/react-vite": "10.6.5",
47
47
  "@types/d3": "7.4.3",
48
48
  "@types/react": "18.3.13",
49
49
  "@types/react-router-dom": "5.3.3",
@@ -68,9 +68,9 @@
68
68
  "react-dom": "18.3.1",
69
69
  "react-router-dom": "5.3.4",
70
70
  "rimraf": "6.1.3",
71
- "storybook": "10.6.2",
71
+ "storybook": "10.6.5",
72
72
  "typescript": "5.9.3",
73
- "vite": "8.3.4",
73
+ "vite": "8.3.5",
74
74
  "vite-plugin-svgr": "5.2.0",
75
75
  "vitest": "5.0.5"
76
76
  },
@@ -83,7 +83,7 @@
83
83
  "react-router-dom": "^5.0.0"
84
84
  },
85
85
  "dependencies": {
86
- "@bundle-stats/utils": "^4.23.0-beta.10",
86
+ "@bundle-stats/utils": "^4.23.0-beta.11",
87
87
  "ariakit": "2.0.0-next.44",
88
88
  "d3": "7.9.0",
89
89
  "modern-css-reset": "1.4.0",
@@ -91,5 +91,5 @@
91
91
  "snarkdown": "2.0.0",
92
92
  "use-query-params": "2.2.2"
93
93
  },
94
- "gitHead": "7c9e99fe7bf5b35dc75cf504f31c0ca035c04476"
94
+ "gitHead": "7d3dc3eccafa5d78fbf1a2884e70355a518db9fb"
95
95
  }
package/src/app/app.jsx CHANGED
@@ -2,6 +2,7 @@ import React, { useContext, useEffect, useMemo } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import isEmpty from 'lodash/isEmpty';
4
4
  import { HashRouter, NavLink, Route, Switch, useLocation } from 'react-router-dom';
5
+ import { PortalContext } from 'ariakit/portal';
5
6
  import { COMPONENT } from '@bundle-stats/utils';
6
7
 
7
8
  import { URLS } from '../constants';
@@ -19,6 +20,7 @@ import { Stack } from '../layout/stack';
19
20
  import { Container } from '../ui/container';
20
21
  import { Tabs } from '../ui/tabs';
21
22
  import { QueryStateProvider, useComponentQueryState } from '../query-state';
23
+ import { usePortalRoot } from '../utils/portal';
22
24
  import I18N from '../i18n';
23
25
  import { Header } from './header';
24
26
  import css from './app.module.css';
@@ -137,6 +139,20 @@ const PackagesRoute = () => {
137
139
  );
138
140
  };
139
141
 
142
+ /**
143
+ * Render the overlays (hovercards, tooltips) of the content above the tabs
144
+ * (metric change legend, summary) above the sticky tabs
145
+ */
146
+ const RaisedOverlaysProvider = ({ children }) => {
147
+ const portalRoot = usePortalRoot(css.raisedOverlaysPortal);
148
+
149
+ return <PortalContext.Provider value={portalRoot}>{children}</PortalContext.Provider>;
150
+ };
151
+
152
+ RaisedOverlaysProvider.propTypes = {
153
+ children: PropTypes.node.isRequired,
154
+ };
155
+
140
156
  const AppComponent = ({ version, jobs }) => {
141
157
  if (jobs?.length === 0) {
142
158
  return (
@@ -151,18 +167,20 @@ const AppComponent = ({ version, jobs }) => {
151
167
  return (
152
168
  <JobsProvider jobs={jobs}>
153
169
  <Layout jobs={jobs} version={version}>
154
- <Container className={css.metricChangeLegendContainer}>
155
- <FlexStack justifyContent="flex-end">
156
- <MetricChangeLegend />
157
- </FlexStack>
158
- </Container>
159
- <Container className={css.summaryContainer}>
160
- <Summary
161
- data={jobs[0].summary}
162
- showSummaryItemDelta={jobs.length !== 1}
163
- showSummaryItemBaseline={jobs?.length !== 1}
164
- />
165
- </Container>
170
+ <RaisedOverlaysProvider>
171
+ <Container className={css.metricChangeLegendContainer}>
172
+ <FlexStack justifyContent="flex-end">
173
+ <MetricChangeLegend />
174
+ </FlexStack>
175
+ </Container>
176
+ <Container className={css.summaryContainer}>
177
+ <Summary
178
+ data={jobs[0].summary}
179
+ showSummaryItemDelta={jobs.length !== 1}
180
+ showSummaryItemBaseline={jobs?.length !== 1}
181
+ />
182
+ </Container>
183
+ </RaisedOverlaysProvider>
166
184
 
167
185
  <Container className={css.tabsContainer}>
168
186
  <Tabs className={css.tabs}>
@@ -27,6 +27,11 @@
27
27
  padding-bottom: var(--space-xxsmall);
28
28
  }
29
29
 
30
+ /** legend and summary overlays: above the sticky tabs, below the header */
31
+ .raisedOverlaysPortal {
32
+ --layer-overlay: calc(var(--layer-xhigh) + 2);
33
+ }
34
+
30
35
  .tabsContainer {
31
36
  border-bottom: 1px solid var(--color-outline);
32
37
  background: var(--color-light);
@@ -38,12 +43,12 @@
38
43
 
39
44
  .tabActive {
40
45
  color: var(--color-accent);
41
- transition: var(--transition-in);
46
+ transition-duration: var(--transition-duration-in);
42
47
  }
43
48
 
44
49
  .tabActive::after {
45
50
  opacity: 1;
46
- transition: var(--transition-in);
51
+ transition-duration: var(--transition-duration-in);
47
52
  }
48
53
 
49
54
  .tabsContent {
@@ -70,7 +75,7 @@
70
75
  .tabsContainer {
71
76
  position: sticky;
72
77
  top: var(--header-height);
73
- /** above the overlays (tooltips, hovercards, dropdowns) */
78
+ /** above the overlays (tooltips, hovercards, dropdowns), except the legend and summary overlays */
74
79
  z-index: var(--layer-xhigh);
75
80
  }
76
81
  }
@@ -29,6 +29,7 @@
29
29
  .contentWrapper {
30
30
  flex: 1 1 auto;
31
31
  overflow: auto;
32
+ overscroll-behavior: contain;
32
33
  }
33
34
 
34
35
  /** header */
@@ -27,10 +27,12 @@
27
27
 
28
28
  .dropdownItemIcon {
29
29
  opacity: 0;
30
- transition: var(--transition-out);
30
+ transition-property: opacity;
31
+ transition-duration: var(--transition-duration-out);
32
+ transition-timing-function: var(--transition-timing-function);
31
33
  }
32
34
 
33
35
  .dropdownItemActive .dropdownItemIcon {
34
36
  opacity: 1;
35
- transition: var(--transition-in);
37
+ transition-duration: var(--transition-duration-in);
36
38
  }
@@ -12,8 +12,9 @@
12
12
  font-size: var(--size-small);
13
13
  line-height: var(--line-height-heading);
14
14
  text-align: left;
15
- transition: var(--transition-out);
16
15
  transition-property: opacity, background-color;
16
+ transition-duration: var(--transition-duration-out);
17
+ transition-timing-function: var(--transition-timing-function);
17
18
  }
18
19
 
19
20
  .root::before {
@@ -92,14 +93,14 @@
92
93
 
93
94
  .root::before {
94
95
  color: var(--color-highlight);
95
- transition: var(--transition-out);
96
96
  transition-property: opacity;
97
+ transition-duration: var(--transition-duration-out);
98
+ transition-timing-function: var(--transition-timing-function);
97
99
  opacity: 0.6;
98
100
  }
99
101
 
100
102
  .root:hover::before {
101
- transition: var(--transition-in);
102
- transition-property: opacity;
103
+ transition-duration: var(--transition-duration-in);
103
104
  opacity: 0.8;
104
105
  }
105
106
 
@@ -5,8 +5,9 @@
5
5
 
6
6
  /** Tile group size variation */
7
7
  .root {
8
- transition: var(--transition-out);
9
- transition-property: background-color, outline;
8
+ transition-property: background-color, outline-color;
9
+ transition-duration: var(--transition-duration-out);
10
+ transition-timing-function: var(--transition-timing-function);
10
11
  }
11
12
 
12
13
  /** Tile group nested variation */
@@ -19,8 +20,7 @@
19
20
  .root.nested:has(> [data-treemap-tile]:hover) {
20
21
  background-color: rgba(27, 26, 33, 0.06);
21
22
  outline: 1px solid rgba(255, 255, 255, 1);
22
- transition: var(--transition-in);
23
- transition-property: background-color, outline;
23
+ transition-duration: var(--transition-duration-in);
24
24
  }
25
25
 
26
26
  .nested.tileGroup--NEGATIVE {
@@ -51,7 +51,9 @@
51
51
  .nested.tileGroup--POSITIVE > .tileGroup--NO_CHANGE:has(> [data-treemap-tile-group-title]:hover),
52
52
  .nested.tileGroup--POSITIVE > .tileGroup--NO_CHANGE:has(> [data-treemap-tile]:hover),
53
53
  .nested.tileGroup--NEGATIVE > .tileGroup--NO_CHANGE:has(> [data-treemap-tile-group-title]:hover),
54
- .nested.tileGroup--NEGATIVE > .tileGroup--NEGATIVE > .tileGroup--NO_CHANGE:has(> [data-treemap-tile]:hover) {
54
+ .nested.tileGroup--NEGATIVE
55
+ > .tileGroup--NEGATIVE
56
+ > .tileGroup--NO_CHANGE:has(> [data-treemap-tile]:hover) {
55
57
  background-color: var(--color-background);
56
58
  background-image: linear-gradient(rgba(27, 26, 33, 0.1), rgba(27, 26, 33, 0.1));
57
59
  }
@@ -5,7 +5,8 @@
5
5
 
6
6
  .tileGroupTitleContent {
7
7
  width: 100%;
8
- padding: var(--space-xxxsmall) calc(var(--space-xxxsmall) / 2) var(--space-xxxsmall) var(--space-xxsmall);
8
+ padding: var(--space-xxxsmall) calc(var(--space-xxxsmall) / 2) var(--space-xxxsmall)
9
+ var(--space-xxsmall);
9
10
  border-radius: var(--radius-xsmall);
10
11
  display: flex;
11
12
  align-items: center;
@@ -29,13 +30,8 @@
29
30
  color: var(--color-text-light);
30
31
  }
31
32
 
32
- .root {
33
- transition: var(--transition-out);
34
- }
35
-
36
33
  .root:hover .tileGroupTitleText {
37
34
  text-decoration: underline;
38
- transition: var(--transition-in);
39
35
  }
40
36
 
41
37
  /** Fill variation */
@@ -43,7 +43,6 @@
43
43
  line-height: inherit;
44
44
  }
45
45
 
46
-
47
46
  .delta {
48
47
  font-weight: bold;
49
48
  font-size: var(--size-small);
@@ -62,10 +61,11 @@
62
61
  .titleTooltipIcon[aria-controls=''] {
63
62
  opacity: 0;
64
63
  visibility: hidden;
64
+ /* delay hiding until the fade-out completes */
65
65
  transition:
66
- opacity var(--transition-duration-out) ease-out,
67
- color var(--transition-duration-out) ease-out,
68
- visibility 0s;
66
+ opacity var(--transition-duration-out) var(--transition-timing-function),
67
+ color var(--transition-duration-out) var(--transition-timing-function),
68
+ visibility 0s linear var(--transition-duration-out);
69
69
  }
70
70
 
71
71
  .root:hover .titleHoverCardIcon span,
@@ -73,8 +73,8 @@
73
73
  opacity: 1;
74
74
  visibility: visible;
75
75
  transition:
76
- opacity var(--transition-duration-in) ease-in,
77
- color var(--transition-duration-in) ease-in,
76
+ opacity var(--transition-duration-in) var(--transition-timing-function),
77
+ color var(--transition-duration-in) var(--transition-timing-function),
78
78
  visibility 0s;
79
79
  }
80
80
 
@@ -28,7 +28,7 @@
28
28
 
29
29
  .directionActive {
30
30
  color: var(--color-text);
31
- transition: var(--transition-in);
31
+ transition-duration: var(--transition-duration-in);
32
32
  }
33
33
 
34
34
  .direction:hover,
@@ -69,6 +69,9 @@
69
69
  .direction {
70
70
  pointer-events: none;
71
71
  opacity: 0;
72
+ transition-property: color, opacity;
73
+ transition-duration: var(--transition-duration-out);
74
+ transition-timing-function: var(--transition-timing-function);
72
75
  }
73
76
 
74
77
  .active .direction,
@@ -77,5 +80,5 @@
77
80
  .interactive:hover:focus .direction {
78
81
  pointer-events: auto;
79
82
  opacity: 1;
80
- transition: var(--transition-in);
83
+ transition-duration: var(--transition-duration-in);
81
84
  }
@@ -42,14 +42,16 @@
42
42
  bottom: calc(0px - var(--space-xsmall));
43
43
  left: calc(0px - var(--space-xsmall));
44
44
  opacity: 0;
45
- transition: var(--transition-out);
45
+ transition-property: opacity;
46
+ transition-duration: var(--transition-duration-out);
47
+ transition-timing-function: var(--transition-timing-function);
46
48
  }
47
49
 
48
50
  .item:focus::before,
49
51
  .item:active::before,
50
52
  .item:hover::before {
51
53
  opacity: 1;
52
- transition: var(--transition-in);
54
+ transition-duration: var(--transition-duration-in);
53
55
  }
54
56
 
55
57
  .item + .item::after {
@@ -63,7 +65,9 @@
63
65
  top: var(--space-xxsmall);
64
66
  bottom: var(--space-xxsmall);
65
67
  opacity: 1;
66
- transition: var(--transition-out);
68
+ transition-property: opacity;
69
+ transition-duration: var(--transition-duration-out);
70
+ transition-timing-function: var(--transition-timing-function);
67
71
  }
68
72
 
69
73
  .item:focus::after,
@@ -73,5 +77,5 @@
73
77
  .item:active + .item::after,
74
78
  .item:hover + .item::after {
75
79
  opacity: 0;
76
- transition: var(--transition-in);
80
+ transition-duration: var(--transition-duration-in);
77
81
  }
@@ -61,7 +61,9 @@ code {
61
61
 
62
62
  a {
63
63
  color: var(--color-accent);
64
- transition: var(--transition-out);
64
+ transition-property: color;
65
+ transition-duration: var(--transition-duration-out);
66
+ transition-timing-function: var(--transition-timing-function);
65
67
  }
66
68
 
67
69
  a:focus,
@@ -69,5 +71,5 @@ a:active,
69
71
  a:hover {
70
72
  color: var(--color-accent-dark);
71
73
  outline: none;
72
- transition: var(--transition-in);
74
+ transition-duration: var(--transition-duration-in);
73
75
  }
@@ -190,12 +190,15 @@ body {
190
190
  --color-outline-danger: var(--color-red-100);
191
191
 
192
192
  --color-backdrop: rgba(0, 0, 0, 0.05);
193
- --color-shadow: rgba(0, 0, 0, 0.25);
193
+ --color-shadow: rgba(0, 0, 0, 0.1);
194
194
 
195
+ /**
196
+ * Transitions: set `transition-property` explicitly on the base rule, use the `out` duration
197
+ * on the base rule and switch only `transition-duration` to `in` on the active/hover rule
198
+ */
195
199
  --transition-duration-in: 120ms;
196
200
  --transition-duration-out: 80ms;
197
- --transition-in: all var(--transition-duration-in) ease-in;
198
- --transition-out: all var(--transition-duration-out) ease-out;
201
+ --transition-timing-function: ease-out;
199
202
 
200
203
  --layer-xlow: 1;
201
204
  --layer-low: 10;
@@ -18,14 +18,16 @@
18
18
  }
19
19
 
20
20
  .outlineHover {
21
- transition: var(--transition-out);
21
+ transition-property: border-color;
22
+ transition-duration: var(--transition-duration-out);
23
+ transition-timing-function: var(--transition-timing-function);
22
24
  }
23
25
 
24
26
  .outlineHover:focus,
25
27
  .outlineHover:active,
26
28
  .outlineHover:hover {
27
29
  border-color: var(--color-outline-dark);
28
- transition: var(--transition-in);
30
+ transition-duration: var(--transition-duration-in);
29
31
  }
30
32
 
31
33
  .padding-xxxsmall {
@@ -19,7 +19,9 @@
19
19
  font-family: var(--font-family);
20
20
  line-height: var(--line-height);
21
21
  white-space: nowrap;
22
- transition: var(--transition-out);
22
+ transition-property: color, background-color, border-color;
23
+ transition-duration: var(--transition-duration-out);
24
+ transition-timing-function: var(--transition-timing-function);
23
25
  }
24
26
 
25
27
  a.root {
@@ -31,7 +33,7 @@ a.root {
31
33
  .root:active {
32
34
  outline: none;
33
35
  color: var(--color-text-light);
34
- transition: var(--transition-in);
36
+ transition-duration: var(--transition-duration-in);
35
37
  }
36
38
 
37
39
  .glyph {
@@ -6,10 +6,12 @@
6
6
 
7
7
  /** done state */
8
8
  .root svg {
9
- transition: var(--transition-out);
9
+ transition-property: color;
10
+ transition-duration: var(--transition-duration-out);
11
+ transition-timing-function: var(--transition-timing-function);
10
12
  }
11
13
 
12
14
  .done svg {
13
15
  color: var(--color-success);
14
- transition: var(--transition-in);
16
+ transition-duration: var(--transition-duration-in);
15
17
  }
@@ -9,12 +9,14 @@
9
9
  justify-content: center;
10
10
  z-index: var(--layer-xxhigh);
11
11
  opacity: 0;
12
- transition: var(--transition-out);
12
+ transition-property: opacity;
13
+ transition-duration: var(--transition-duration-out);
14
+ transition-timing-function: var(--transition-timing-function);
13
15
  }
14
16
 
15
17
  .backdrop[data-enter] {
16
18
  opacity: 1;
17
- transition: var(--transition-in);
19
+ transition-duration: var(--transition-duration-in);
18
20
  }
19
21
 
20
22
  .backdrop[data-leave] {
@@ -39,17 +41,20 @@
39
41
  width: calc(100vw - 2 * var(--dialog-padding));
40
42
  position: relative;
41
43
  border-radius: var(--radius-medium);
42
- padding: var(--dialog-padding);
44
+ border: 1px solid var(--color-outline);
45
+ padding: calc(var(--dialog-padding) - 1px);
43
46
  background: var(--color-background);
44
47
  box-shadow: 0 0 var(--space-medium) var(--color-shadow);
45
48
  z-index: var(--layer-xxhigh);
46
49
  opacity: 0;
47
- transition: var(--transition-out);
50
+ transition-property: opacity;
51
+ transition-duration: var(--transition-duration-out);
52
+ transition-timing-function: var(--transition-timing-function);
48
53
  }
49
54
 
50
55
  .dialog[data-enter] {
51
56
  opacity: 1;
52
- transition: var(--transition-in);
57
+ transition-duration: var(--transition-duration-in);
53
58
  }
54
59
 
55
60
  .digalog[data-leave] {
@@ -91,6 +96,7 @@
91
96
  );
92
97
  padding-bottom: 0.3em; /* extra space to compensate for the title line-height and allow to show focus state correctly on buttons */
93
98
  overflow: auto;
99
+ overscroll-behavior: contain;
94
100
  }
95
101
 
96
102
  /** Width variation */