@x15ventures/x15-ui-library 3.15.1 → 3.16.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 (33) hide show
  1. package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
  2. package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
  3. package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
  4. package/dist/cjs/components/design/skeleton/skeleton.css +17 -12
  5. package/dist/cjs/components/design/tooltip/Tooltip.js +67 -15
  6. package/dist/cjs/components/design/tooltip/Tooltip.js.map +1 -1
  7. package/dist/cjs/components/design/tooltip/tooltip.css +1 -1
  8. package/dist/cjs/hooks/EdgeProximityDetect.js +18 -10
  9. package/dist/cjs/hooks/EdgeProximityDetect.js.map +1 -1
  10. package/dist/cjs/package.json +1 -1
  11. package/dist/cjs/styles/index.css +7 -3
  12. package/dist/cjs/styles/variables/cssVars/_darkModeVariables.css +2 -0
  13. package/dist/cjs/styles/variables/cssVars/_designVariables.css +5 -3
  14. package/dist/components/design/tooltip/Tooltip.d.ts +2 -0
  15. package/dist/components/design/tooltip/Tooltip.d.ts.map +1 -1
  16. package/dist/components/design/tooltip/Tooltip.test.d.ts +2 -0
  17. package/dist/components/design/tooltip/Tooltip.test.d.ts.map +1 -0
  18. package/dist/esm/autoGenerated/libraryThemes.js +12 -12
  19. package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
  20. package/dist/esm/autoGenerated/libraryThemes.json +12 -12
  21. package/dist/esm/components/design/skeleton/skeleton.css +17 -12
  22. package/dist/esm/components/design/tooltip/Tooltip.js +67 -15
  23. package/dist/esm/components/design/tooltip/Tooltip.js.map +1 -1
  24. package/dist/esm/components/design/tooltip/tooltip.css +1 -1
  25. package/dist/esm/hooks/EdgeProximityDetect.js +19 -11
  26. package/dist/esm/hooks/EdgeProximityDetect.js.map +1 -1
  27. package/dist/esm/package.json +1 -1
  28. package/dist/esm/styles/index.css +7 -3
  29. package/dist/esm/styles/variables/cssVars/_darkModeVariables.css +2 -0
  30. package/dist/esm/styles/variables/cssVars/_designVariables.css +5 -3
  31. package/dist/hooks/EdgeProximityDetect.d.ts.map +1 -1
  32. package/dist/package.json +1 -1
  33. package/package.json +1 -1
@@ -17,8 +17,8 @@ const libraryThemes = exports.libraryThemes = {
17
17
  "map": "index.min.css.map"
18
18
  },
19
19
  "versioned": {
20
- "css": "index.min.3.15.1.css",
21
- "map": "index.min.3.15.1.css.map"
20
+ "css": "index.min.3.16.1.css",
21
+ "map": "index.min.3.16.1.css.map"
22
22
  }
23
23
  },
24
24
  "cba": {
@@ -32,8 +32,8 @@ const libraryThemes = exports.libraryThemes = {
32
32
  "map": "cba.min.css.map"
33
33
  },
34
34
  "versioned": {
35
- "css": "cba.min.3.15.1.css",
36
- "map": "cba.min.3.15.1.css.map"
35
+ "css": "cba.min.3.16.1.css",
36
+ "map": "cba.min.3.16.1.css.map"
37
37
  }
38
38
  },
39
39
  "creditSavvy": {
@@ -47,8 +47,8 @@ const libraryThemes = exports.libraryThemes = {
47
47
  "map": "creditSavvy.min.css.map"
48
48
  },
49
49
  "versioned": {
50
- "css": "creditSavvy.min.3.15.1.css",
51
- "map": "creditSavvy.min.3.15.1.css.map"
50
+ "css": "creditSavvy.min.3.16.1.css",
51
+ "map": "creditSavvy.min.3.16.1.css.map"
52
52
  }
53
53
  },
54
54
  "doshii": {
@@ -62,8 +62,8 @@ const libraryThemes = exports.libraryThemes = {
62
62
  "map": "doshii.min.css.map"
63
63
  },
64
64
  "versioned": {
65
- "css": "doshii.min.3.15.1.css",
66
- "map": "doshii.min.3.15.1.css.map"
65
+ "css": "doshii.min.3.16.1.css",
66
+ "map": "doshii.min.3.16.1.css.map"
67
67
  }
68
68
  },
69
69
  "homeIn": {
@@ -77,8 +77,8 @@ const libraryThemes = exports.libraryThemes = {
77
77
  "map": "homeIn.min.css.map"
78
78
  },
79
79
  "versioned": {
80
- "css": "homeIn.min.3.15.1.css",
81
- "map": "homeIn.min.3.15.1.css.map"
80
+ "css": "homeIn.min.3.16.1.css",
81
+ "map": "homeIn.min.3.16.1.css.map"
82
82
  }
83
83
  },
84
84
  "x15Core": {
@@ -92,8 +92,8 @@ const libraryThemes = exports.libraryThemes = {
92
92
  "map": "x15Core.min.css.map"
93
93
  },
94
94
  "versioned": {
95
- "css": "x15Core.min.3.15.1.css",
96
- "map": "x15Core.min.3.15.1.css.map"
95
+ "css": "x15Core.min.3.16.1.css",
96
+ "map": "x15Core.min.3.16.1.css.map"
97
97
  }
98
98
  }
99
99
  };
@@ -1 +1 @@
1
- {"version":3,"file":"libraryThemes.js","names":["libraryThemes","exports","_default","default"],"sources":["../../../src/autoGenerated/libraryThemes.ts"],"sourcesContent":["/* eslint-disable */\nexport const libraryThemes = {\n \"base\": {\n \"buildPath\": \"styles\",\n \"dev\": {\n \"css\": \"index.css\",\n \"map\": \"index.css.map\"\n },\n \"min\": {\n \"css\": \"index.min.css\",\n \"map\": \"index.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"index.min.3.15.1.css\",\n \"map\": \"index.min.3.15.1.css.map\"\n }\n },\n \"cba\": {\n \"buildPath\": \"styles/themes/cba\",\n \"dev\": {\n \"css\": \"cba.css\",\n \"map\": \"cba.css.map\"\n },\n \"min\": {\n \"css\": \"cba.min.css\",\n \"map\": \"cba.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"cba.min.3.15.1.css\",\n \"map\": \"cba.min.3.15.1.css.map\"\n }\n },\n \"creditSavvy\": {\n \"buildPath\": \"styles/themes/creditSavvy\",\n \"dev\": {\n \"css\": \"creditSavvy.css\",\n \"map\": \"creditSavvy.css.map\"\n },\n \"min\": {\n \"css\": \"creditSavvy.min.css\",\n \"map\": \"creditSavvy.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"creditSavvy.min.3.15.1.css\",\n \"map\": \"creditSavvy.min.3.15.1.css.map\"\n }\n },\n \"doshii\": {\n \"buildPath\": \"styles/themes/doshii\",\n \"dev\": {\n \"css\": \"doshii.css\",\n \"map\": \"doshii.css.map\"\n },\n \"min\": {\n \"css\": \"doshii.min.css\",\n \"map\": \"doshii.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"doshii.min.3.15.1.css\",\n \"map\": \"doshii.min.3.15.1.css.map\"\n }\n },\n \"homeIn\": {\n \"buildPath\": \"styles/themes/homeIn\",\n \"dev\": {\n \"css\": \"homeIn.css\",\n \"map\": \"homeIn.css.map\"\n },\n \"min\": {\n \"css\": \"homeIn.min.css\",\n \"map\": \"homeIn.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"homeIn.min.3.15.1.css\",\n \"map\": \"homeIn.min.3.15.1.css.map\"\n }\n },\n \"x15Core\": {\n \"buildPath\": \"styles/themes/x15Core\",\n \"dev\": {\n \"css\": \"x15Core.css\",\n \"map\": \"x15Core.css.map\"\n },\n \"min\": {\n \"css\": \"x15Core.min.css\",\n \"map\": \"x15Core.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"x15Core.min.3.15.1.css\",\n \"map\": \"x15Core.min.3.15.1.css.map\"\n }\n }\n}; export default libraryThemes;"],"mappings":";;;;;;AAAA;AACO,MAAMA,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG;EAC3B,MAAM,EAAE;IACN,WAAW,EAAE,QAAQ;IACrB,KAAK,EAAE;MACL,KAAK,EAAE,WAAW;MAClB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,eAAe;MACtB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,sBAAsB;MAC7B,KAAK,EAAE;IACT;EACF,CAAC;EACD,KAAK,EAAE;IACL,WAAW,EAAE,mBAAmB;IAChC,KAAK,EAAE;MACL,KAAK,EAAE,SAAS;MAChB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,oBAAoB;MAC3B,KAAK,EAAE;IACT;EACF,CAAC;EACD,aAAa,EAAE;IACb,WAAW,EAAE,2BAA2B;IACxC,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,qBAAqB;MAC5B,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,4BAA4B;MACnC,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,SAAS,EAAE;IACT,WAAW,EAAE,uBAAuB;IACpC,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,wBAAwB;MAC/B,KAAK,EAAE;IACT;EACF;AACF,CAAC;AAAC,IAAAE,QAAA,GAAAD,OAAA,CAAAE,OAAA,GAAgBH,aAAa","ignoreList":[]}
1
+ {"version":3,"file":"libraryThemes.js","names":["libraryThemes","exports","_default","default"],"sources":["../../../src/autoGenerated/libraryThemes.ts"],"sourcesContent":["/* eslint-disable */\nexport const libraryThemes = {\n \"base\": {\n \"buildPath\": \"styles\",\n \"dev\": {\n \"css\": \"index.css\",\n \"map\": \"index.css.map\"\n },\n \"min\": {\n \"css\": \"index.min.css\",\n \"map\": \"index.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"index.min.3.16.1.css\",\n \"map\": \"index.min.3.16.1.css.map\"\n }\n },\n \"cba\": {\n \"buildPath\": \"styles/themes/cba\",\n \"dev\": {\n \"css\": \"cba.css\",\n \"map\": \"cba.css.map\"\n },\n \"min\": {\n \"css\": \"cba.min.css\",\n \"map\": \"cba.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"cba.min.3.16.1.css\",\n \"map\": \"cba.min.3.16.1.css.map\"\n }\n },\n \"creditSavvy\": {\n \"buildPath\": \"styles/themes/creditSavvy\",\n \"dev\": {\n \"css\": \"creditSavvy.css\",\n \"map\": \"creditSavvy.css.map\"\n },\n \"min\": {\n \"css\": \"creditSavvy.min.css\",\n \"map\": \"creditSavvy.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"creditSavvy.min.3.16.1.css\",\n \"map\": \"creditSavvy.min.3.16.1.css.map\"\n }\n },\n \"doshii\": {\n \"buildPath\": \"styles/themes/doshii\",\n \"dev\": {\n \"css\": \"doshii.css\",\n \"map\": \"doshii.css.map\"\n },\n \"min\": {\n \"css\": \"doshii.min.css\",\n \"map\": \"doshii.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"doshii.min.3.16.1.css\",\n \"map\": \"doshii.min.3.16.1.css.map\"\n }\n },\n \"homeIn\": {\n \"buildPath\": \"styles/themes/homeIn\",\n \"dev\": {\n \"css\": \"homeIn.css\",\n \"map\": \"homeIn.css.map\"\n },\n \"min\": {\n \"css\": \"homeIn.min.css\",\n \"map\": \"homeIn.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"homeIn.min.3.16.1.css\",\n \"map\": \"homeIn.min.3.16.1.css.map\"\n }\n },\n \"x15Core\": {\n \"buildPath\": \"styles/themes/x15Core\",\n \"dev\": {\n \"css\": \"x15Core.css\",\n \"map\": \"x15Core.css.map\"\n },\n \"min\": {\n \"css\": \"x15Core.min.css\",\n \"map\": \"x15Core.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"x15Core.min.3.16.1.css\",\n \"map\": \"x15Core.min.3.16.1.css.map\"\n }\n }\n}; export default libraryThemes;"],"mappings":";;;;;;AAAA;AACO,MAAMA,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG;EAC3B,MAAM,EAAE;IACN,WAAW,EAAE,QAAQ;IACrB,KAAK,EAAE;MACL,KAAK,EAAE,WAAW;MAClB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,eAAe;MACtB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,sBAAsB;MAC7B,KAAK,EAAE;IACT;EACF,CAAC;EACD,KAAK,EAAE;IACL,WAAW,EAAE,mBAAmB;IAChC,KAAK,EAAE;MACL,KAAK,EAAE,SAAS;MAChB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,oBAAoB;MAC3B,KAAK,EAAE;IACT;EACF,CAAC;EACD,aAAa,EAAE;IACb,WAAW,EAAE,2BAA2B;IACxC,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,qBAAqB;MAC5B,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,4BAA4B;MACnC,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,SAAS,EAAE;IACT,WAAW,EAAE,uBAAuB;IACpC,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,wBAAwB;MAC/B,KAAK,EAAE;IACT;EACF;AACF,CAAC;AAAC,IAAAE,QAAA,GAAAD,OAAA,CAAAE,OAAA,GAAgBH,aAAa","ignoreList":[]}
@@ -10,8 +10,8 @@
10
10
  "map": "index.min.css.map"
11
11
  },
12
12
  "versioned": {
13
- "css": "base.min.3.15.1.css",
14
- "map": "base.min.3.15.1.css.map"
13
+ "css": "base.min.3.16.1.css",
14
+ "map": "base.min.3.16.1.css.map"
15
15
  }
16
16
  },
17
17
  "cba": {
@@ -25,8 +25,8 @@
25
25
  "map": "cba.min.css.map"
26
26
  },
27
27
  "versioned": {
28
- "css": "cba.min.3.15.1.css",
29
- "map": "cba.min.3.15.1.css.map"
28
+ "css": "cba.min.3.16.1.css",
29
+ "map": "cba.min.3.16.1.css.map"
30
30
  }
31
31
  },
32
32
  "creditSavvy": {
@@ -40,8 +40,8 @@
40
40
  "map": "creditSavvy.min.css.map"
41
41
  },
42
42
  "versioned": {
43
- "css": "creditSavvy.min.3.15.1.css",
44
- "map": "creditSavvy.min.3.15.1.css.map"
43
+ "css": "creditSavvy.min.3.16.1.css",
44
+ "map": "creditSavvy.min.3.16.1.css.map"
45
45
  }
46
46
  },
47
47
  "doshii": {
@@ -55,8 +55,8 @@
55
55
  "map": "doshii.min.css.map"
56
56
  },
57
57
  "versioned": {
58
- "css": "doshii.min.3.15.1.css",
59
- "map": "doshii.min.3.15.1.css.map"
58
+ "css": "doshii.min.3.16.1.css",
59
+ "map": "doshii.min.3.16.1.css.map"
60
60
  }
61
61
  },
62
62
  "homeIn": {
@@ -70,8 +70,8 @@
70
70
  "map": "homeIn.min.css.map"
71
71
  },
72
72
  "versioned": {
73
- "css": "homeIn.min.3.15.1.css",
74
- "map": "homeIn.min.3.15.1.css.map"
73
+ "css": "homeIn.min.3.16.1.css",
74
+ "map": "homeIn.min.3.16.1.css.map"
75
75
  }
76
76
  },
77
77
  "x15Core": {
@@ -85,8 +85,8 @@
85
85
  "map": "x15Core.min.css.map"
86
86
  },
87
87
  "versioned": {
88
- "css": "x15Core.min.3.15.1.css",
89
- "map": "x15Core.min.3.15.1.css.map"
88
+ "css": "x15Core.min.3.16.1.css",
89
+ "map": "x15Core.min.3.16.1.css.map"
90
90
  }
