@coinbase/cds-web 8.45.0 → 8.46.0

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.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,12 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  <!-- template-start -->
10
10
 
11
+ ## 8.46.0 (2/12/2026 PST)
12
+
13
+ #### 🚀 Updates
14
+
15
+ - Add open/close visibility delays to Tooltip. [[#234](https://github.com/coinbase/cds/pull/234)]
16
+
11
17
  ## 8.45.0 (2/12/2026 PST)
12
18
 
13
19
  #### 🚀 Updates
@@ -17,5 +17,7 @@ export declare const Tooltip: ({
17
17
  focusTabIndexElements,
18
18
  respectNegativeTabIndex,
19
19
  autoFocusDelay,
20
+ openDelay,
21
+ closeDelay,
20
22
  }: TooltipProps) => import('react/jsx-runtime').JSX.Element;
21
23
  //# sourceMappingURL=Tooltip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/overlays/tooltip/Tooltip.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQnD,eAAO,MAAM,OAAO,GAAI,iQAkBrB,YAAY,4CAiEd,CAAC"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/overlays/tooltip/Tooltip.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQnD,eAAO,MAAM,OAAO,GAAI,wRAoBrB,YAAY,4CAiEd,CAAC"}
@@ -27,6 +27,16 @@ export type TooltipBaseProps = SharedProps &
27
27
  * @default true
28
28
  */
29
29
  visible?: boolean;
30
+ /**
31
+ * Delay (in ms) before showing the tooltip on pointer hover.
32
+ * Keyboard focus still opens immediately for accessibility.
33
+ */
34
+ openDelay?: number;
35
+ /**
36
+ * Delay (in ms) before hiding the tooltip after pointer leave.
37
+ * Keyboard blur still closes immediately.
38
+ */
39
+ closeDelay?: number;
30
40
  /** Invert the theme's activeColorScheme for this component
31
41
  * @default true
32
42
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TooltipProps.d.ts","sourceRoot":"","sources":["../../../src/overlays/tooltip/TooltipProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GAAG,WAAW,GACxC,cAAc,GACd,IAAI,CACF,YAAY,EACV,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,yBAAyB,GACzB,uBAAuB,GACvB,gBAAgB,CACnB,GAAG;IACF,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;IAC7B,gDAAgD;IAChD,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;;OAIG;IACH,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sDAAsD;IACtD,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;SAGK;IACL,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEJ,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC;IACrB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"TooltipProps.d.ts","sourceRoot":"","sources":["../../../src/overlays/tooltip/TooltipProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GAAG,WAAW,GACxC,cAAc,GACd,IAAI,CACF,YAAY,EACV,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,yBAAyB,GACzB,uBAAuB,GACvB,gBAAgB,CACnB,GAAG;IACF,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;IAC7B,gDAAgD;IAChD,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;;OAIG;IACH,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sDAAsD;IACtD,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;SAGK;IACL,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEJ,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC;IACrB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC"}
@@ -1,4 +1,8 @@
1
- export declare const useTooltipState: (id?: string) => {
1
+ export declare const useTooltipState: (
2
+ id?: string,
3
+ openDelay?: number,
4
+ closeDelay?: number,
5
+ ) => {
2
6
  isOpen: boolean;
3
7
  tooltipId: string;
4
8
  handleOnMouseEnter: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useTooltipState.d.ts","sourceRoot":"","sources":["../../../src/overlays/tooltip/useTooltipState.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM;;;;;;;CAoC1C,CAAC"}
1
+ {"version":3,"file":"useTooltipState.d.ts","sourceRoot":"","sources":["../../../src/overlays/tooltip/useTooltipState.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,aAAa,MAAM;;;;;;;CAsFnF,CAAC"}
@@ -25,7 +25,9 @@ export const Tooltip = _ref => {
25
25
  disableTypeFocus,
26
26
  focusTabIndexElements,
27
27
  respectNegativeTabIndex,
28
- autoFocusDelay = 20
28
+ autoFocusDelay = 20,
29
+ openDelay,
30
+ closeDelay
29
31
  } = _ref;
30
32
  const {
31
33
  isOpen,
@@ -34,7 +36,7 @@ export const Tooltip = _ref => {
34
36
  handleOnFocus,
35
37
  handleOnBlur,
36
38
  tooltipId
37
- } = useTooltipState(tooltipIdDefault);
39
+ } = useTooltipState(tooltipIdDefault, openDelay, closeDelay);
38
40
  const tooltipContentRef = useRef(null);
39
41
  const handleMouseEnter = useCallback(_ref2 => {
40
42
  let {
@@ -1,19 +1,61 @@
1
- import { useCallback, useMemo, useState } from 'react';
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { usePrefixedId } from '@coinbase/cds-common/hooks/usePrefixedId';
3
- export const useTooltipState = id => {
3
+ export const useTooltipState = (id, openDelay, closeDelay) => {
4
4
  const [isHovered, setIsHovered] = useState(false);
5
5
  const [isFocused, setIsFocused] = useState(false);
6
6
  const tooltipId = usePrefixedId(id);
7
- const handleOnMouseEnter = useCallback(() => setIsHovered(true), []);
8
- const toggleOffIsHovered = useCallback(() => setIsHovered(false), []);
9
- const handleOnFocus = useCallback(() => setIsFocused(true), []);
10
- const toggleOffIsFocused = useCallback(() => setIsFocused(false), []);
7
+ const openTimeoutRef = useRef(null);
8
+ const closeTimeoutRef = useRef(null);
9
+ const clearOpenTimeout = useCallback(() => {
10
+ if (openTimeoutRef.current) {
11
+ clearTimeout(openTimeoutRef.current);
12
+ openTimeoutRef.current = null;
13
+ }
14
+ }, []);
15
+ const clearCloseTimeout = useCallback(() => {
16
+ if (closeTimeoutRef.current) {
17
+ clearTimeout(closeTimeoutRef.current);
18
+ closeTimeoutRef.current = null;
19
+ }
20
+ }, []);
21
+ const handleOnMouseEnter = useCallback(() => {
22
+ clearCloseTimeout();
23
+ if (openDelay && openDelay > 0) {
24
+ openTimeoutRef.current = setTimeout(() => setIsHovered(true), openDelay);
25
+ } else {
26
+ setIsHovered(true);
27
+ }
28
+ }, [clearCloseTimeout, openDelay]);
29
+ const toggleOffIsHovered = useCallback(() => {
30
+ clearOpenTimeout();
31
+ if (closeDelay && closeDelay > 0) {
32
+ closeTimeoutRef.current = setTimeout(() => setIsHovered(false), closeDelay);
33
+ } else {
34
+ setIsHovered(false);
35
+ }
36
+ }, [clearOpenTimeout, closeDelay]);
37
+ const handleOnFocus = useCallback(() => {
38
+ clearCloseTimeout();
39
+ clearOpenTimeout();
40
+ setIsFocused(true);
41
+ }, [clearCloseTimeout, clearOpenTimeout]);
42
+ const toggleOffIsFocused = useCallback(() => {
43
+ clearOpenTimeout();
44
+ clearCloseTimeout();
45
+ setIsFocused(false);
46
+ }, [clearCloseTimeout, clearOpenTimeout]);
11
47
  const handleOnBlur = useCallback(() => {
12
48
  toggleOffIsFocused();
13
49
  }, [toggleOffIsFocused]);
14
50
  const handleOnMouseLeave = useCallback(() => {
15
51
  toggleOffIsHovered();
16
52
  }, [toggleOffIsHovered]);
53
+ useEffect(() => {
54
+ return () => {
55
+ clearOpenTimeout();
56
+ clearCloseTimeout();
57
+ };
58
+ }, [clearCloseTimeout, clearOpenTimeout]);
17
59
  return useMemo(() => {
18
60
  return {
19
61
  isOpen: isHovered || isFocused,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cds-web",
3
- "version": "8.45.0",
3
+ "version": "8.46.0",
4
4
  "description": "Coinbase Design System - Web",
5
5
  "repository": {
6
6
  "type": "git",
@@ -207,7 +207,7 @@
207
207
  "react-dom": "^18.3.1"
208
208
  },
209
209
  "dependencies": {
210
- "@coinbase/cds-common": "^8.45.0",
210
+ "@coinbase/cds-common": "^8.46.0",
211
211
  "@coinbase/cds-icons": "^5.11.0",
212
212
  "@coinbase/cds-illustrations": "^4.31.0",
213
213
  "@coinbase/cds-lottie-files": "^3.3.4",