91
91
  }
92
92
  }
@@ -11,7 +11,7 @@
11
11
  .skeletonBar {
12
12
  inline-size: 100%;
13
13
  block-size: var(--skeletonHeight, var(--skeletonLineHeight, 1em));
14
- background-color: var(--skeletonBg, #eef2f4);
14
+ background-color: var(--skeletonBg, #e5ebef);
15
15
  border-radius: var(--skeletonBorderRadius, 3px);
16
16
  }
17
17
 
@@ -53,34 +53,39 @@
53
53
  position: absolute;
54
54
  inset: 0;
55
55
  transform: translateX(-100%);
56
- background-image: linear-gradient(90deg, transparent, var(--skeletonHighlight, #f6f8fa), transparent);
57
- animation: skeletonWave var(--skeletonAnimationDuration, 1.6s) linear infinite;
56
+ background-image: linear-gradient(90deg, transparent 20%, var(--skeletonHighlight, #ffffff) 50%, transparent 80%);
57
+ animation: skeletonWave var(--skeletonAnimationDuration, 2s) ease-in-out infinite;
58
58
  }
59
59
 
60
60
  .skeleton_pulse .skeletonBar {
61
- opacity: 1;
62
- animation: skeletonPulse var(--skeletonAnimationDuration, 1.6s) ease-in-out infinite alternate;
61
+ animation: skeletonPulse var(--skeletonAnimationDuration, 2s) ease-in-out infinite;
62
+ }
63
+
64
+ .skeleton_pulse.skeleton_opaque .skeletonBar {
65
+ animation-name: skeletonPulseOpaque;
63
66
  }
64
67
 
65
68
  @keyframes skeletonWave {
66
- to {
69
+ 60%, 100% {
67
70
  transform: translateX(100%);
68
71
  }
69
72
  }
70
73
  @keyframes skeletonPulse {
71
- from {
72
- opacity: 1;
74
+ 50% {
75
+ background-color: var(--skeletonPulseBg, #ffffff);
73
76
  }
74
- to {
75
- opacity: 0.3;
77
+ }
78
+ @keyframes skeletonPulseOpaque {
79
+ 50% {
80
+ background-color: var(--skeletonOpaquePulseBg, #f6f8fa);
76
81
  }
77
82
  }
78
83
  @media (prefers-reduced-motion: reduce) {
79
84
  .skeleton_wave .skeletonBar::after {
80
85
  display: none;
81
86
  }
82
- .skeleton_pulse .skeletonBar {
87
+ .skeleton_pulse .skeletonBar,
88
+ .skeleton_pulse.skeleton_opaque .skeletonBar {
83
89
  animation: none;
84
- opacity: 1;
85
90
  }
86
91
  }
@@ -24,7 +24,8 @@ const Tooltip = props => {
24
24
  containsBlockElements = false,
25
25
  children,
26
26
  label = 'Toggle tooltip open state',
27
- showPointer = true
27
+ showPointer = true,
28
+ hoverDelay
28
29
  // visualIndicators will be handled below
29
30
  } = props;
30
31
 
@@ -34,38 +35,89 @@ const Tooltip = props => {
34
35
  colouredText: true
35
36
  } : undefined;
36
37
  const [isOpen, setIsOpen] = (0, _react.useState)(false);
38
+ const [isHovered, setIsHovered] = (0, _react.useState)(false);
37
39
  const tooltipElement = (0, _react.useRef)(null);
38
40
  const triggerElement = (0, _react.useRef)(null);
39
41
  const contentElement = (0, _react.useRef)(null);
42
+ const hoverTimer = (0, _react.useRef)(null);
40
43
  const iconIsElement = /*#__PURE__*/_react.default.isValidElement(icon);
41
- (0, _ClickOutside.useOnClickOutside)(tooltipElement, () => setIsOpen(false));
44
+
45
+ // Hover is handled in css by default. It is only taken over by js when a delay is requested.
46
+ const hasHoverDelay = typeof hoverDelay === 'number' && hoverDelay > 0;
47
+ const isVisible = isOpen || isHovered;
48
+ const clearHoverTimer = (0, _react.useCallback)(() => {
49
+ if (hoverTimer.current) {
50
+ clearTimeout(hoverTimer.current);
51
+ hoverTimer.current = null;
52
+ }
53
+ }, []);
54
+ const handleMouseEnter = (0, _react.useCallback)(() => {
55
+ clearHoverTimer();
56
+ hoverTimer.current = setTimeout(() => setIsHovered(true), hoverDelay);
57
+ }, [clearHoverTimer, hoverDelay]);
58
+ const handleMouseLeave = (0, _react.useCallback)(() => {
59
+ clearHoverTimer();
60
+ setIsHovered(false);
61
+ }, [clearHoverTimer]);
62
+
63
+ // Single dismissal path, so every close route clears both the click and hover state
64
+ const dismiss = (0, _react.useCallback)(() => {
65
+ clearHoverTimer();
66
+ setIsHovered(false);
67
+ setIsOpen(false);
68
+ }, [clearHoverTimer]);
69
+ const handleTriggerClick = (0, _react.useCallback)(() => {
70
+ if (isVisible) {
71
+ dismiss();
72
+ return;
73
+ }
74
+ clearHoverTimer();
75
+ setIsOpen(true);
76
+ }, [isVisible, dismiss, clearHoverTimer]);
77
+
78
+ // Releasing the delay detaches the mouse handlers, so reset any hover state they left behind
79
+ (0, _react.useEffect)(() => {
80
+ if (!hasHoverDelay) {
81
+ clearHoverTimer();
82
+ setIsHovered(false);
83
+ }
84
+ }, [hasHoverDelay, clearHoverTimer]);
85
+ (0, _react.useEffect)(() => clearHoverTimer, [clearHoverTimer]);
86
+ const hoverHandlers = hasHoverDelay ? {
87
+ onMouseEnter: handleMouseEnter,
88
+ onMouseLeave: handleMouseLeave
89
+ } : {};
90
+ (0, _ClickOutside.useOnClickOutside)(tooltipElement, dismiss);
42
91
  (0, _EdgeProximityDetect.useOnEdgeProximityDetect)({
43
92
  triggerRef: triggerElement,
44
93
  wrapperRef: tooltipElement,
45
94
  contentRef: contentElement,
46
- requiresRecalc: isOpen
95
+ requiresRecalc: isVisible
47
96
  });
48
97
 
49
98
  // Handle special key presses
50
99
  const handleSpecialKeyPresses = (0, _react.useCallback)(event => {
51
100
  if (event.key === 'Escape' || event.keyCode === 27) {
52
- setIsOpen(false);
101
+ dismiss();
53
102
  }
54
- }, [setIsOpen]);
103
+ }, [dismiss]);
55
104
  (0, _react.useEffect)(() => {
56
- if (tooltipElement.current) {
57
- tooltipElement.current.addEventListener('keydown', handleSpecialKeyPresses);
105
+ const wrapper = tooltipElement.current;
106
+ if (!wrapper) {
107
+ return undefined;
58
108
  }
109
+ wrapper.addEventListener('keydown', handleSpecialKeyPresses);
110
+ return () => wrapper.removeEventListener('keydown', handleSpecialKeyPresses);
59
111
  }, [handleSpecialKeyPresses]);
60
112
  if (containsBlockElements) {
61
- return /*#__PURE__*/_react.default.createElement("div", {
113
+ return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
62
114
  role: "tooltip",
63
115
  ref: tooltipElement,
64
- className: `tooltip tooltip_block ${isOpen ? 'isOpen' : ''} ${triggerStyle === 'text' && 'textDisplay'} ${customCssClass || ''}`
65
- }, /*#__PURE__*/_react.default.createElement("button", (0, _extends2.default)({
116
+ className: `tooltip tooltip_block ${isVisible ? 'isOpen' : ''} ${hasHoverDelay ? 'hoverDelayed' : ''} ${triggerStyle === 'text' ? 'textDisplay' : ''} ${customCssClass || ''}`
117
+ }, hoverHandlers), /*#__PURE__*/_react.default.createElement("button", (0, _extends2.default)({
66
118
  ref: triggerElement,
67
119
  type: "button",
68
- onClick: () => setIsOpen(!isOpen),
120
+ onClick: handleTriggerClick,
69
121
  className: `button ${triggerStyle === 'text' ? 'text_only' : 'icon_only'} ${triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : ''} ${triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : ''}`
70
122
  }, triggerId ? {
71
123
  'id': triggerId,
@@ -83,13 +135,13 @@ const Tooltip = props => {
83
135
  id: `${triggerId}_content`
84
136
  } : {}), children));
85
137
  }
86
- return /*#__PURE__*/_react.default.createElement("span", {
138
+ return /*#__PURE__*/_react.default.createElement("span", (0, _extends2.default)({
87
139
  ref: tooltipElement,
88
- className: `tooltip ${isOpen ? 'isOpen' : ''} ${triggerStyle === 'text' && 'textDisplay'} ${customCssClass || ''}`
89
- }, /*#__PURE__*/_react.default.createElement("button", (0, _extends2.default)({
140
+ className: `tooltip ${isVisible ? 'isOpen' : ''} ${hasHoverDelay ? 'hoverDelayed' : ''} ${triggerStyle === 'text' ? 'textDisplay' : ''} ${customCssClass || ''}`
141
+ }, hoverHandlers), /*#__PURE__*/_react.default.createElement("button", (0, _extends2.default)({
90
142
  ref: triggerElement,
91
143
  type: "button",
92
- onClick: () => setIsOpen(!isOpen),
144
+ onClick: handleTriggerClick,
93
145
  className: `button ${triggerStyle === 'text' ? 'text_only' : 'icon_only'} ${triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : ''} ${triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : ''}`
94
146
  }, triggerId ? {
95
147
  id: triggerId
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","Tooltip","_extends2","_react","_interopRequireWildcard","_ClickOutside","_Icon","_EdgeProximityDetect","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","props","triggerId","triggerStyle","icon","customCssClass","containsBlockElements","children","label","showPointer","visualIndicators","underline","colouredText","undefined","isOpen","setIsOpen","useState","tooltipElement","useRef","triggerElement","contentElement","iconIsElement","React","isValidElement","useOnClickOutside","useOnEdgeProximityDetect","triggerRef","wrapperRef","contentRef","requiresRecalc","handleSpecialKeyPresses","useCallback","event","key","keyCode","useEffect","current","addEventListener","createElement","role","ref","className","type","onClick","Icon","toString","id","_default"],"sources":["../../../../../src/components/design/tooltip/Tooltip.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useEffect, useCallback, ReactNode, ReactElement } from 'react';\nimport { useOnClickOutside } from '../../../hooks/ClickOutside';\nimport { Icon } from '../icons/basicIcon/Icon';\nimport { useOnEdgeProximityDetect } from '../../../hooks/EdgeProximityDetect';\nimport './tooltip.scss';\n\n// Define the props for Tooltip\nexport type TooltipProps =\n {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle?: 'icon';\n label?: string | ReactNode;\n showPointer?: boolean;\n }\n | {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle: 'text';\n label?: string | ReactNode;\n showPointer?: boolean;\n visualIndicators?: { underline?: boolean; colouredText?: boolean };\n };\n\nexport const Tooltip: React.FC<TooltipProps> = (props) => {\n const {\n triggerId,\n triggerStyle = 'icon',\n icon = 'info',\n customCssClass,\n containsBlockElements = false,\n children,\n label = 'Toggle tooltip open state',\n showPointer = true,\n // visualIndicators will be handled below\n } = props as any;\n\n // Only use visualIndicators if triggerStyle is 'text'\n const visualIndicators =\n triggerStyle === 'text'\n ? (props as { visualIndicators?: { underline?: boolean; colouredText?: boolean } }).visualIndicators ?? { underline: true, colouredText: true }\n : undefined;\n const [isOpen, setIsOpen] = useState(false);\n const tooltipElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n const triggerElement = useRef<HTMLButtonElement>(null);\n const contentElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n\n const iconIsElement = React.isValidElement(icon);\n\n useOnClickOutside(tooltipElement, () => setIsOpen(false));\n\n useOnEdgeProximityDetect({\n triggerRef: triggerElement,\n wrapperRef: tooltipElement,\n contentRef: contentElement,\n requiresRecalc: isOpen,\n });\n\n // Handle special key presses\n const handleSpecialKeyPresses = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.keyCode === 27) {\n setIsOpen(false);\n }\n },\n [setIsOpen],\n );\n\n useEffect(() => {\n if (tooltipElement.current) {\n tooltipElement.current.addEventListener('keydown', handleSpecialKeyPresses as EventListener);\n }\n }, [handleSpecialKeyPresses]);\n\n if (containsBlockElements) {\n return (\n <div\n role=\"tooltip\"\n ref={ tooltipElement as React.RefObject<HTMLDivElement> }\n className={ `tooltip tooltip_block ${ isOpen ? 'isOpen' : '' } ${ triggerStyle === 'text' && 'textDisplay' } ${ customCssClass || '' }` }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ () => setIsOpen(!isOpen) }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { 'id': triggerId, 'aria-describedby': `${ triggerId }_content` } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <div\n ref={ contentElement as React.RefObject<HTMLDivElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </div>\n </div>\n );\n }\n\n return (\n <span\n ref={ tooltipElement as React.RefObject<HTMLSpanElement> }\n className={ `tooltip ${ isOpen ? 'isOpen' : '' } ${ triggerStyle === 'text' && 'textDisplay' } ${ customCssClass || '' }` }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ () => setIsOpen(!isOpen) }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { id: triggerId } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <span\n aria-hidden\n role=\"presentation\"\n ref={ contentElement as React.RefObject<HTMLSpanElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </span>\n </span>\n );\n};\n\nexport default Tooltip;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Tooltip.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","Tooltip","_extends2","_react","_interopRequireWildcard","_ClickOutside","_Icon","_EdgeProximityDetect","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","props","triggerId","triggerStyle","icon","customCssClass","containsBlockElements","children","label","showPointer","hoverDelay","visualIndicators","underline","colouredText","undefined","isOpen","setIsOpen","useState","isHovered","setIsHovered","tooltipElement","useRef","triggerElement","contentElement","hoverTimer","iconIsElement","React","isValidElement","hasHoverDelay","isVisible","clearHoverTimer","useCallback","current","clearTimeout","handleMouseEnter","setTimeout","handleMouseLeave","dismiss","handleTriggerClick","useEffect","hoverHandlers","onMouseEnter","onMouseLeave","useOnClickOutside","useOnEdgeProximityDetect","triggerRef","wrapperRef","contentRef","requiresRecalc","handleSpecialKeyPresses","event","key","keyCode","wrapper","addEventListener","removeEventListener","createElement","role","ref","className","type","onClick","Icon","toString","id","_default"],"sources":["../../../../../src/components/design/tooltip/Tooltip.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useEffect, useCallback, ReactNode, ReactElement } from 'react';\nimport { useOnClickOutside } from '../../../hooks/ClickOutside';\nimport { Icon } from '../icons/basicIcon/Icon';\nimport { useOnEdgeProximityDetect } from '../../../hooks/EdgeProximityDetect';\nimport './tooltip.scss';\n\n// Define the props for Tooltip\nexport type TooltipProps =\n {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle?: 'icon';\n label?: string | ReactNode;\n showPointer?: boolean;\n hoverDelay?: number;\n }\n | {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle: 'text';\n label?: string | ReactNode;\n showPointer?: boolean;\n hoverDelay?: number;\n visualIndicators?: { underline?: boolean; colouredText?: boolean };\n };\n\nexport const Tooltip: React.FC<TooltipProps> = (props) => {\n const {\n triggerId,\n triggerStyle = 'icon',\n icon = 'info',\n customCssClass,\n containsBlockElements = false,\n children,\n label = 'Toggle tooltip open state',\n showPointer = true,\n hoverDelay,\n // visualIndicators will be handled below\n } = props as any;\n\n // Only use visualIndicators if triggerStyle is 'text'\n const visualIndicators =\n triggerStyle === 'text'\n ? (props as { visualIndicators?: { underline?: boolean; colouredText?: boolean } }).visualIndicators ?? { underline: true, colouredText: true }\n : undefined;\n const [isOpen, setIsOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const tooltipElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n const triggerElement = useRef<HTMLButtonElement>(null);\n const contentElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const iconIsElement = React.isValidElement(icon);\n\n // Hover is handled in css by default. It is only taken over by js when a delay is requested.\n const hasHoverDelay = typeof hoverDelay === 'number' && hoverDelay > 0;\n const isVisible = isOpen || isHovered;\n\n const clearHoverTimer = useCallback(() => {\n if (hoverTimer.current) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n }, []);\n\n const handleMouseEnter = useCallback(() => {\n clearHoverTimer();\n hoverTimer.current = setTimeout(() => setIsHovered(true), hoverDelay);\n }, [clearHoverTimer, hoverDelay]);\n\n const handleMouseLeave = useCallback(() => {\n clearHoverTimer();\n setIsHovered(false);\n }, [clearHoverTimer]);\n\n // Single dismissal path, so every close route clears both the click and hover state\n const dismiss = useCallback(() => {\n clearHoverTimer();\n setIsHovered(false);\n setIsOpen(false);\n }, [clearHoverTimer]);\n\n const handleTriggerClick = useCallback(() => {\n if (isVisible) {\n dismiss();\n return;\n }\n clearHoverTimer();\n setIsOpen(true);\n }, [isVisible, dismiss, clearHoverTimer]);\n\n // Releasing the delay detaches the mouse handlers, so reset any hover state they left behind\n useEffect(() => {\n if (!hasHoverDelay) {\n clearHoverTimer();\n setIsHovered(false);\n }\n }, [hasHoverDelay, clearHoverTimer]);\n\n useEffect(() => clearHoverTimer, [clearHoverTimer]);\n\n const hoverHandlers = hasHoverDelay\n ? { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave }\n : {};\n\n useOnClickOutside(tooltipElement, dismiss);\n\n useOnEdgeProximityDetect({\n triggerRef: triggerElement,\n wrapperRef: tooltipElement,\n contentRef: contentElement,\n requiresRecalc: isVisible,\n });\n\n // Handle special key presses\n const handleSpecialKeyPresses = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.keyCode === 27) {\n dismiss();\n }\n },\n [dismiss],\n );\n\n useEffect(() => {\n const wrapper = tooltipElement.current;\n if (!wrapper) {\n return undefined;\n }\n wrapper.addEventListener('keydown', handleSpecialKeyPresses as EventListener);\n return () => wrapper.removeEventListener('keydown', handleSpecialKeyPresses as EventListener);\n }, [handleSpecialKeyPresses]);\n\n if (containsBlockElements) {\n return (\n <div\n role=\"tooltip\"\n ref={ tooltipElement as React.RefObject<HTMLDivElement> }\n className={ `tooltip tooltip_block ${ isVisible ? 'isOpen' : '' } ${ hasHoverDelay ? 'hoverDelayed' : '' } ${ triggerStyle === 'text' ? 'textDisplay' : '' } ${ customCssClass || '' }` }\n { ...hoverHandlers }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ handleTriggerClick }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { 'id': triggerId, 'aria-describedby': `${ triggerId }_content` } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <div\n ref={ contentElement as React.RefObject<HTMLDivElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </div>\n </div>\n );\n }\n\n return (\n <span\n ref={ tooltipElement as React.RefObject<HTMLSpanElement> }\n className={ `tooltip ${ isVisible ? 'isOpen' : '' } ${ hasHoverDelay ? 'hoverDelayed' : '' } ${ triggerStyle === 'text' ? 'textDisplay' : '' } ${ customCssClass || '' }` }\n { ...hoverHandlers }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ handleTriggerClick }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { id: triggerId } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <span\n aria-hidden\n role=\"presentation\"\n ref={ contentElement as React.RefObject<HTMLSpanElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </span>\n </span>\n );\n};\n\nexport default Tooltip;\n"],"mappings":"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","ignoreList":[]}
@@ -93,7 +93,7 @@
93
93
  .tooltip.large .content:before {
94
94
  left: 160px;
95
95
  }
96
- .tooltip:hover .content, .tooltip.isOpen .content {
96
+ .tooltip:not(.hoverDelayed):hover .content, .tooltip.isOpen .content {
97
97
  display: block;
98
98
  }
99
99
  .tooltip.measuring .content {
@@ -11,6 +11,9 @@ const useOnEdgeProximityDetect = ({
11
11
  contentRef,
12
12
  requiresRecalc
13
13
  }) => {
14
+ // Only the shift classes this hook applied, so a consumer supplied
15
+ // customCssClass such as "shiftDown" is never stripped
16
+ const appliedShiftClasses = (0, _react.useRef)([]);
14
17
  const xAxisOverride = ({
15
18
  left,
16
19
  width,
@@ -45,6 +48,10 @@ const useOnEdgeProximityDetect = ({
45
48
  };
46
49
  (0, _react.useEffect)(() => {
47
50
  if (wrapperRef.current && contentRef.current && triggerRef.current && document && document.body) {
51
+ // Clear the previous run's shift, otherwise the content is measured in its
52
+ // already-shifted position and can accumulate opposing shift classes
53
+ appliedShiftClasses.current.forEach(cssClass => wrapperRef.current?.classList.remove(cssClass));
54
+ appliedShiftClasses.current = [];
48
55
  wrapperRef.current.classList.add('measuring');
49
56
  const {
50
57
  clientWidth,
@@ -58,22 +65,23 @@ const useOnEdgeProximityDetect = ({
58
65
  } = contentRef.current.getBoundingClientRect();
59
66
 
60
67
  // Check if it needs x-axis or y-axis adjustment
61
- const xAxisOverrideCssClass = xAxisOverride({
68
+ const applyShift = cssClass => {
69
+ if (!cssClass || !wrapperRef.current || wrapperRef.current.classList.contains(cssClass)) {
70
+ return;
71
+ }
72
+ wrapperRef.current.classList.add(cssClass);
73
+ appliedShiftClasses.current.push(cssClass);
74
+ };
75
+ applyShift(xAxisOverride({
62
76
  left,
63
77
  width,
64
78
  clientWidth
65
- });
66
- if (xAxisOverrideCssClass) {
67
- wrapperRef.current.classList.add(xAxisOverrideCssClass);
68
- }
69
- const yAxisOverrideCssClass = yAxisOverride({
79
+ }));
80
+ applyShift(yAxisOverride({
70
81
  top,
71
82
  height,
72
83
  clientHeight
73
- });
74
- if (yAxisOverrideCssClass) {
75
- wrapperRef.current.classList.add(yAxisOverrideCssClass);
76
- }
84
+ }));
77
85
  wrapperRef.current.classList.remove('measuring');
78
86
  }
79
87
  }, [triggerRef, wrapperRef, contentRef, requiresRecalc]);
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeProximityDetect.js","names":["_react","require","useOnEdgeProximityDetect","triggerRef","wrapperRef","contentRef","requiresRecalc","xAxisOverride","left","width","clientWidth","yAxisOverride","top","height","clientHeight","useEffect","current","document","body","classList","add","getBoundingClientRect","xAxisOverrideCssClass","yAxisOverrideCssClass","remove","exports"],"sources":["../../../src/hooks/EdgeProximityDetect.ts"],"sourcesContent":["import React, { useEffect } from 'react';\n\ninterface UseOnEdgeProximityDetectProps {\n triggerRef: React.RefObject<HTMLElement>;\n wrapperRef: React.RefObject<HTMLElement>;\n contentRef: React.RefObject<HTMLElement>;\n requiresRecalc: boolean;\n preferredPlacement?: 'right-middle' | 'right-top' | 'right-bottom' | 'left-middle' | 'left-top' | 'left-bottom' | 'top-middle' | 'top-top' | 'top-bottom' | 'bottom-middle' | 'bottom-top' | 'bottom-bottom';\n}\n\nexport const useOnEdgeProximityDetect = (\n {\n triggerRef,\n wrapperRef,\n contentRef,\n requiresRecalc\n }\n :\n UseOnEdgeProximityDetectProps\n) => {\n const xAxisOverride = (\n {\n left,\n width,\n clientWidth\n }\n :\n {\n left: number;\n width: number;\n clientWidth: number\n }\n ) => {\n // Too close to left\n if (left < 0) {\n return 'shiftRight';\n }\n\n // Too close to right\n if (left + width > clientWidth) {\n return 'shiftLeft';\n }\n return '';\n };\n\n const yAxisOverride = (\n {\n top,\n height,\n clientHeight\n }\n :\n {\n top: number;\n height: number;\n clientHeight: number\n }\n ) => {\n // Too close to top\n if (top - height < 0) {\n return 'shiftDown';\n }\n\n // Too close to bottom\n if (top + height > clientHeight) {\n return 'shiftUp';\n }\n return '';\n };\n\n useEffect(() => {\n if (\n wrapperRef.current\n && contentRef.current\n && triggerRef.current\n && document\n && document.body\n ) {\n wrapperRef.current.classList.add('measuring');\n const { clientWidth, clientHeight } = document.body;\n const {\n width, height, top, left\n } = contentRef.current.getBoundingClientRect();\n\n // Check if it needs x-axis or y-axis adjustment\n const xAxisOverrideCssClass = xAxisOverride({ left, width, clientWidth });\n if (xAxisOverrideCssClass) {\n wrapperRef.current.classList.add(xAxisOverrideCssClass);\n }\n\n const yAxisOverrideCssClass = yAxisOverride({ top, height, clientHeight });\n if (yAxisOverrideCssClass) {\n wrapperRef.current.classList.add(yAxisOverrideCssClass);\n }\n\n wrapperRef.current.classList.remove('measuring');\n }\n }, [triggerRef, wrapperRef, contentRef, requiresRecalc]);\n\n return {};\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAUO,MAAMC,wBAAwB,GAAGA,CACtC;EACEC,UAAU;EACVC,UAAU;EACVC,UAAU;EACVC;AAG0B,CAAC,KAC1B;EACH,MAAMC,aAAa,GAAGA,CACpB;IACEC,IAAI;IACJC,KAAK;IACLC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,IAAI,GAAG,CAAC,EAAE;MACZ,OAAO,YAAY;IACrB;;IAEA;IACA,IAAIA,IAAI,GAAGC,KAAK,GAAGC,WAAW,EAAE;MAC9B,OAAO,WAAW;IACpB;IACA,OAAO,EAAE;EACX,CAAC;EAED,MAAMC,aAAa,GAAGA,CACpB;IACEC,GAAG;IACHC,MAAM;IACNC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,GAAG,GAAGC,MAAM,GAAG,CAAC,EAAE;MACpB,OAAO,WAAW;IACpB;;IAEA;IACA,IAAID,GAAG,GAAGC,MAAM,GAAGC,YAAY,EAAE;MAC/B,OAAO,SAAS;IAClB;IACA,OAAO,EAAE;EACX,CAAC;EAED,IAAAC,gBAAS,EAAC,MAAM;IACd,IACEX,UAAU,CAACY,OAAO,IACfX,UAAU,CAACW,OAAO,IAClBb,UAAU,CAACa,OAAO,IAClBC,QAAQ,IACRA,QAAQ,CAACC,IAAI,EAChB;MACAd,UAAU,CAACY,OAAO,CAACG,SAAS,CAACC,GAAG,CAAC,WAAW,CAAC;MAC7C,MAAM;QAAEV,WAAW;QAAEI;MAAa,CAAC,GAAGG,QAAQ,CAACC,IAAI;MACnD,MAAM;QACJT,KAAK;QAAEI,MAAM;QAAED,GAAG;QAAEJ;MACtB,CAAC,GAAGH,UAAU,CAACW,OAAO,CAACK,qBAAqB,CAAC,CAAC;;MAE9C;MACA,MAAMC,qBAAqB,GAAGf,aAAa,CAAC;QAAEC,IAAI;QAAEC,KAAK;QAAEC;MAAY,CAAC,CAAC;MACzE,IAAIY,qBAAqB,EAAE;QACzBlB,UAAU,CAACY,OAAO,CAACG,SAAS,CAACC,GAAG,CAACE,qBAAqB,CAAC;MACzD;MAEA,MAAMC,qBAAqB,GAAGZ,aAAa,CAAC;QAAEC,GAAG;QAAEC,MAAM;QAAEC;MAAa,CAAC,CAAC;MAC1E,IAAIS,qBAAqB,EAAE;QACzBnB,UAAU,CAACY,OAAO,CAACG,SAAS,CAACC,GAAG,CAACG,qBAAqB,CAAC;MACzD;MAEAnB,UAAU,CAACY,OAAO,CAACG,SAAS,CAACK,MAAM,CAAC,WAAW,CAAC;IAClD;EACF,CAAC,EAAE,CAACrB,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAEC,cAAc,CAAC,CAAC;EAExD,OAAO,CAAC,CAAC;AACX,CAAC;AAACmB,OAAA,CAAAvB,wBAAA,GAAAA,wBAAA","ignoreList":[]}
1
+ {"version":3,"file":"EdgeProximityDetect.js","names":["_react","require","useOnEdgeProximityDetect","triggerRef","wrapperRef","contentRef","requiresRecalc","appliedShiftClasses","useRef","xAxisOverride","left","width","clientWidth","yAxisOverride","top","height","clientHeight","useEffect","current","document","body","forEach","cssClass","classList","remove","add","getBoundingClientRect","applyShift","contains","push","exports"],"sources":["../../../src/hooks/EdgeProximityDetect.ts"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\n\ninterface UseOnEdgeProximityDetectProps {\n triggerRef: React.RefObject<HTMLElement>;\n wrapperRef: React.RefObject<HTMLElement>;\n contentRef: React.RefObject<HTMLElement>;\n requiresRecalc: boolean;\n preferredPlacement?: 'right-middle' | 'right-top' | 'right-bottom' | 'left-middle' | 'left-top' | 'left-bottom' | 'top-middle' | 'top-top' | 'top-bottom' | 'bottom-middle' | 'bottom-top' | 'bottom-bottom';\n}\n\nexport const useOnEdgeProximityDetect = (\n {\n triggerRef,\n wrapperRef,\n contentRef,\n requiresRecalc\n }\n :\n UseOnEdgeProximityDetectProps\n) => {\n // Only the shift classes this hook applied, so a consumer supplied\n // customCssClass such as \"shiftDown\" is never stripped\n const appliedShiftClasses = useRef<string[]>([]);\n\n const xAxisOverride = (\n {\n left,\n width,\n clientWidth\n }\n :\n {\n left: number;\n width: number;\n clientWidth: number\n }\n ) => {\n // Too close to left\n if (left < 0) {\n return 'shiftRight';\n }\n\n // Too close to right\n if (left + width > clientWidth) {\n return 'shiftLeft';\n }\n return '';\n };\n\n const yAxisOverride = (\n {\n top,\n height,\n clientHeight\n }\n :\n {\n top: number;\n height: number;\n clientHeight: number\n }\n ) => {\n // Too close to top\n if (top - height < 0) {\n return 'shiftDown';\n }\n\n // Too close to bottom\n if (top + height > clientHeight) {\n return 'shiftUp';\n }\n return '';\n };\n\n useEffect(() => {\n if (\n wrapperRef.current\n && contentRef.current\n && triggerRef.current\n && document\n && document.body\n ) {\n // Clear the previous run's shift, otherwise the content is measured in its\n // already-shifted position and can accumulate opposing shift classes\n appliedShiftClasses.current.forEach((cssClass) => wrapperRef.current?.classList.remove(cssClass));\n appliedShiftClasses.current = [];\n\n wrapperRef.current.classList.add('measuring');\n const { clientWidth, clientHeight } = document.body;\n const {\n width, height, top, left\n } = contentRef.current.getBoundingClientRect();\n\n // Check if it needs x-axis or y-axis adjustment\n const applyShift = (cssClass: string) => {\n if (!cssClass || !wrapperRef.current || wrapperRef.current.classList.contains(cssClass)) {\n return;\n }\n wrapperRef.current.classList.add(cssClass);\n appliedShiftClasses.current.push(cssClass);\n };\n\n applyShift(xAxisOverride({ left, width, clientWidth }));\n applyShift(yAxisOverride({ top, height, clientHeight }));\n\n wrapperRef.current.classList.remove('measuring');\n }\n }, [triggerRef, wrapperRef, contentRef, requiresRecalc]);\n\n return {};\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAUO,MAAMC,wBAAwB,GAAGA,CACtC;EACEC,UAAU;EACVC,UAAU;EACVC,UAAU;EACVC;AAG0B,CAAC,KAC1B;EACH;EACA;EACA,MAAMC,mBAAmB,GAAG,IAAAC,aAAM,EAAW,EAAE,CAAC;EAEhD,MAAMC,aAAa,GAAGA,CACpB;IACEC,IAAI;IACJC,KAAK;IACLC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,IAAI,GAAG,CAAC,EAAE;MACZ,OAAO,YAAY;IACrB;;IAEA;IACA,IAAIA,IAAI,GAAGC,KAAK,GAAGC,WAAW,EAAE;MAC9B,OAAO,WAAW;IACpB;IACA,OAAO,EAAE;EACX,CAAC;EAED,MAAMC,aAAa,GAAGA,CACpB;IACEC,GAAG;IACHC,MAAM;IACNC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,GAAG,GAAGC,MAAM,GAAG,CAAC,EAAE;MACpB,OAAO,WAAW;IACpB;;IAEA;IACA,IAAID,GAAG,GAAGC,MAAM,GAAGC,YAAY,EAAE;MAC/B,OAAO,SAAS;IAClB;IACA,OAAO,EAAE;EACX,CAAC;EAED,IAAAC,gBAAS,EAAC,MAAM;IACd,IACEb,UAAU,CAACc,OAAO,IACfb,UAAU,CAACa,OAAO,IAClBf,UAAU,CAACe,OAAO,IAClBC,QAAQ,IACRA,QAAQ,CAACC,IAAI,EAChB;MACA;MACA;MACAb,mBAAmB,CAACW,OAAO,CAACG,OAAO,CAAEC,QAAQ,IAAKlB,UAAU,CAACc,OAAO,EAAEK,SAAS,CAACC,MAAM,CAACF,QAAQ,CAAC,CAAC;MACjGf,mBAAmB,CAACW,OAAO,GAAG,EAAE;MAEhCd,UAAU,CAACc,OAAO,CAACK,SAAS,CAACE,GAAG,CAAC,WAAW,CAAC;MAC7C,MAAM;QAAEb,WAAW;QAAEI;MAAa,CAAC,GAAGG,QAAQ,CAACC,IAAI;MACnD,MAAM;QACJT,KAAK;QAAEI,MAAM;QAAED,GAAG;QAAEJ;MACtB,CAAC,GAAGL,UAAU,CAACa,OAAO,CAACQ,qBAAqB,CAAC,CAAC;;MAE9C;MACA,MAAMC,UAAU,GAAIL,QAAgB,IAAK;QACvC,IAAI,CAACA,QAAQ,IAAI,CAAClB,UAAU,CAACc,OAAO,IAAId,UAAU,CAACc,OAAO,CAACK,SAAS,CAACK,QAAQ,CAACN,QAAQ,CAAC,EAAE;UACvF;QACF;QACAlB,UAAU,CAACc,OAAO,CAACK,SAAS,CAACE,GAAG,CAACH,QAAQ,CAAC;QAC1Cf,mBAAmB,CAACW,OAAO,CAACW,IAAI,CAACP,QAAQ,CAAC;MAC5C,CAAC;MAEDK,UAAU,CAAClB,aAAa,CAAC;QAAEC,IAAI;QAAEC,KAAK;QAAEC;MAAY,CAAC,CAAC,CAAC;MACvDe,UAAU,CAACd,aAAa,CAAC;QAAEC,GAAG;QAAEC,MAAM;QAAEC;MAAa,CAAC,CAAC,CAAC;MAExDZ,UAAU,CAACc,OAAO,CAACK,SAAS,CAACC,MAAM,CAAC,WAAW,CAAC;IAClD;EACF,CAAC,EAAE,CAACrB,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAEC,cAAc,CAAC,CAAC;EAExD,OAAO,CAAC,CAAC;AACX,CAAC;AAACwB,OAAA,CAAA5B,wBAAA,GAAAA,wBAAA","ignoreList":[]}
@@ -137,7 +137,7 @@
137
137
  "files": [
138
138
  "dist"
139
139
  ],
140
- "version": "3.15.0",
140
+ "version": "3.16.0",
141
141
  "devEngines": {
142
142
  "runtime": {
143
143
  "name": "node",
@@ -254,9 +254,11 @@
254
254
  --notificationIconFg: #fff;
255
255
  --notificationIconBorder: 4px solid #c00;
256
256
  --notificationIconBoxShadow: none;
257
- --skeletonBg: #eef2f4;
257
+ --skeletonBg: #e5ebef;
258
258
  --skeletonOpaqueBg: #d3dee4;
259
- --skeletonHighlight: #f6f8fa;
259
+ --skeletonHighlight: #ffffff;
260
+ --skeletonPulseBg: #ffffff;
261
+ --skeletonOpaquePulseBg: #f6f8fa;
260
262
  --skeletonBorderRadius: 3px;
261
263
  --skeletonRoundedBorderRadius: 8px;
262
264
  --skeletonLineHeight: 1em;
@@ -264,7 +266,7 @@
264
266
  --skeletonBlockHeight: 120px;
265
267
  --skeletonCircleSize: 40px;
266
268
  --skeletonLastLineWidth: 60%;
267
- --skeletonAnimationDuration: 1.6s;
269
+ --skeletonAnimationDuration: 2s;
268
270
  }
269
271
 
270
272
  :root {
@@ -611,6 +613,8 @@
611
613
  --skeletonBg: #1a1410;
612
614
  --skeletonHighlight: #3d2f26;
613
615
  --skeletonOpaqueBg: #2c211b;
616
+ --skeletonOpaquePulseBg: #4d3b30;
617
+ --skeletonPulseBg: #3d2f26;
614
618
  --statusAlertColor: #000;
615
619
  --statusDefCon3Bg: radial-gradient(circle at 60% 40%, #003, #000, #333); /* gradient stops inverted */
616
620
  --statusDefCon3Color: #003;
@@ -236,6 +236,8 @@
236
236
  --skeletonBg: #1a1410;
237
237
  --skeletonHighlight: #3d2f26;
238
238
  --skeletonOpaqueBg: #2c211b;
239
+ --skeletonOpaquePulseBg: #4d3b30;
240
+ --skeletonPulseBg: #3d2f26;
239
241
  --statusAlertColor: #000;
240
242
  --statusDefCon3Bg: radial-gradient(circle at 60% 40%, #003, #000, #333); /* gradient stops inverted */
241
243
  --statusDefCon3Color: #003;
@@ -216,9 +216,11 @@
216
216
  --notificationIconFg: #fff;
217
217
  --notificationIconBorder: 4px solid #c00;
218
218
  --notificationIconBoxShadow: none;
219
- --skeletonBg: #eef2f4;
219
+ --skeletonBg: #e5ebef;
220
220
  --skeletonOpaqueBg: #d3dee4;
221
- --skeletonHighlight: #f6f8fa;
221
+ --skeletonHighlight: #ffffff;
222
+ --skeletonPulseBg: #ffffff;
223
+ --skeletonOpaquePulseBg: #f6f8fa;
222
224
  --skeletonBorderRadius: 3px;
223
225
  --skeletonRoundedBorderRadius: 8px;
224
226
  --skeletonLineHeight: 1em;
@@ -226,5 +228,5 @@
226
228
  --skeletonBlockHeight: 120px;
227
229
  --skeletonCircleSize: 40px;
228
230
  --skeletonLastLineWidth: 60%;
229
- --skeletonAnimationDuration: 1.6s;
231
+ --skeletonAnimationDuration: 2s;
230
232
  }
@@ -9,6 +9,7 @@ export type TooltipProps = {
9
9
  triggerStyle?: 'icon';
10
10
  label?: string | ReactNode;
11
11
  showPointer?: boolean;
12
+ hoverDelay?: number;
12
13
  } | {
13
14
  triggerId?: string;
14
15
  icon?: ReactElement | string;
@@ -18,6 +19,7 @@ export type TooltipProps = {
18
19
  triggerStyle: 'text';
19
20
  label?: string | ReactNode;
20
21
  showPointer?: boolean;
22
+ hoverDelay?: number;
21
23
  visualIndicators?: {
22
24
  underline?: boolean;
23
25
  colouredText?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../../src/components/design/tooltip/Tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAA4C,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAIjG,OAAO,gBAAgB,CAAC;AAGxB,MAAM,MAAM,YAAY,GACrB;IACG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACD;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpE,CAAC;AAEN,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA0G1C,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../../src/components/design/tooltip/Tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAA4C,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAIjG,OAAO,gBAAgB,CAAC;AAGxB,MAAM,MAAM,YAAY,GACrB;IACG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACD;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpE,CAAC;AAEN,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAqK1C,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Tooltip.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.test.d.ts","sourceRoot":"","sources":["../../../../src/components/design/tooltip/Tooltip.test.tsx"],"names":[],"mappings":""}
@@ -11,8 +11,8 @@ export const libraryThemes = {
11
11
  "map": "index.min.css.map"
12
12
  },
13
13
  "versioned": {
14
- "css": "index.min.3.15.1.css",
15
- "map": "index.min.3.15.1.css.map"
14
+ "css": "index.min.3.16.1.css",
15
+ "map": "index.min.3.16.1.css.map"
16
16
  }
17
17
  },
18
18
  "cba": {
@@ -26,8 +26,8 @@ export const libraryThemes = {
26
26
  "map": "cba.min.css.map"
27
27
  },
28
28
  "versioned": {
29
- "css": "cba.min.3.15.1.css",
30
- "map": "cba.min.3.15.1.css.map"
29
+ "css": "cba.min.3.16.1.css",
30
+ "map": "cba.min.3.16.1.css.map"
31
31
  }
32
32
  },
33
33
  "creditSavvy": {
@@ -41,8 +41,8 @@ export const libraryThemes = {
41
41
  "map": "creditSavvy.min.css.map"
42
42
  },
43
43
  "versioned": {
44
- "css": "creditSavvy.min.3.15.1.css",
45
- "map": "creditSavvy.min.3.15.1.css.map"
44
+ "css": "creditSavvy.min.3.16.1.css",
45
+ "map": "creditSavvy.min.3.16.1.css.map"
46
46
  }
47
47
  },
48
48
  "doshii": {
@@ -56,8 +56,8 @@ export const libraryThemes = {
56
56
  "map": "doshii.min.css.map"
57
57
  },
58
58
  "versioned": {
59
- "css": "doshii.min.3.15.1.css",
60
- "map": "doshii.min.3.15.1.css.map"
59
+ "css": "doshii.min.3.16.1.css",
60
+ "map": "doshii.min.3.16.1.css.map"
61
61
  }
62
62
  },
63
63
  "homeIn": {
@@ -71,8 +71,8 @@ export const libraryThemes = {
71
71
  "map": "homeIn.min.css.map"
72
72
  },
73
73
  "versioned": {
74
- "css": "homeIn.min.3.15.1.css",
75
- "map": "homeIn.min.3.15.1.css.map"
74
+ "css": "homeIn.min.3.16.1.css",
75
+ "map": "homeIn.min.3.16.1.css.map"
76
76
  }
77
77
  },
78
78
  "x15Core": {
@@ -86,8 +86,8 @@ export const libraryThemes = {
86
86
  "map": "x15Core.min.css.map"
87
87
  },
88
88
  "versioned": {
89
- "css": "x15Core.min.3.15.1.css",
90
- "map": "x15Core.min.3.15.1.css.map"
89
+ "css": "x15Core.min.3.16.1.css",
90
+ "map": "x15Core.min.3.16.1.css.map"
91
91
  }
92
92
  }
93
93
  };
@@ -1 +1 @@
1
- {"version":3,"file":"libraryThemes.js","names":["libraryThemes"],"sources":["../../../src/autoGenerated/libraryThemes.ts"],"sourcesContent":["/* eslint-disable */\nexport const libraryThemes = {\n \"base\": {\n \"buildPath\": \"styles\",\n \"dev\": {\n \"css\": \"index.css\",\n \"map\": \"index.css.map\"\n },\n \"min\": {\n \"css\": \"index.min.css\",\n \"map\": \"index.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"index.min.3.15.1.css\",\n \"map\": \"index.min.3.15.1.css.map\"\n }\n },\n \"cba\": {\n \"buildPath\": \"styles/themes/cba\",\n \"dev\": {\n \"css\": \"cba.css\",\n \"map\": \"cba.css.map\"\n },\n \"min\": {\n \"css\": \"cba.min.css\",\n \"map\": \"cba.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"cba.min.3.15.1.css\",\n \"map\": \"cba.min.3.15.1.css.map\"\n }\n },\n \"creditSavvy\": {\n \"buildPath\": \"styles/themes/creditSavvy\",\n \"dev\": {\n \"css\": \"creditSavvy.css\",\n \"map\": \"creditSavvy.css.map\"\n },\n \"min\": {\n \"css\": \"creditSavvy.min.css\",\n \"map\": \"creditSavvy.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"creditSavvy.min.3.15.1.css\",\n \"map\": \"creditSavvy.min.3.15.1.css.map\"\n }\n },\n \"doshii\": {\n \"buildPath\": \"styles/themes/doshii\",\n \"dev\": {\n \"css\": \"doshii.css\",\n \"map\": \"doshii.css.map\"\n },\n \"min\": {\n \"css\": \"doshii.min.css\",\n \"map\": \"doshii.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"doshii.min.3.15.1.css\",\n \"map\": \"doshii.min.3.15.1.css.map\"\n }\n },\n \"homeIn\": {\n \"buildPath\": \"styles/themes/homeIn\",\n \"dev\": {\n \"css\": \"homeIn.css\",\n \"map\": \"homeIn.css.map\"\n },\n \"min\": {\n \"css\": \"homeIn.min.css\",\n \"map\": \"homeIn.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"homeIn.min.3.15.1.css\",\n \"map\": \"homeIn.min.3.15.1.css.map\"\n }\n },\n \"x15Core\": {\n \"buildPath\": \"styles/themes/x15Core\",\n \"dev\": {\n \"css\": \"x15Core.css\",\n \"map\": \"x15Core.css.map\"\n },\n \"min\": {\n \"css\": \"x15Core.min.css\",\n \"map\": \"x15Core.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"x15Core.min.3.15.1.css\",\n \"map\": \"x15Core.min.3.15.1.css.map\"\n }\n }\n}; export default libraryThemes;"],"mappings":"AAAA;AACA,OAAO,MAAMA,aAAa,GAAG;EAC3B,MAAM,EAAE;IACN,WAAW,EAAE,QAAQ;IACrB,KAAK,EAAE;MACL,KAAK,EAAE,WAAW;MAClB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,eAAe;MACtB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,sBAAsB;MAC7B,KAAK,EAAE;IACT;EACF,CAAC;EACD,KAAK,EAAE;IACL,WAAW,EAAE,mBAAmB;IAChC,KAAK,EAAE;MACL,KAAK,EAAE,SAAS;MAChB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,oBAAoB;MAC3B,KAAK,EAAE;IACT;EACF,CAAC;EACD,aAAa,EAAE;IACb,WAAW,EAAE,2BAA2B;IACxC,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,qBAAqB;MAC5B,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,4BAA4B;MACnC,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,SAAS,EAAE;IACT,WAAW,EAAE,uBAAuB;IACpC,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,wBAAwB;MAC/B,KAAK,EAAE;IACT;EACF;AACF,CAAC;AAAE,eAAeA,aAAa","ignoreList":[]}
1
+ {"version":3,"file":"libraryThemes.js","names":["libraryThemes"],"sources":["../../../src/autoGenerated/libraryThemes.ts"],"sourcesContent":["/* eslint-disable */\nexport const libraryThemes = {\n \"base\": {\n \"buildPath\": \"styles\",\n \"dev\": {\n \"css\": \"index.css\",\n \"map\": \"index.css.map\"\n },\n \"min\": {\n \"css\": \"index.min.css\",\n \"map\": \"index.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"index.min.3.16.1.css\",\n \"map\": \"index.min.3.16.1.css.map\"\n }\n },\n \"cba\": {\n \"buildPath\": \"styles/themes/cba\",\n \"dev\": {\n \"css\": \"cba.css\",\n \"map\": \"cba.css.map\"\n },\n \"min\": {\n \"css\": \"cba.min.css\",\n \"map\": \"cba.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"cba.min.3.16.1.css\",\n \"map\": \"cba.min.3.16.1.css.map\"\n }\n },\n \"creditSavvy\": {\n \"buildPath\": \"styles/themes/creditSavvy\",\n \"dev\": {\n \"css\": \"creditSavvy.css\",\n \"map\": \"creditSavvy.css.map\"\n },\n \"min\": {\n \"css\": \"creditSavvy.min.css\",\n \"map\": \"creditSavvy.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"creditSavvy.min.3.16.1.css\",\n \"map\": \"creditSavvy.min.3.16.1.css.map\"\n }\n },\n \"doshii\": {\n \"buildPath\": \"styles/themes/doshii\",\n \"dev\": {\n \"css\": \"doshii.css\",\n \"map\": \"doshii.css.map\"\n },\n \"min\": {\n \"css\": \"doshii.min.css\",\n \"map\": \"doshii.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"doshii.min.3.16.1.css\",\n \"map\": \"doshii.min.3.16.1.css.map\"\n }\n },\n \"homeIn\": {\n \"buildPath\": \"styles/themes/homeIn\",\n \"dev\": {\n \"css\": \"homeIn.css\",\n \"map\": \"homeIn.css.map\"\n },\n \"min\": {\n \"css\": \"homeIn.min.css\",\n \"map\": \"homeIn.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"homeIn.min.3.16.1.css\",\n \"map\": \"homeIn.min.3.16.1.css.map\"\n }\n },\n \"x15Core\": {\n \"buildPath\": \"styles/themes/x15Core\",\n \"dev\": {\n \"css\": \"x15Core.css\",\n \"map\": \"x15Core.css.map\"\n },\n \"min\": {\n \"css\": \"x15Core.min.css\",\n \"map\": \"x15Core.min.css.map\"\n },\n \"versioned\": {\n \"css\": \"x15Core.min.3.16.1.css\",\n \"map\": \"x15Core.min.3.16.1.css.map\"\n }\n }\n}; export default libraryThemes;"],"mappings":"AAAA;AACA,OAAO,MAAMA,aAAa,GAAG;EAC3B,MAAM,EAAE;IACN,WAAW,EAAE,QAAQ;IACrB,KAAK,EAAE;MACL,KAAK,EAAE,WAAW;MAClB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,eAAe;MACtB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,sBAAsB;MAC7B,KAAK,EAAE;IACT;EACF,CAAC;EACD,KAAK,EAAE;IACL,WAAW,EAAE,mBAAmB;IAChC,KAAK,EAAE;MACL,KAAK,EAAE,SAAS;MAChB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,oBAAoB;MAC3B,KAAK,EAAE;IACT;EACF,CAAC;EACD,aAAa,EAAE;IACb,WAAW,EAAE,2BAA2B;IACxC,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,qBAAqB;MAC5B,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,4BAA4B;MACnC,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,QAAQ,EAAE;IACR,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE;MACL,KAAK,EAAE,YAAY;MACnB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,gBAAgB;MACvB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,uBAAuB;MAC9B,KAAK,EAAE;IACT;EACF,CAAC;EACD,SAAS,EAAE;IACT,WAAW,EAAE,uBAAuB;IACpC,KAAK,EAAE;MACL,KAAK,EAAE,aAAa;MACpB,KAAK,EAAE;IACT,CAAC;IACD,KAAK,EAAE;MACL,KAAK,EAAE,iBAAiB;MACxB,KAAK,EAAE;IACT,CAAC;IACD,WAAW,EAAE;MACX,KAAK,EAAE,wBAAwB;MAC/B,KAAK,EAAE;IACT;EACF;AACF,CAAC;AAAE,eAAeA,aAAa","ignoreList":[]}
@@ -10,8 +10,8 @@
10
10
  "map": "index.min.css.map"
11
11
  },
12
12
  "versioned": {
13
- "css": "base.min.3.15.1.css",
14
- "map": "base.min.3.15.1.css.map"
13
+ "css": "base.min.3.16.1.css",
14
+ "map": "base.min.3.16.1.css.map"
15
15
  }
16
16
  },
17
17
  "cba": {
@@ -25,8 +25,8 @@
25
25
  "map": "cba.min.css.map"
26
26
  },
27
27
  "versioned": {
28
- "css": "cba.min.3.15.1.css",
29
- "map": "cba.min.3.15.1.css.map"
28
+ "css": "cba.min.3.16.1.css",
29
+ "map": "cba.min.3.16.1.css.map"
30
30
  }
31
31
  },
32
32
  "creditSavvy": {
@@ -40,8 +40,8 @@
40
40
  "map": "creditSavvy.min.css.map"
41
41
  },
42
42
  "versioned": {
43
- "css": "creditSavvy.min.3.15.1.css",
44
- "map": "creditSavvy.min.3.15.1.css.map"
43
+ "css": "creditSavvy.min.3.16.1.css",
44
+ "map": "creditSavvy.min.3.16.1.css.map"
45
45
  }
46
46
  },
47
47
  "doshii": {
@@ -55,8 +55,8 @@
55
55
  "map": "doshii.min.css.map"
56
56
  },
57
57
  "versioned": {
58
- "css": "doshii.min.3.15.1.css",
59
- "map": "doshii.min.3.15.1.css.map"
58
+ "css": "doshii.min.3.16.1.css",
59
+ "map": "doshii.min.3.16.1.css.map"
60
60
  }
61
61
  },
62
62
  "homeIn": {
@@ -70,8 +70,8 @@
70
70
  "map": "homeIn.min.css.map"
71
71
  },
72
72
  "versioned": {
73
- "css": "homeIn.min.3.15.1.css",
74
- "map": "homeIn.min.3.15.1.css.map"
73
+ "css": "homeIn.min.3.16.1.css",
74
+ "map": "homeIn.min.3.16.1.css.map"
75
75
  }
76
76
  },
77
77
  "x15Core": {
@@ -85,8 +85,8 @@
85
85
  "map": "x15Core.min.css.map"
86
86
  },
87
87
  "versioned": {
88
- "css": "x15Core.min.3.15.1.css",
89
- "map": "x15Core.min.3.15.1.css.map"
88
+ "css": "x15Core.min.3.16.1.css",
89
+ "map": "x15Core.min.3.16.1.css.map"
90
90
  }
91
91
  }
92
92
  }
@@ -11,7 +11,7 @@
11
11
  .skeletonBar {
12
12
  inline-size: 100%;
13
13
  block-size: var(--skeletonHeight, var(--skeletonLineHeight, 1em));
14
- background-color: var(--skeletonBg, #eef2f4);
14
+ background-color: var(--skeletonBg, #e5ebef);
15
15
  border-radius: var(--skeletonBorderRadius, 3px);
16
16
  }
17
17
 
@@ -53,34 +53,39 @@
53
53
  position: absolute;
54
54
  inset: 0;
55
55
  transform: translateX(-100%);
56
- background-image: linear-gradient(90deg, transparent, var(--skeletonHighlight, #f6f8fa), transparent);
57
- animation: skeletonWave var(--skeletonAnimationDuration, 1.6s) linear infinite;
56
+ background-image: linear-gradient(90deg, transparent 20%, var(--skeletonHighlight, #ffffff) 50%, transparent 80%);
57
+ animation: skeletonWave var(--skeletonAnimationDuration, 2s) ease-in-out infinite;
58
58
  }
59
59
 
60
60
  .skeleton_pulse .skeletonBar {
61
- opacity: 1;
62
- animation: skeletonPulse var(--skeletonAnimationDuration, 1.6s) ease-in-out infinite alternate;
61
+ animation: skeletonPulse var(--skeletonAnimationDuration, 2s) ease-in-out infinite;
62
+ }
63
+
64
+ .skeleton_pulse.skeleton_opaque .skeletonBar {
65
+ animation-name: skeletonPulseOpaque;
63
66
  }
64
67
 
65
68
  @keyframes skeletonWave {
66
- to {
69
+ 60%, 100% {
67
70
  transform: translateX(100%);
68
71
  }
69
72
  }
70
73
  @keyframes skeletonPulse {
71
- from {
72
- opacity: 1;
74
+ 50% {
75
+ background-color: var(--skeletonPulseBg, #ffffff);
73
76
  }
74
- to {
75
- opacity: 0.3;
77
+ }
78
+ @keyframes skeletonPulseOpaque {
79
+ 50% {
80
+ background-color: var(--skeletonOpaquePulseBg, #f6f8fa);
76
81
  }
77
82
  }
78
83
  @media (prefers-reduced-motion: reduce) {
79
84
  .skeleton_wave .skeletonBar::after {
80
85
  display: none;
81
86
  }
82
- .skeleton_pulse .skeletonBar {
87
+ .skeleton_pulse .skeletonBar,
88
+ .skeleton_pulse.skeleton_opaque .skeletonBar {
83
89
  animation: none;
84
- opacity: 1;
85
90
  }
86
91
  }
@@ -18,7 +18,8 @@ export const Tooltip = props => {
18
18
  containsBlockElements = false,
19
19
  children,
20
20
  label = 'Toggle tooltip open state',
21
- showPointer = true
21
+ showPointer = true,
22
+ hoverDelay
22
23
  // visualIndicators will be handled below
23
24
  } = props;
24
25
 
@@ -28,38 +29,89 @@ export const Tooltip = props => {
28
29
  colouredText: true
29
30
  } : undefined;
30
31
  const [isOpen, setIsOpen] = useState(false);
32
+ const [isHovered, setIsHovered] = useState(false);
31
33
  const tooltipElement = useRef(null);
32
34
  const triggerElement = useRef(null);
33
35
  const contentElement = useRef(null);
36
+ const hoverTimer = useRef(null);
34
37
  const iconIsElement = /*#__PURE__*/React.isValidElement(icon);
35
- useOnClickOutside(tooltipElement, () => setIsOpen(false));
38
+
39
+ // Hover is handled in css by default. It is only taken over by js when a delay is requested.
40
+ const hasHoverDelay = typeof hoverDelay === 'number' && hoverDelay > 0;
41
+ const isVisible = isOpen || isHovered;
42
+ const clearHoverTimer = useCallback(() => {
43
+ if (hoverTimer.current) {
44
+ clearTimeout(hoverTimer.current);
45
+ hoverTimer.current = null;
46
+ }
47
+ }, []);
48
+ const handleMouseEnter = useCallback(() => {
49
+ clearHoverTimer();
50
+ hoverTimer.current = setTimeout(() => setIsHovered(true), hoverDelay);
51
+ }, [clearHoverTimer, hoverDelay]);
52
+ const handleMouseLeave = useCallback(() => {
53
+ clearHoverTimer();
54
+ setIsHovered(false);
55
+ }, [clearHoverTimer]);
56
+
57
+ // Single dismissal path, so every close route clears both the click and hover state
58
+ const dismiss = useCallback(() => {
59
+ clearHoverTimer();
60
+ setIsHovered(false);
61
+ setIsOpen(false);
62
+ }, [clearHoverTimer]);
63
+ const handleTriggerClick = useCallback(() => {
64
+ if (isVisible) {
65
+ dismiss();
66
+ return;
67
+ }
68
+ clearHoverTimer();
69
+ setIsOpen(true);
70
+ }, [isVisible, dismiss, clearHoverTimer]);
71
+
72
+ // Releasing the delay detaches the mouse handlers, so reset any hover state they left behind
73
+ useEffect(() => {
74
+ if (!hasHoverDelay) {
75
+ clearHoverTimer();
76
+ setIsHovered(false);
77
+ }
78
+ }, [hasHoverDelay, clearHoverTimer]);
79
+ useEffect(() => clearHoverTimer, [clearHoverTimer]);
80
+ const hoverHandlers = hasHoverDelay ? {
81
+ onMouseEnter: handleMouseEnter,
82
+ onMouseLeave: handleMouseLeave
83
+ } : {};
84
+ useOnClickOutside(tooltipElement, dismiss);
36
85
  useOnEdgeProximityDetect({
37
86
  triggerRef: triggerElement,
38
87
  wrapperRef: tooltipElement,
39
88
  contentRef: contentElement,
40
- requiresRecalc: isOpen
89
+ requiresRecalc: isVisible
41
90
  });
42
91
 
43
92
  // Handle special key presses
44
93
  const handleSpecialKeyPresses = useCallback(event => {
45
94
  if (event.key === 'Escape' || event.keyCode === 27) {
46
- setIsOpen(false);
95
+ dismiss();
47
96
  }
48
- }, [setIsOpen]);
97
+ }, [dismiss]);
49
98
  useEffect(() => {
50
- if (tooltipElement.current) {
51
- tooltipElement.current.addEventListener('keydown', handleSpecialKeyPresses);
99
+ const wrapper = tooltipElement.current;
100
+ if (!wrapper) {
101
+ return undefined;
52
102
  }
103
+ wrapper.addEventListener('keydown', handleSpecialKeyPresses);
104
+ return () => wrapper.removeEventListener('keydown', handleSpecialKeyPresses);
53
105
  }, [handleSpecialKeyPresses]);
54
106
  if (containsBlockElements) {
55
- return /*#__PURE__*/React.createElement("div", {
107
+ return /*#__PURE__*/React.createElement("div", _extends({
56
108
  role: "tooltip",
57
109
  ref: tooltipElement,
58
- className: `tooltip tooltip_block ${isOpen ? 'isOpen' : ''} ${triggerStyle === 'text' && 'textDisplay'} ${customCssClass || ''}`
59
- }, /*#__PURE__*/React.createElement("button", _extends({
110
+ className: `tooltip tooltip_block ${isVisible ? 'isOpen' : ''} ${hasHoverDelay ? 'hoverDelayed' : ''} ${triggerStyle === 'text' ? 'textDisplay' : ''} ${customCssClass || ''}`
111
+ }, hoverHandlers), /*#__PURE__*/React.createElement("button", _extends({
60
112
  ref: triggerElement,
61
113
  type: "button",
62
- onClick: () => setIsOpen(!isOpen),
114
+ onClick: handleTriggerClick,
63
115
  className: `button ${triggerStyle === 'text' ? 'text_only' : 'icon_only'} ${triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : ''} ${triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : ''}`
64
116
  }, triggerId ? {
65
117
  'id': triggerId,
@@ -77,13 +129,13 @@ export const Tooltip = props => {
77
129
  id: `${triggerId}_content`
78
130
  } : {}), children));
79
131
  }
80
- return /*#__PURE__*/React.createElement("span", {
132
+ return /*#__PURE__*/React.createElement("span", _extends({
81
133
  ref: tooltipElement,
82
- className: `tooltip ${isOpen ? 'isOpen' : ''} ${triggerStyle === 'text' && 'textDisplay'} ${customCssClass || ''}`
83
- }, /*#__PURE__*/React.createElement("button", _extends({
134
+ className: `tooltip ${isVisible ? 'isOpen' : ''} ${hasHoverDelay ? 'hoverDelayed' : ''} ${triggerStyle === 'text' ? 'textDisplay' : ''} ${customCssClass || ''}`
135
+ }, hoverHandlers), /*#__PURE__*/React.createElement("button", _extends({
84
136
  ref: triggerElement,
85
137
  type: "button",
86
- onClick: () => setIsOpen(!isOpen),
138
+ onClick: handleTriggerClick,
87
139
  className: `button ${triggerStyle === 'text' ? 'text_only' : 'icon_only'} ${triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : ''} ${triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : ''}`
88
140
  }, triggerId ? {
89
141
  id: triggerId
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","names":["_extends","React","useState","useRef","useEffect","useCallback","useOnClickOutside","Icon","useOnEdgeProximityDetect","Tooltip","props","triggerId","triggerStyle","icon","customCssClass","containsBlockElements","children","label","showPointer","visualIndicators","underline","colouredText","undefined","isOpen","setIsOpen","tooltipElement","triggerElement","contentElement","iconIsElement","isValidElement","triggerRef","wrapperRef","contentRef","requiresRecalc","handleSpecialKeyPresses","event","key","keyCode","current","addEventListener","createElement","role","ref","className","type","onClick","toString","id"],"sources":["../../../../../src/components/design/tooltip/Tooltip.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useEffect, useCallback, ReactNode, ReactElement } from 'react';\nimport { useOnClickOutside } from '../../../hooks/ClickOutside';\nimport { Icon } from '../icons/basicIcon/Icon';\nimport { useOnEdgeProximityDetect } from '../../../hooks/EdgeProximityDetect';\nimport './tooltip.scss';\n\n// Define the props for Tooltip\nexport type TooltipProps =\n {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle?: 'icon';\n label?: string | ReactNode;\n showPointer?: boolean;\n }\n | {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle: 'text';\n label?: string | ReactNode;\n showPointer?: boolean;\n visualIndicators?: { underline?: boolean; colouredText?: boolean };\n };\n\nexport const Tooltip: React.FC<TooltipProps> = (props) => {\n const {\n triggerId,\n triggerStyle = 'icon',\n icon = 'info',\n customCssClass,\n containsBlockElements = false,\n children,\n label = 'Toggle tooltip open state',\n showPointer = true,\n // visualIndicators will be handled below\n } = props as any;\n\n // Only use visualIndicators if triggerStyle is 'text'\n const visualIndicators =\n triggerStyle === 'text'\n ? (props as { visualIndicators?: { underline?: boolean; colouredText?: boolean } }).visualIndicators ?? { underline: true, colouredText: true }\n : undefined;\n const [isOpen, setIsOpen] = useState(false);\n const tooltipElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n const triggerElement = useRef<HTMLButtonElement>(null);\n const contentElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n\n const iconIsElement = React.isValidElement(icon);\n\n useOnClickOutside(tooltipElement, () => setIsOpen(false));\n\n useOnEdgeProximityDetect({\n triggerRef: triggerElement,\n wrapperRef: tooltipElement,\n contentRef: contentElement,\n requiresRecalc: isOpen,\n });\n\n // Handle special key presses\n const handleSpecialKeyPresses = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.keyCode === 27) {\n setIsOpen(false);\n }\n },\n [setIsOpen],\n );\n\n useEffect(() => {\n if (tooltipElement.current) {\n tooltipElement.current.addEventListener('keydown', handleSpecialKeyPresses as EventListener);\n }\n }, [handleSpecialKeyPresses]);\n\n if (containsBlockElements) {\n return (\n <div\n role=\"tooltip\"\n ref={ tooltipElement as React.RefObject<HTMLDivElement> }\n className={ `tooltip tooltip_block ${ isOpen ? 'isOpen' : '' } ${ triggerStyle === 'text' && 'textDisplay' } ${ customCssClass || '' }` }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ () => setIsOpen(!isOpen) }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { 'id': triggerId, 'aria-describedby': `${ triggerId }_content` } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <div\n ref={ contentElement as React.RefObject<HTMLDivElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </div>\n </div>\n );\n }\n\n return (\n <span\n ref={ tooltipElement as React.RefObject<HTMLSpanElement> }\n className={ `tooltip ${ isOpen ? 'isOpen' : '' } ${ triggerStyle === 'text' && 'textDisplay' } ${ customCssClass || '' }` }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ () => setIsOpen(!isOpen) }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { id: triggerId } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <span\n aria-hidden\n role=\"presentation\"\n ref={ contentElement as React.RefObject<HTMLSpanElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </span>\n </span>\n );\n};\n\nexport default Tooltip;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Tooltip.js","names":["_extends","React","useState","useRef","useEffect","useCallback","useOnClickOutside","Icon","useOnEdgeProximityDetect","Tooltip","props","triggerId","triggerStyle","icon","customCssClass","containsBlockElements","children","label","showPointer","hoverDelay","visualIndicators","underline","colouredText","undefined","isOpen","setIsOpen","isHovered","setIsHovered","tooltipElement","triggerElement","contentElement","hoverTimer","iconIsElement","isValidElement","hasHoverDelay","isVisible","clearHoverTimer","current","clearTimeout","handleMouseEnter","setTimeout","handleMouseLeave","dismiss","handleTriggerClick","hoverHandlers","onMouseEnter","onMouseLeave","triggerRef","wrapperRef","contentRef","requiresRecalc","handleSpecialKeyPresses","event","key","keyCode","wrapper","addEventListener","removeEventListener","createElement","role","ref","className","type","onClick","toString","id"],"sources":["../../../../../src/components/design/tooltip/Tooltip.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useEffect, useCallback, ReactNode, ReactElement } from 'react';\nimport { useOnClickOutside } from '../../../hooks/ClickOutside';\nimport { Icon } from '../icons/basicIcon/Icon';\nimport { useOnEdgeProximityDetect } from '../../../hooks/EdgeProximityDetect';\nimport './tooltip.scss';\n\n// Define the props for Tooltip\nexport type TooltipProps =\n {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle?: 'icon';\n label?: string | ReactNode;\n showPointer?: boolean;\n hoverDelay?: number;\n }\n | {\n triggerId?: string;\n icon?: ReactElement | string;\n customCssClass?: string;\n children: ReactNode;\n containsBlockElements?: boolean;\n triggerStyle: 'text';\n label?: string | ReactNode;\n showPointer?: boolean;\n hoverDelay?: number;\n visualIndicators?: { underline?: boolean; colouredText?: boolean };\n };\n\nexport const Tooltip: React.FC<TooltipProps> = (props) => {\n const {\n triggerId,\n triggerStyle = 'icon',\n icon = 'info',\n customCssClass,\n containsBlockElements = false,\n children,\n label = 'Toggle tooltip open state',\n showPointer = true,\n hoverDelay,\n // visualIndicators will be handled below\n } = props as any;\n\n // Only use visualIndicators if triggerStyle is 'text'\n const visualIndicators =\n triggerStyle === 'text'\n ? (props as { visualIndicators?: { underline?: boolean; colouredText?: boolean } }).visualIndicators ?? { underline: true, colouredText: true }\n : undefined;\n const [isOpen, setIsOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const tooltipElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n const triggerElement = useRef<HTMLButtonElement>(null);\n const contentElement = useRef<HTMLDivElement | HTMLSpanElement>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const iconIsElement = React.isValidElement(icon);\n\n // Hover is handled in css by default. It is only taken over by js when a delay is requested.\n const hasHoverDelay = typeof hoverDelay === 'number' && hoverDelay > 0;\n const isVisible = isOpen || isHovered;\n\n const clearHoverTimer = useCallback(() => {\n if (hoverTimer.current) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n }, []);\n\n const handleMouseEnter = useCallback(() => {\n clearHoverTimer();\n hoverTimer.current = setTimeout(() => setIsHovered(true), hoverDelay);\n }, [clearHoverTimer, hoverDelay]);\n\n const handleMouseLeave = useCallback(() => {\n clearHoverTimer();\n setIsHovered(false);\n }, [clearHoverTimer]);\n\n // Single dismissal path, so every close route clears both the click and hover state\n const dismiss = useCallback(() => {\n clearHoverTimer();\n setIsHovered(false);\n setIsOpen(false);\n }, [clearHoverTimer]);\n\n const handleTriggerClick = useCallback(() => {\n if (isVisible) {\n dismiss();\n return;\n }\n clearHoverTimer();\n setIsOpen(true);\n }, [isVisible, dismiss, clearHoverTimer]);\n\n // Releasing the delay detaches the mouse handlers, so reset any hover state they left behind\n useEffect(() => {\n if (!hasHoverDelay) {\n clearHoverTimer();\n setIsHovered(false);\n }\n }, [hasHoverDelay, clearHoverTimer]);\n\n useEffect(() => clearHoverTimer, [clearHoverTimer]);\n\n const hoverHandlers = hasHoverDelay\n ? { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave }\n : {};\n\n useOnClickOutside(tooltipElement, dismiss);\n\n useOnEdgeProximityDetect({\n triggerRef: triggerElement,\n wrapperRef: tooltipElement,\n contentRef: contentElement,\n requiresRecalc: isVisible,\n });\n\n // Handle special key presses\n const handleSpecialKeyPresses = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.keyCode === 27) {\n dismiss();\n }\n },\n [dismiss],\n );\n\n useEffect(() => {\n const wrapper = tooltipElement.current;\n if (!wrapper) {\n return undefined;\n }\n wrapper.addEventListener('keydown', handleSpecialKeyPresses as EventListener);\n return () => wrapper.removeEventListener('keydown', handleSpecialKeyPresses as EventListener);\n }, [handleSpecialKeyPresses]);\n\n if (containsBlockElements) {\n return (\n <div\n role=\"tooltip\"\n ref={ tooltipElement as React.RefObject<HTMLDivElement> }\n className={ `tooltip tooltip_block ${ isVisible ? 'isOpen' : '' } ${ hasHoverDelay ? 'hoverDelayed' : '' } ${ triggerStyle === 'text' ? 'textDisplay' : '' } ${ customCssClass || '' }` }\n { ...hoverHandlers }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ handleTriggerClick }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { 'id': triggerId, 'aria-describedby': `${ triggerId }_content` } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <div\n ref={ contentElement as React.RefObject<HTMLDivElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </div>\n </div>\n );\n }\n\n return (\n <span\n ref={ tooltipElement as React.RefObject<HTMLSpanElement> }\n className={ `tooltip ${ isVisible ? 'isOpen' : '' } ${ hasHoverDelay ? 'hoverDelayed' : '' } ${ triggerStyle === 'text' ? 'textDisplay' : '' } ${ customCssClass || '' }` }\n { ...hoverHandlers }\n >\n <button\n ref={ triggerElement }\n type=\"button\"\n onClick={ handleTriggerClick }\n className={ `button ${ triggerStyle === 'text' ? 'text_only' : 'icon_only' } ${ triggerStyle === 'text' && !visualIndicators?.underline ? 'underline_off' : '' } ${ triggerStyle === 'text' && !visualIndicators?.colouredText ? 'colouredText_off' : '' }` }\n { ...(triggerId ? { id: triggerId } : {}) }\n { ...(triggerStyle === 'icon' ? { 'aria-label': typeof label === 'string' ? label : undefined } : {}) }\n >\n { triggerStyle === 'icon' && (iconIsElement ? icon : <Icon icon={ icon.toString() } />) }\n { triggerStyle === 'text' && <span className=\"labelText\">{ label }</span> }\n </button>\n <span\n aria-hidden\n role=\"presentation\"\n ref={ contentElement as React.RefObject<HTMLSpanElement> }\n className={ `content ${ showPointer ? 'showPointer' : '' }` }\n { ...(triggerId ? { id: `${ triggerId }_content` } : {}) }\n >\n { children }\n </span>\n </span>\n );\n};\n\nexport default Tooltip;\n"],"mappings":"AAAA,YAAY;;AAAC,OAAAA,QAAA;AAEb,OAAOC,KAAK,IAAIC,QAAQ,EAAEC,MAAM,EAAEC,SAAS,EAAEC,WAAW,QAAiC,OAAO;AAChG,SAASC,iBAAiB,QAAQ,6BAA6B;AAC/D,SAASC,IAAI,QAAQ,yBAAyB;AAC9C,SAASC,wBAAwB,QAAQ,oCAAoC;AAC7E,OAAO,gBAAgB;;AAEvB;;AA0BA,OAAO,MAAMC,OAA+B,GAAIC,KAAK,IAAK;EACxD,MAAM;IACJC,SAAS;IACTC,YAAY,GAAG,MAAM;IACrBC,IAAI,GAAG,MAAM;IACbC,cAAc;IACdC,qBAAqB,GAAG,KAAK;IAC7BC,QAAQ;IACRC,KAAK,GAAG,2BAA2B;IACnCC,WAAW,GAAG,IAAI;IAClBC;IACA;EACF,CAAC,GAAGT,KAAY;;EAEhB;EACA,MAAMU,gBAAgB,GACpBR,YAAY,KAAK,MAAM,GAClBF,KAAK,CAA4EU,gBAAgB,IAAI;IAAEC,SAAS,EAAE,IAAI;IAAEC,YAAY,EAAE;EAAK,CAAC,GAC7IC,SAAS;EACf,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGvB,QAAQ,CAAC,KAAK,CAAC;EAC3C,MAAM,CAACwB,SAAS,EAAEC,YAAY,CAAC,GAAGzB,QAAQ,CAAC,KAAK,CAAC;EACjD,MAAM0B,cAAc,GAAGzB,MAAM,CAAmC,IAAI,CAAC;EACrE,MAAM0B,cAAc,GAAG1B,MAAM,CAAoB,IAAI,CAAC;EACtD,MAAM2B,cAAc,GAAG3B,MAAM,CAAmC,IAAI,CAAC;EACrE,MAAM4B,UAAU,GAAG5B,MAAM,CAAuC,IAAI,CAAC;EAErE,MAAM6B,aAAa,gBAAG/B,KAAK,CAACgC,cAAc,CAACpB,IAAI,CAAC;;EAEhD;EACA,MAAMqB,aAAa,GAAG,OAAOf,UAAU,KAAK,QAAQ,IAAIA,UAAU,GAAG,CAAC;EACtE,MAAMgB,SAAS,GAAGX,MAAM,IAAIE,SAAS;EAErC,MAAMU,eAAe,GAAG/B,WAAW,CAAC,MAAM;IACxC,IAAI0B,UAAU,CAACM,OAAO,EAAE;MACtBC,YAAY,CAACP,UAAU,CAACM,OAAO,CAAC;MAChCN,UAAU,CAACM,OAAO,GAAG,IAAI;IAC3B;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,gBAAgB,GAAGlC,WAAW,CAAC,MAAM;IACzC+B,eAAe,CAAC,CAAC;IACjBL,UAAU,CAACM,OAAO,GAAGG,UAAU,CAAC,MAAMb,YAAY,CAAC,IAAI,CAAC,EAAER,UAAU,CAAC;EACvE,CAAC,EAAE,CAACiB,eAAe,EAAEjB,UAAU,CAAC,CAAC;EAEjC,MAAMsB,gBAAgB,GAAGpC,WAAW,CAAC,MAAM;IACzC+B,eAAe,CAAC,CAAC;IACjBT,YAAY,CAAC,KAAK,CAAC;EACrB,CAAC,EAAE,CAACS,eAAe,CAAC,CAAC;;EAErB;EACA,MAAMM,OAAO,GAAGrC,WAAW,CAAC,MAAM;IAChC+B,eAAe,CAAC,CAAC;IACjBT,YAAY,CAAC,KAAK,CAAC;IACnBF,SAAS,CAAC,KAAK,CAAC;EAClB,CAAC,EAAE,CAACW,eAAe,CAAC,CAAC;EAErB,MAAMO,kBAAkB,GAAGtC,WAAW,CAAC,MAAM;IAC3C,IAAI8B,SAAS,EAAE;MACbO,OAAO,CAAC,CAAC;MACT;IACF;IACAN,eAAe,CAAC,CAAC;IACjBX,SAAS,CAAC,IAAI,CAAC;EACjB,CAAC,EAAE,CAACU,SAAS,EAAEO,OAAO,EAAEN,eAAe,CAAC,CAAC;;EAEzC;EACAhC,SAAS,CAAC,MAAM;IACd,IAAI,CAAC8B,aAAa,EAAE;MAClBE,eAAe,CAAC,CAAC;MACjBT,YAAY,CAAC,KAAK,CAAC;IACrB;EACF,CAAC,EAAE,CAACO,aAAa,EAAEE,eAAe,CAAC,CAAC;EAEpChC,SAAS,CAAC,MAAMgC,eAAe,EAAE,CAACA,eAAe,CAAC,CAAC;EAEnD,MAAMQ,aAAa,GAAGV,aAAa,GAC/B;IAAEW,YAAY,EAAEN,gBAAgB;IAAEO,YAAY,EAAEL;EAAiB,CAAC,GAClE,CAAC,CAAC;EAENnC,iBAAiB,CAACsB,cAAc,EAAEc,OAAO,CAAC;EAE1ClC,wBAAwB,CAAC;IACvBuC,UAAU,EAAElB,cAAc;IAC1BmB,UAAU,EAAEpB,cAAc;IAC1BqB,UAAU,EAAEnB,cAAc;IAC1BoB,cAAc,EAAEf;EAClB,CAAC,CAAC;;EAEF;EACA,MAAMgB,uBAAuB,GAAG9C,WAAW,CACxC+C,KAAoB,IAAK;IACxB,IAAIA,KAAK,CAACC,GAAG,KAAK,QAAQ,IAAID,KAAK,CAACE,OAAO,KAAK,EAAE,EAAE;MAClDZ,OAAO,CAAC,CAAC;IACX;EACF,CAAC,EACD,CAACA,OAAO,CACV,CAAC;EAEDtC,SAAS,CAAC,MAAM;IACd,MAAMmD,OAAO,GAAG3B,cAAc,CAACS,OAAO;IACtC,IAAI,CAACkB,OAAO,EAAE;MACZ,OAAOhC,SAAS;IAClB;IACAgC,OAAO,CAACC,gBAAgB,CAAC,SAAS,EAAEL,uBAAwC,CAAC;IAC7E,OAAO,MAAMI,OAAO,CAACE,mBAAmB,CAAC,SAAS,EAAEN,uBAAwC,CAAC;EAC/F,CAAC,EAAE,CAACA,uBAAuB,CAAC,CAAC;EAE7B,IAAIpC,qBAAqB,EAAE;IACzB,oBACEd,KAAA,CAAAyD,aAAA,QAAA1D,QAAA;MACE2D,IAAI,EAAC,SAAS;MACdC,GAAG,EAAGhC,cAAmD;MACzDiC,SAAS,EAAG,yBAA0B1B,SAAS,GAAG,QAAQ,GAAG,EAAE,IAAMD,aAAa,GAAG,cAAc,GAAG,EAAE,IAAMtB,YAAY,KAAK,MAAM,GAAG,aAAa,GAAG,EAAE,IAAME,cAAc,IAAI,EAAE;IAAK,GACpL8B,aAAa,gBAElB3C,KAAA,CAAAyD,aAAA,WAAA1D,QAAA;MACE4D,GAAG,EAAG/B,cAAgB;MACtBiC,IAAI,EAAC,QAAQ;MACbC,OAAO,EAAGpB,kBAAoB;MAC9BkB,SAAS,EAAG,UAAWjD,YAAY,KAAK,MAAM,GAAG,WAAW,GAAG,WAAW,IAAMA,YAAY,KAAK,MAAM,IAAI,CAACQ,gBAAgB,EAAEC,SAAS,GAAG,eAAe,GAAG,EAAE,IAAMT,YAAY,KAAK,MAAM,IAAI,CAACQ,gBAAgB,EAAEE,YAAY,GAAG,kBAAkB,GAAG,EAAE;IAAK,GACvPX,SAAS,GAAG;MAAE,IAAI,EAAEA,SAAS;MAAE,kBAAkB,EAAE,GAAIA,SAAS;IAAY,CAAC,GAAG,CAAC,CAAC,EAClFC,YAAY,KAAK,MAAM,GAAG;MAAE,YAAY,EAAE,OAAOK,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAGM;IAAU,CAAC,GAAG,CAAC,CAAC,GAElGX,YAAY,KAAK,MAAM,KAAKoB,aAAa,GAAGnB,IAAI,gBAAGZ,KAAA,CAAAyD,aAAA,CAACnD,IAAI;MAACM,IAAI,EAAGA,IAAI,CAACmD,QAAQ,CAAC;IAAG,CAAE,CAAC,CAAC,EACrFpD,YAAY,KAAK,MAAM,iBAAIX,KAAA,CAAAyD,aAAA;MAAMG,SAAS,EAAC;IAAW,GAAG5C,KAAa,CAClE,CAAC,eACThB,KAAA,CAAAyD,aAAA,QAAA1D,QAAA;MACE4D,GAAG,EAAG9B,cAAmD;MACzD+B,SAAS,EAAG,WAAY3C,WAAW,GAAG,aAAa,GAAG,EAAE;IAAK,GACvDP,SAAS,GAAG;MAAEsD,EAAE,EAAE,GAAItD,SAAS;IAAY,CAAC,GAAG,CAAC,CAAC,GAErDK,QACC,CACF,CAAC;EAEV;EAEA,oBACEf,KAAA,CAAAyD,aAAA,SAAA1D,QAAA;IACE4D,GAAG,EAAGhC,cAAoD;IAC1DiC,SAAS,EAAG,WAAY1B,SAAS,GAAG,QAAQ,GAAG,EAAE,IAAMD,aAAa,GAAG,cAAc,GAAG,EAAE,IAAMtB,YAAY,KAAK,MAAM,GAAG,aAAa,GAAG,EAAE,IAAME,cAAc,IAAI,EAAE;EAAK,GACtK8B,aAAa,gBAElB3C,KAAA,CAAAyD,aAAA,WAAA1D,QAAA;IACE4D,GAAG,EAAG/B,cAAgB;IACtBiC,IAAI,EAAC,QAAQ;IACbC,OAAO,EAAGpB,kBAAoB;IAC9BkB,SAAS,EAAG,UAAWjD,YAAY,KAAK,MAAM,GAAG,WAAW,GAAG,WAAW,IAAMA,YAAY,KAAK,MAAM,IAAI,CAACQ,gBAAgB,EAAEC,SAAS,GAAG,eAAe,GAAG,EAAE,IAAMT,YAAY,KAAK,MAAM,IAAI,CAACQ,gBAAgB,EAAEE,YAAY,GAAG,kBAAkB,GAAG,EAAE;EAAK,GACvPX,SAAS,GAAG;IAAEsD,EAAE,EAAEtD;EAAU,CAAC,GAAG,CAAC,CAAC,EAClCC,YAAY,KAAK,MAAM,GAAG;IAAE,YAAY,EAAE,OAAOK,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAGM;EAAU,CAAC,GAAG,CAAC,CAAC,GAElGX,YAAY,KAAK,MAAM,KAAKoB,aAAa,GAAGnB,IAAI,gBAAGZ,KAAA,CAAAyD,aAAA,CAACnD,IAAI;IAACM,IAAI,EAAGA,IAAI,CAACmD,QAAQ,CAAC;EAAG,CAAE,CAAC,CAAC,EACrFpD,YAAY,KAAK,MAAM,iBAAIX,KAAA,CAAAyD,aAAA;IAAMG,SAAS,EAAC;EAAW,GAAG5C,KAAa,CAClE,CAAC,eACThB,KAAA,CAAAyD,aAAA,SAAA1D,QAAA;IACE,mBAAW;IACX2D,IAAI,EAAC,cAAc;IACnBC,GAAG,EAAG9B,cAAoD;IAC1D+B,SAAS,EAAG,WAAY3C,WAAW,GAAG,aAAa,GAAG,EAAE;EAAK,GACvDP,SAAS,GAAG;IAAEsD,EAAE,EAAE,GAAItD,SAAS;EAAY,CAAC,GAAG,CAAC,CAAC,GAErDK,QACE,CACF,CAAC;AAEX,CAAC;AAED,eAAeP,OAAO","ignoreList":[]}
@@ -93,7 +93,7 @@
93
93
  .tooltip.large .content:before {
94
94
  left: 160px;
95
95
  }
96
- .tooltip:hover .content, .tooltip.isOpen .content {
96
+ .tooltip:not(.hoverDelayed):hover .content, .tooltip.isOpen .content {
97
97
  display: block;
98
98
  }
99
99
  .tooltip.measuring .content {
@@ -1,10 +1,13 @@
1
- import { useEffect } from 'react';
1
+ import { useEffect, useRef } from 'react';
2
2
  export const useOnEdgeProximityDetect = ({
3
3
  triggerRef,
4
4
  wrapperRef,
5
5
  contentRef,
6
6
  requiresRecalc
7
7
  }) => {
8
+ // Only the shift classes this hook applied, so a consumer supplied
9
+ // customCssClass such as "shiftDown" is never stripped
10
+ const appliedShiftClasses = useRef([]);
8
11
  const xAxisOverride = ({
9
12
  left,
10
13
  width,
@@ -39,6 +42,10 @@ export const useOnEdgeProximityDetect = ({
39
42
  };
40
43
  useEffect(() => {
41
44
  if (wrapperRef.current && contentRef.current && triggerRef.current && document && document.body) {
45
+ // Clear the previous run's shift, otherwise the content is measured in its
46
+ // already-shifted position and can accumulate opposing shift classes
47
+ appliedShiftClasses.current.forEach(cssClass => wrapperRef.current?.classList.remove(cssClass));
48
+ appliedShiftClasses.current = [];
42
49
  wrapperRef.current.classList.add('measuring');
43
50
  const {
44
51
  clientWidth,
@@ -52,22 +59,23 @@ export const useOnEdgeProximityDetect = ({
52
59
  } = contentRef.current.getBoundingClientRect();
53
60
 
54
61
  // Check if it needs x-axis or y-axis adjustment
55
- const xAxisOverrideCssClass = xAxisOverride({
62
+ const applyShift = cssClass => {
63
+ if (!cssClass || !wrapperRef.current || wrapperRef.current.classList.contains(cssClass)) {
64
+ return;
65
+ }
66
+ wrapperRef.current.classList.add(cssClass);
67
+ appliedShiftClasses.current.push(cssClass);
68
+ };
69
+ applyShift(xAxisOverride({
56
70
  left,
57
71
  width,
58
72
  clientWidth
59
- });
60
- if (xAxisOverrideCssClass) {
61
- wrapperRef.current.classList.add(xAxisOverrideCssClass);
62
- }
63
- const yAxisOverrideCssClass = yAxisOverride({
73
+ }));
74
+ applyShift(yAxisOverride({
64
75
  top,
65
76
  height,
66
77
  clientHeight
67
- });
68
- if (yAxisOverrideCssClass) {
69
- wrapperRef.current.classList.add(yAxisOverrideCssClass);
70
- }
78
+ }));
71
79
  wrapperRef.current.classList.remove('measuring');
72
80
  }
73
81
  }, [triggerRef, wrapperRef, contentRef, requiresRecalc]);
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeProximityDetect.js","names":["useEffect","useOnEdgeProximityDetect","triggerRef","wrapperRef","contentRef","requiresRecalc","xAxisOverride","left","width","clientWidth","yAxisOverride","top","height","clientHeight","current","document","body","classList","add","getBoundingClientRect","xAxisOverrideCssClass","yAxisOverrideCssClass","remove"],"sources":["../../../src/hooks/EdgeProximityDetect.ts"],"sourcesContent":["import React, { useEffect } from 'react';\n\ninterface UseOnEdgeProximityDetectProps {\n triggerRef: React.RefObject<HTMLElement>;\n wrapperRef: React.RefObject<HTMLElement>;\n contentRef: React.RefObject<HTMLElement>;\n requiresRecalc: boolean;\n preferredPlacement?: 'right-middle' | 'right-top' | 'right-bottom' | 'left-middle' | 'left-top' | 'left-bottom' | 'top-middle' | 'top-top' | 'top-bottom' | 'bottom-middle' | 'bottom-top' | 'bottom-bottom';\n}\n\nexport const useOnEdgeProximityDetect = (\n {\n triggerRef,\n wrapperRef,\n contentRef,\n requiresRecalc\n }\n :\n UseOnEdgeProximityDetectProps\n) => {\n const xAxisOverride = (\n {\n left,\n width,\n clientWidth\n }\n :\n {\n left: number;\n width: number;\n clientWidth: number\n }\n ) => {\n // Too close to left\n if (left < 0) {\n return 'shiftRight';\n }\n\n // Too close to right\n if (left + width > clientWidth) {\n return 'shiftLeft';\n }\n return '';\n };\n\n const yAxisOverride = (\n {\n top,\n height,\n clientHeight\n }\n :\n {\n top: number;\n height: number;\n clientHeight: number\n }\n ) => {\n // Too close to top\n if (top - height < 0) {\n return 'shiftDown';\n }\n\n // Too close to bottom\n if (top + height > clientHeight) {\n return 'shiftUp';\n }\n return '';\n };\n\n useEffect(() => {\n if (\n wrapperRef.current\n && contentRef.current\n && triggerRef.current\n && document\n && document.body\n ) {\n wrapperRef.current.classList.add('measuring');\n const { clientWidth, clientHeight } = document.body;\n const {\n width, height, top, left\n } = contentRef.current.getBoundingClientRect();\n\n // Check if it needs x-axis or y-axis adjustment\n const xAxisOverrideCssClass = xAxisOverride({ left, width, clientWidth });\n if (xAxisOverrideCssClass) {\n wrapperRef.current.classList.add(xAxisOverrideCssClass);\n }\n\n const yAxisOverrideCssClass = yAxisOverride({ top, height, clientHeight });\n if (yAxisOverrideCssClass) {\n wrapperRef.current.classList.add(yAxisOverrideCssClass);\n }\n\n wrapperRef.current.classList.remove('measuring');\n }\n }, [triggerRef, wrapperRef, contentRef, requiresRecalc]);\n\n return {};\n};\n"],"mappings":"AAAA,SAAgBA,SAAS,QAAQ,OAAO;AAUxC,OAAO,MAAMC,wBAAwB,GAAGA,CACtC;EACEC,UAAU;EACVC,UAAU;EACVC,UAAU;EACVC;AAG0B,CAAC,KAC1B;EACH,MAAMC,aAAa,GAAGA,CACpB;IACEC,IAAI;IACJC,KAAK;IACLC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,IAAI,GAAG,CAAC,EAAE;MACZ,OAAO,YAAY;IACrB;;IAEA;IACA,IAAIA,IAAI,GAAGC,KAAK,GAAGC,WAAW,EAAE;MAC9B,OAAO,WAAW;IACpB;IACA,OAAO,EAAE;EACX,CAAC;EAED,MAAMC,aAAa,GAAGA,CACpB;IACEC,GAAG;IACHC,MAAM;IACNC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,GAAG,GAAGC,MAAM,GAAG,CAAC,EAAE;MACpB,OAAO,WAAW;IACpB;;IAEA;IACA,IAAID,GAAG,GAAGC,MAAM,GAAGC,YAAY,EAAE;MAC/B,OAAO,SAAS;IAClB;IACA,OAAO,EAAE;EACX,CAAC;EAEDb,SAAS,CAAC,MAAM;IACd,IACEG,UAAU,CAACW,OAAO,IACfV,UAAU,CAACU,OAAO,IAClBZ,UAAU,CAACY,OAAO,IAClBC,QAAQ,IACRA,QAAQ,CAACC,IAAI,EAChB;MACAb,UAAU,CAACW,OAAO,CAACG,SAAS,CAACC,GAAG,CAAC,WAAW,CAAC;MAC7C,MAAM;QAAET,WAAW;QAAEI;MAAa,CAAC,GAAGE,QAAQ,CAACC,IAAI;MACnD,MAAM;QACJR,KAAK;QAAEI,MAAM;QAAED,GAAG;QAAEJ;MACtB,CAAC,GAAGH,UAAU,CAACU,OAAO,CAACK,qBAAqB,CAAC,CAAC;;MAE9C;MACA,MAAMC,qBAAqB,GAAGd,aAAa,CAAC;QAAEC,IAAI;QAAEC,KAAK;QAAEC;MAAY,CAAC,CAAC;MACzE,IAAIW,qBAAqB,EAAE;QACzBjB,UAAU,CAACW,OAAO,CAACG,SAAS,CAACC,GAAG,CAACE,qBAAqB,CAAC;MACzD;MAEA,MAAMC,qBAAqB,GAAGX,aAAa,CAAC;QAAEC,GAAG;QAAEC,MAAM;QAAEC;MAAa,CAAC,CAAC;MAC1E,IAAIQ,qBAAqB,EAAE;QACzBlB,UAAU,CAACW,OAAO,CAACG,SAAS,CAACC,GAAG,CAACG,qBAAqB,CAAC;MACzD;MAEAlB,UAAU,CAACW,OAAO,CAACG,SAAS,CAACK,MAAM,CAAC,WAAW,CAAC;IAClD;EACF,CAAC,EAAE,CAACpB,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAEC,cAAc,CAAC,CAAC;EAExD,OAAO,CAAC,CAAC;AACX,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"EdgeProximityDetect.js","names":["useEffect","useRef","useOnEdgeProximityDetect","triggerRef","wrapperRef","contentRef","requiresRecalc","appliedShiftClasses","xAxisOverride","left","width","clientWidth","yAxisOverride","top","height","clientHeight","current","document","body","forEach","cssClass","classList","remove","add","getBoundingClientRect","applyShift","contains","push"],"sources":["../../../src/hooks/EdgeProximityDetect.ts"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\n\ninterface UseOnEdgeProximityDetectProps {\n triggerRef: React.RefObject<HTMLElement>;\n wrapperRef: React.RefObject<HTMLElement>;\n contentRef: React.RefObject<HTMLElement>;\n requiresRecalc: boolean;\n preferredPlacement?: 'right-middle' | 'right-top' | 'right-bottom' | 'left-middle' | 'left-top' | 'left-bottom' | 'top-middle' | 'top-top' | 'top-bottom' | 'bottom-middle' | 'bottom-top' | 'bottom-bottom';\n}\n\nexport const useOnEdgeProximityDetect = (\n {\n triggerRef,\n wrapperRef,\n contentRef,\n requiresRecalc\n }\n :\n UseOnEdgeProximityDetectProps\n) => {\n // Only the shift classes this hook applied, so a consumer supplied\n // customCssClass such as \"shiftDown\" is never stripped\n const appliedShiftClasses = useRef<string[]>([]);\n\n const xAxisOverride = (\n {\n left,\n width,\n clientWidth\n }\n :\n {\n left: number;\n width: number;\n clientWidth: number\n }\n ) => {\n // Too close to left\n if (left < 0) {\n return 'shiftRight';\n }\n\n // Too close to right\n if (left + width > clientWidth) {\n return 'shiftLeft';\n }\n return '';\n };\n\n const yAxisOverride = (\n {\n top,\n height,\n clientHeight\n }\n :\n {\n top: number;\n height: number;\n clientHeight: number\n }\n ) => {\n // Too close to top\n if (top - height < 0) {\n return 'shiftDown';\n }\n\n // Too close to bottom\n if (top + height > clientHeight) {\n return 'shiftUp';\n }\n return '';\n };\n\n useEffect(() => {\n if (\n wrapperRef.current\n && contentRef.current\n && triggerRef.current\n && document\n && document.body\n ) {\n // Clear the previous run's shift, otherwise the content is measured in its\n // already-shifted position and can accumulate opposing shift classes\n appliedShiftClasses.current.forEach((cssClass) => wrapperRef.current?.classList.remove(cssClass));\n appliedShiftClasses.current = [];\n\n wrapperRef.current.classList.add('measuring');\n const { clientWidth, clientHeight } = document.body;\n const {\n width, height, top, left\n } = contentRef.current.getBoundingClientRect();\n\n // Check if it needs x-axis or y-axis adjustment\n const applyShift = (cssClass: string) => {\n if (!cssClass || !wrapperRef.current || wrapperRef.current.classList.contains(cssClass)) {\n return;\n }\n wrapperRef.current.classList.add(cssClass);\n appliedShiftClasses.current.push(cssClass);\n };\n\n applyShift(xAxisOverride({ left, width, clientWidth }));\n applyShift(yAxisOverride({ top, height, clientHeight }));\n\n wrapperRef.current.classList.remove('measuring');\n }\n }, [triggerRef, wrapperRef, contentRef, requiresRecalc]);\n\n return {};\n};\n"],"mappings":"AAAA,SAAgBA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAUhD,OAAO,MAAMC,wBAAwB,GAAGA,CACtC;EACEC,UAAU;EACVC,UAAU;EACVC,UAAU;EACVC;AAG0B,CAAC,KAC1B;EACH;EACA;EACA,MAAMC,mBAAmB,GAAGN,MAAM,CAAW,EAAE,CAAC;EAEhD,MAAMO,aAAa,GAAGA,CACpB;IACEC,IAAI;IACJC,KAAK;IACLC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,IAAI,GAAG,CAAC,EAAE;MACZ,OAAO,YAAY;IACrB;;IAEA;IACA,IAAIA,IAAI,GAAGC,KAAK,GAAGC,WAAW,EAAE;MAC9B,OAAO,WAAW;IACpB;IACA,OAAO,EAAE;EACX,CAAC;EAED,MAAMC,aAAa,GAAGA,CACpB;IACEC,GAAG;IACHC,MAAM;IACNC;EAOF,CAAC,KACE;IACH;IACA,IAAIF,GAAG,GAAGC,MAAM,GAAG,CAAC,EAAE;MACpB,OAAO,WAAW;IACpB;;IAEA;IACA,IAAID,GAAG,GAAGC,MAAM,GAAGC,YAAY,EAAE;MAC/B,OAAO,SAAS;IAClB;IACA,OAAO,EAAE;EACX,CAAC;EAEDf,SAAS,CAAC,MAAM;IACd,IACEI,UAAU,CAACY,OAAO,IACfX,UAAU,CAACW,OAAO,IAClBb,UAAU,CAACa,OAAO,IAClBC,QAAQ,IACRA,QAAQ,CAACC,IAAI,EAChB;MACA;MACA;MACAX,mBAAmB,CAACS,OAAO,CAACG,OAAO,CAAEC,QAAQ,IAAKhB,UAAU,CAACY,OAAO,EAAEK,SAAS,CAACC,MAAM,CAACF,QAAQ,CAAC,CAAC;MACjGb,mBAAmB,CAACS,OAAO,GAAG,EAAE;MAEhCZ,UAAU,CAACY,OAAO,CAACK,SAAS,CAACE,GAAG,CAAC,WAAW,CAAC;MAC7C,MAAM;QAAEZ,WAAW;QAAEI;MAAa,CAAC,GAAGE,QAAQ,CAACC,IAAI;MACnD,MAAM;QACJR,KAAK;QAAEI,MAAM;QAAED,GAAG;QAAEJ;MACtB,CAAC,GAAGJ,UAAU,CAACW,OAAO,CAACQ,qBAAqB,CAAC,CAAC;;MAE9C;MACA,MAAMC,UAAU,GAAIL,QAAgB,IAAK;QACvC,IAAI,CAACA,QAAQ,IAAI,CAAChB,UAAU,CAACY,OAAO,IAAIZ,UAAU,CAACY,OAAO,CAACK,SAAS,CAACK,QAAQ,CAACN,QAAQ,CAAC,EAAE;UACvF;QACF;QACAhB,UAAU,CAACY,OAAO,CAACK,SAAS,CAACE,GAAG,CAACH,QAAQ,CAAC;QAC1Cb,mBAAmB,CAACS,OAAO,CAACW,IAAI,CAACP,QAAQ,CAAC;MAC5C,CAAC;MAEDK,UAAU,CAACjB,aAAa,CAAC;QAAEC,IAAI;QAAEC,KAAK;QAAEC;MAAY,CAAC,CAAC,CAAC;MACvDc,UAAU,CAACb,aAAa,CAAC;QAAEC,GAAG;QAAEC,MAAM;QAAEC;MAAa,CAAC,CAAC,CAAC;MAExDX,UAAU,CAACY,OAAO,CAACK,SAAS,CAACC,MAAM,CAAC,WAAW,CAAC;IAClD;EACF,CAAC,EAAE,CAACnB,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAEC,cAAc,CAAC,CAAC;EAExD,OAAO,CAAC,CAAC;AACX,CAAC","ignoreList":[]}
@@ -137,7 +137,7 @@
137
137
  "files": [
138
138
  "dist"
139
139
  ],
140
- "version": "3.15.0",
140
+ "version": "3.16.0",
141
141
  "devEngines": {
142
142
  "runtime": {
143
143
  "name": "node",
@@ -254,9 +254,11 @@
254
254
  --notificationIconFg: #fff;
255
255
  --notificationIconBorder: 4px solid #c00;
256
256
  --notificationIconBoxShadow: none;
257
- --skeletonBg: #eef2f4;
257
+ --skeletonBg: #e5ebef;
258
258
  --skeletonOpaqueBg: #d3dee4;
259
- --skeletonHighlight: #f6f8fa;
259
+ --skeletonHighlight: #ffffff;
260
+ --skeletonPulseBg: #ffffff;
261
+ --skeletonOpaquePulseBg: #f6f8fa;
260
262
  --skeletonBorderRadius: 3px;
261
263
  --skeletonRoundedBorderRadius: 8px;
262
264
  --skeletonLineHeight: 1em;
@@ -264,7 +266,7 @@
264
266
  --skeletonBlockHeight: 120px;
265
267
  --skeletonCircleSize: 40px;
266
268
  --skeletonLastLineWidth: 60%;
267
- --skeletonAnimationDuration: 1.6s;
269
+ --skeletonAnimationDuration: 2s;
268
270
  }
269
271
 
270
272
  :root {
@@ -611,6 +613,8 @@
611
613
  --skeletonBg: #1a1410;
612
614
  --skeletonHighlight: #3d2f26;
613
615
  --skeletonOpaqueBg: #2c211b;
616
+ --skeletonOpaquePulseBg: #4d3b30;
617
+ --skeletonPulseBg: #3d2f26;
614
618
  --statusAlertColor: #000;
615
619
  --statusDefCon3Bg: radial-gradient(circle at 60% 40%, #003, #000, #333); /* gradient stops inverted */
616
620
  --statusDefCon3Color: #003;
@@ -236,6 +236,8 @@
236
236
  --skeletonBg: #1a1410;
237
237
  --skeletonHighlight: #3d2f26;
238
238
  --skeletonOpaqueBg: #2c211b;
239
+ --skeletonOpaquePulseBg: #4d3b30;
240
+ --skeletonPulseBg: #3d2f26;
239
241
  --statusAlertColor: #000;
240
242
  --statusDefCon3Bg: radial-gradient(circle at 60% 40%, #003, #000, #333); /* gradient stops inverted */
241
243
  --statusDefCon3Color: #003;
@@ -216,9 +216,11 @@
216
216
  --notificationIconFg: #fff;
217
217
  --notificationIconBorder: 4px solid #c00;
218
218
  --notificationIconBoxShadow: none;
219
- --skeletonBg: #eef2f4;
219
+ --skeletonBg: #e5ebef;
220
220
  --skeletonOpaqueBg: #d3dee4;
221
- --skeletonHighlight: #f6f8fa;
221
+ --skeletonHighlight: #ffffff;
222
+ --skeletonPulseBg: #ffffff;
223
+ --skeletonOpaquePulseBg: #f6f8fa;
222
224
  --skeletonBorderRadius: 3px;
223
225
  --skeletonRoundedBorderRadius: 8px;
224
226
  --skeletonLineHeight: 1em;
@@ -226,5 +228,5 @@
226
228
  --skeletonBlockHeight: 120px;
227
229
  --skeletonCircleSize: 40px;
228
230
  --skeletonLastLineWidth: 60%;
229
- --skeletonAnimationDuration: 1.6s;
231
+ --skeletonAnimationDuration: 2s;
230
232
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeProximityDetect.d.ts","sourceRoot":"","sources":["../../src/hooks/EdgeProximityDetect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,UAAU,6BAA6B;IACrC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,GAAG,eAAe,CAAC;CAC9M;AAED,eAAO,MAAM,wBAAwB,2DAQnC,6BAA6B,OAkF9B,CAAC"}
1
+ {"version":3,"file":"EdgeProximityDetect.d.ts","sourceRoot":"","sources":["../../src/hooks/EdgeProximityDetect.ts"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,UAAU,6BAA6B;IACrC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,GAAG,eAAe,CAAC;CAC9M;AAED,eAAO,MAAM,wBAAwB,2DAQnC,6BAA6B,OA4F9B,CAAC"}
package/dist/package.json CHANGED
@@ -137,7 +137,7 @@
137
137
  "files": [
138
138
  "dist"
139
139
  ],
140
- "version": "3.15.0",
140
+ "version": "3.16.0",
141
141
  "devEngines": {
142
142
  "runtime": {
143
143
  "name": "node",
package/package.json CHANGED
@@ -137,7 +137,7 @@
137
137
  "files": [
138
138
  "dist"
139
139
  ],
140
- "version": "3.15.1",
140
+ "version": "3.16.1",
141
141
  "devEngines": {
142
142
  "runtime": {
143
143
  "name": "node",