@atlaskit/smart-card 26.9.3 → 26.9.6

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 (21) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/version.json +1 -1
  3. package/dist/cjs/view/CardWithUrl/component.js +2 -4
  4. package/dist/cjs/view/FlexibleCard/components/container/hover-card-control/index.js +82 -0
  5. package/dist/cjs/view/FlexibleCard/components/container/hover-card-control/types.js +5 -0
  6. package/dist/cjs/view/FlexibleCard/components/container/index.js +12 -41
  7. package/dist/es2019/version.json +1 -1
  8. package/dist/es2019/view/CardWithUrl/component.js +2 -4
  9. package/dist/es2019/view/FlexibleCard/components/container/hover-card-control/index.js +68 -0
  10. package/dist/es2019/view/FlexibleCard/components/container/hover-card-control/types.js +1 -0
  11. package/dist/es2019/view/FlexibleCard/components/container/index.js +14 -39
  12. package/dist/esm/version.json +1 -1
  13. package/dist/esm/view/CardWithUrl/component.js +2 -4
  14. package/dist/esm/view/FlexibleCard/components/container/hover-card-control/index.js +71 -0
  15. package/dist/esm/view/FlexibleCard/components/container/hover-card-control/types.js +1 -0
  16. package/dist/esm/view/FlexibleCard/components/container/index.js +14 -43
  17. package/dist/types/view/FlexibleCard/components/container/hover-card-control/index.d.ts +4 -0
  18. package/dist/types/view/FlexibleCard/components/container/hover-card-control/types.d.ts +7 -0
  19. package/dist/types-ts4.5/view/FlexibleCard/components/container/hover-card-control/index.d.ts +4 -0
  20. package/dist/types-ts4.5/view/FlexibleCard/components/container/hover-card-control/types.d.ts +7 -0
  21. package/package.json +20 -19
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 26.9.6
4
+
5
+ ### Patch Changes
6
+
7
+ - [`e0a2c926e63`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e0a2c926e63) - [ux] Flexible Smart Links: Fix hover preview shows on mouse leave
8
+
9
+ ## 26.9.5
10
+
11
+ ### Patch Changes
12
+
13
+ - [`7b08013b112`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7b08013b112) - Clean up use of showAuthTooltip FF. Switch to being fully reliant on the showAuthTooltip prop.
14
+ - Updated dependencies
15
+
16
+ ## 26.9.4
17
+
18
+ ### Patch Changes
19
+
20
+ - [`2a4926aa20a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2a4926aa20a) - [ux] Flexible Smart Links: Add hover preview show/hide delay when mouse moves inside the card
21
+
3
22
  ## 26.9.3
4
23
 
5
24
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "26.9.3",
3
+ "version": "26.9.6",
4
4
  "sideEffects": false
5
5
  }
@@ -45,7 +45,7 @@ function Component(_ref) {
45
45
  ui = _ref.ui,
46
46
  children = _ref.children,
47
47
  showHoverPreview = _ref.showHoverPreview,
48
- showAuthTooltipProp = _ref.showAuthTooltip,
48
+ showAuthTooltip = _ref.showAuthTooltip,
49
49
  analyticsEvents = _ref.analyticsEvents;
50
50
  var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
51
51
  createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
@@ -68,8 +68,6 @@ function Component(_ref) {
68
68
  var isFlexibleUi = (0, _react.useMemo)(function () {
69
69
  return (0, _flexible.isFlexibleUiCard)(children);
70
70
  }, [children]);
71
- var showAuthTooltipFeatureFlagValue = (0, _linkProvider.useFeatureFlag)('showAuthTooltip');
72
- var showAuthTooltip = showAuthTooltipFeatureFlagValue !== undefined ? showAuthTooltipFeatureFlagValue === 'experiment' : showAuthTooltipProp;
73
71
  var enableFlexibleBlockCardFlag = Boolean((0, _linkProvider.useFeatureFlag)('enableFlexibleBlockCard'));
74
72
  var showServerActions = showServerActionsProp && platform !== 'mobile';
75
73
 
@@ -191,7 +189,7 @@ function Component(_ref) {
191
189
  renderers: renderers,
192
190
  ui: ui,
193
191
  showHoverPreview: showHoverPreview,
194
- showAuthTooltip: showAuthTooltipProp,
192
+ showAuthTooltip: showAuthTooltip,
195
193
  showServerActions: showServerActions,
196
194
  url: url,
197
195
  testId: testId,
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _HoverCard = require("../../../../HoverCard");
12
+ var _constants = require("../../../../../constants");
13
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
14
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
+ var FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
16
+ var HoverCardControl = function HoverCardControl(_ref) {
17
+ var children = _ref.children,
18
+ hideHoverCardPreviewButton = _ref.hideHoverCardPreviewButton,
19
+ isHoverPreview = _ref.isHoverPreview,
20
+ isAuthTooltip = _ref.isAuthTooltip,
21
+ showServerActions = _ref.showServerActions,
22
+ testId = _ref.testId,
23
+ url = _ref.url;
24
+ var _useState = (0, _react.useState)(true),
25
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
26
+ canOpen = _useState2[0],
27
+ setCanOpen = _useState2[1];
28
+ var mouseStopTimer = (0, _react.useRef)();
29
+ (0, _react.useEffect)(function () {
30
+ return function () {
31
+ if (mouseStopTimer.current) {
32
+ clearTimeout(mouseStopTimer.current);
33
+ }
34
+ };
35
+ }, []);
36
+ var onMouseLeave = (0, _react.useCallback)(function () {
37
+ if (mouseStopTimer.current) {
38
+ clearTimeout(mouseStopTimer.current);
39
+ }
40
+ }, []);
41
+ var onMouseMove = (0, _react.useCallback)(function (e) {
42
+ var _e$target$closest;
43
+ if (mouseStopTimer.current) {
44
+ clearTimeout(mouseStopTimer.current);
45
+ }
46
+
47
+ // Never show hover card on action or when action dropdown opens.
48
+ // The code below can be simplified by using :is() and :has()
49
+ // but the pseudo-class isn't support by Firefox yet.
50
+ var action =
51
+ // Any action button group (title/footer block)
52
+ e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
53
+ (_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
54
+ var canOpenOnElement = isAuthTooltip && !action ||
55
+ // EDM-7060: For hover preview, also hide hover card on all elements
56
+ // except title element (link title)
57
+ isHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(_constants.ElementName.Title, "\"])"));
58
+ mouseStopTimer.current = setTimeout(function () {
59
+ if (canOpen !== canOpenOnElement) {
60
+ setCanOpen(Boolean(canOpenOnElement));
61
+ }
62
+ }, FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY);
63
+ }, [isAuthTooltip, isHoverPreview, canOpen]);
64
+ return /*#__PURE__*/_react.default.createElement(_HoverCard.HoverCard, {
65
+ allowEventPropagation: true,
66
+ canOpen: canOpen,
67
+ closeOnChildClick: true,
68
+ hidePreviewButton: hideHoverCardPreviewButton
69
+ // EDM-6709 extends the internal prop for showServerActions type to be
70
+ // an object. If we decide to use expose the type for hover preview
71
+ // remove the Boolean() conversion here.
72
+ ,
73
+ showServerActions: Boolean(showServerActions),
74
+ url: url
75
+ }, /*#__PURE__*/_react.default.createElement("span", {
76
+ onMouseLeave: onMouseLeave,
77
+ onMouseMove: onMouseMove,
78
+ "data-testid": "".concat(testId, "-hover-card-wrapper")
79
+ }, children));
80
+ };
81
+ var _default = HoverCardControl;
82
+ exports.default = _default;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -6,8 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.getContainerStyles = exports.default = void 0;
9
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
9
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
12
10
  var _react = _interopRequireWildcard(require("react"));
13
11
  var _react2 = require("@emotion/react");
@@ -16,7 +14,7 @@ var _flexible = require("../../../../utils/flexible");
16
14
  var _token = require("../../../../utils/token");
17
15
  var _flexibleUiContext = require("../../../../state/flexible-ui-context");
18
16
  var _layeredLink = _interopRequireDefault(require("./layered-link"));
19
- var _HoverCard = require("../../../HoverCard");
17
+ var _hoverCardControl = _interopRequireDefault(require("./hover-card-control"));
20
18
  var _utils = require("../../../../state/flexible-ui-context/utils");
21
19
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
22
20
  /** @jsx jsx */
@@ -167,51 +165,24 @@ var Container = function Container(_ref3) {
167
165
  theme = _ref3$theme === void 0 ? _constants.SmartLinkTheme.Link : _ref3$theme;
168
166
  var context = (0, _react.useContext)(_flexibleUiContext.FlexibleUiContext);
169
167
  var childrenOptions = getChildrenOptions(children, context);
170
- var _useState = (0, _react.useState)(true),
171
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
172
- hoverCardCanOpen = _useState2[0],
173
- setHoverCardCanOpen = _useState2[1];
174
168
  var canShowHoverPreview = showHoverPreview && status === 'resolved';
175
169
  var canShowAuthTooltip = showAuthTooltip && status === 'unauthorized';
176
- var onMouseOver = (0, _react.useCallback)(function (e) {
177
- var _e$target$closest;
178
- // Never show hover card on action or when action dropdown opens.
179
- // The code below can be simplified by using :is() and :has()
180
- // but the pseudo-class isn't support by Firefox yet.
181
- var action =
182
- // Any action button group (title/footer block)
183
- e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
184
- (_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
185
- var canOpen = canShowAuthTooltip && !action ||
186
- // EDM-7060: For hover preview, also hide hover card on all elements
187
- // except title element (link title)
188
- canShowHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(_constants.ElementName.Title, "\"])"));
189
- if (hoverCardCanOpen !== canOpen) {
190
- setHoverCardCanOpen(canOpen);
191
- }
192
- }, [canShowAuthTooltip, canShowHoverPreview, hoverCardCanOpen]);
193
- var containerContent = (0, _react2.jsx)("div", (0, _extends2.default)({
170
+ var container = (0, _react2.jsx)("div", {
194
171
  css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
195
172
  "data-smart-link-container": true,
196
173
  "data-testid": testId
197
- }, canShowHoverPreview || canShowAuthTooltip ? {
198
- onMouseOver: onMouseOver
199
- } : undefined), clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
174
+ }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
200
175
  if (context !== null && context !== void 0 && context.url && (canShowHoverPreview || canShowAuthTooltip)) {
201
- return (0, _react2.jsx)(_HoverCard.HoverCard, {
202
- url: context === null || context === void 0 ? void 0 : context.url,
203
- allowEventPropagation: true,
204
- canOpen: hoverCardCanOpen,
205
- closeOnChildClick: true,
206
- hidePreviewButton: hideHoverCardPreviewButton
207
- // EDM-6709 extends the internal prop for showServerActions type to be
208
- // an object. If we decide to use expose the type for hover preview
209
- // remove the Boolean() conversion here.
210
- ,
211
- showServerActions: Boolean(showServerActions)
212
- }, containerContent);
176
+ return (0, _react2.jsx)(_hoverCardControl.default, {
177
+ hideHoverCardPreviewButton: hideHoverCardPreviewButton,
178
+ isHoverPreview: canShowHoverPreview,
179
+ isAuthTooltip: canShowAuthTooltip,
180
+ showServerActions: showServerActions,
181
+ testId: testId,
182
+ url: context.url
183
+ }, container);
213
184
  }
214
- return containerContent;
185
+ return container;
215
186
  };
216
187
  var _default = Container;
217
188
  exports.default = _default;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "26.9.3",
3
+ "version": "26.9.6",
4
4
  "sideEffects": false
5
5
  }
@@ -35,7 +35,7 @@ function Component({
35
35
  ui,
36
36
  children,
37
37
  showHoverPreview,
38
- showAuthTooltip: showAuthTooltipProp,
38
+ showAuthTooltip,
39
39
  analyticsEvents
40
40
  }) {
41
41
  const {
@@ -59,8 +59,6 @@ function Component({
59
59
  const subproduct = getSubproduct(state.details);
60
60
  const services = getServices(state.details);
61
61
  let isFlexibleUi = useMemo(() => isFlexibleUiCard(children), [children]);
62
- const showAuthTooltipFeatureFlagValue = useFeatureFlag('showAuthTooltip');
63
- const showAuthTooltip = showAuthTooltipFeatureFlagValue !== undefined ? showAuthTooltipFeatureFlagValue === 'experiment' : showAuthTooltipProp;
64
62
  const enableFlexibleBlockCardFlag = Boolean(useFeatureFlag('enableFlexibleBlockCard'));
65
63
  const showServerActions = showServerActionsProp && platform !== 'mobile';
66
64
 
@@ -178,7 +176,7 @@ function Component({
178
176
  renderers: renderers,
179
177
  ui: ui,
180
178
  showHoverPreview: showHoverPreview,
181
- showAuthTooltip: showAuthTooltipProp,
179
+ showAuthTooltip: showAuthTooltip,
182
180
  showServerActions: showServerActions,
183
181
  url: url,
184
182
  testId: testId,
@@ -0,0 +1,68 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { HoverCard } from '../../../../HoverCard';
3
+ import { ElementName } from '../../../../../constants';
4
+ const FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
5
+ const HoverCardControl = ({
6
+ children,
7
+ hideHoverCardPreviewButton,
8
+ isHoverPreview,
9
+ isAuthTooltip,
10
+ showServerActions,
11
+ testId,
12
+ url
13
+ }) => {
14
+ const [canOpen, setCanOpen] = useState(true);
15
+ const mouseStopTimer = useRef();
16
+ useEffect(() => {
17
+ return () => {
18
+ if (mouseStopTimer.current) {
19
+ clearTimeout(mouseStopTimer.current);
20
+ }
21
+ };
22
+ }, []);
23
+ const onMouseLeave = useCallback(() => {
24
+ if (mouseStopTimer.current) {
25
+ clearTimeout(mouseStopTimer.current);
26
+ }
27
+ }, []);
28
+ const onMouseMove = useCallback(e => {
29
+ var _e$target$closest;
30
+ if (mouseStopTimer.current) {
31
+ clearTimeout(mouseStopTimer.current);
32
+ }
33
+
34
+ // Never show hover card on action or when action dropdown opens.
35
+ // The code below can be simplified by using :is() and :has()
36
+ // but the pseudo-class isn't support by Firefox yet.
37
+ const action =
38
+ // Any action button group (title/footer block)
39
+ e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
40
+ (_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
41
+ const canOpenOnElement = isAuthTooltip && !action ||
42
+ // EDM-7060: For hover preview, also hide hover card on all elements
43
+ // except title element (link title)
44
+ isHoverPreview && !action && !e.target.closest(`[data-smart-element]:not([data-smart-element="${ElementName.Title}"])`);
45
+ mouseStopTimer.current = setTimeout(() => {
46
+ if (canOpen !== canOpenOnElement) {
47
+ setCanOpen(Boolean(canOpenOnElement));
48
+ }
49
+ }, FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY);
50
+ }, [isAuthTooltip, isHoverPreview, canOpen]);
51
+ return /*#__PURE__*/React.createElement(HoverCard, {
52
+ allowEventPropagation: true,
53
+ canOpen: canOpen,
54
+ closeOnChildClick: true,
55
+ hidePreviewButton: hideHoverCardPreviewButton
56
+ // EDM-6709 extends the internal prop for showServerActions type to be
57
+ // an object. If we decide to use expose the type for hover preview
58
+ // remove the Boolean() conversion here.
59
+ ,
60
+ showServerActions: Boolean(showServerActions),
61
+ url: url
62
+ }, /*#__PURE__*/React.createElement("span", {
63
+ onMouseLeave: onMouseLeave,
64
+ onMouseMove: onMouseMove,
65
+ "data-testid": `${testId}-hover-card-wrapper`
66
+ }, children));
67
+ };
68
+ export default HoverCardControl;
@@ -1,13 +1,12 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
1
  /** @jsx jsx */
3
- import React, { useContext, useState, useCallback } from 'react';
2
+ import React, { useContext } from 'react';
4
3
  import { css, jsx } from '@emotion/react';
5
- import { ElementName, MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
4
+ import { MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
6
5
  import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock } from '../../../../utils/flexible';
7
6
  import { tokens } from '../../../../utils/token';
8
7
  import { FlexibleUiContext } from '../../../../state/flexible-ui-context';
9
8
  import LayeredLink from './layered-link';
10
- import { HoverCard } from '../../../HoverCard';
9
+ import HoverCardControl from './hover-card-control';
11
10
  import { isFlexUiPreviewPresent } from '../../../../state/flexible-ui-context/utils';
12
11
  const elevationStyles = css`
13
12
  border: 1px solid transparent;
@@ -187,47 +186,23 @@ const Container = ({
187
186
  }) => {
188
187
  const context = useContext(FlexibleUiContext);
189
188
  const childrenOptions = getChildrenOptions(children, context);
190
- const [hoverCardCanOpen, setHoverCardCanOpen] = useState(true);
191
189
  const canShowHoverPreview = showHoverPreview && status === 'resolved';
192
190
  const canShowAuthTooltip = showAuthTooltip && status === 'unauthorized';
193
- const onMouseOver = useCallback(e => {
194
- var _e$target$closest;
195
- // Never show hover card on action or when action dropdown opens.
196
- // The code below can be simplified by using :is() and :has()
197
- // but the pseudo-class isn't support by Firefox yet.
198
- const action =
199
- // Any action button group (title/footer block)
200
- e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
201
- (_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
202
- const canOpen = canShowAuthTooltip && !action ||
203
- // EDM-7060: For hover preview, also hide hover card on all elements
204
- // except title element (link title)
205
- canShowHoverPreview && !action && !e.target.closest(`[data-smart-element]:not([data-smart-element="${ElementName.Title}"])`);
206
- if (hoverCardCanOpen !== canOpen) {
207
- setHoverCardCanOpen(canOpen);
208
- }
209
- }, [canShowAuthTooltip, canShowHoverPreview, hoverCardCanOpen]);
210
- const containerContent = jsx("div", _extends({
191
+ const container = jsx("div", {
211
192
  css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
212
193
  "data-smart-link-container": true,
213
194
  "data-testid": testId
214
- }, canShowHoverPreview || canShowAuthTooltip ? {
215
- onMouseOver
216
- } : undefined), clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
195
+ }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
217
196
  if (context !== null && context !== void 0 && context.url && (canShowHoverPreview || canShowAuthTooltip)) {
218
- return jsx(HoverCard, {
219
- url: context === null || context === void 0 ? void 0 : context.url,
220
- allowEventPropagation: true,
221
- canOpen: hoverCardCanOpen,
222
- closeOnChildClick: true,
223
- hidePreviewButton: hideHoverCardPreviewButton
224
- // EDM-6709 extends the internal prop for showServerActions type to be
225
- // an object. If we decide to use expose the type for hover preview
226
- // remove the Boolean() conversion here.
227
- ,
228
- showServerActions: Boolean(showServerActions)
229
- }, containerContent);
197
+ return jsx(HoverCardControl, {
198
+ hideHoverCardPreviewButton: hideHoverCardPreviewButton,
199
+ isHoverPreview: canShowHoverPreview,
200
+ isAuthTooltip: canShowAuthTooltip,
201
+ showServerActions: showServerActions,
202
+ testId: testId,
203
+ url: context.url
204
+ }, container);
230
205
  }
231
- return containerContent;
206
+ return container;
232
207
  };
233
208
  export default Container;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "26.9.3",
3
+ "version": "26.9.6",
4
4
  "sideEffects": false
5
5
  }
@@ -35,7 +35,7 @@ function Component(_ref) {
35
35
  ui = _ref.ui,
36
36
  children = _ref.children,
37
37
  showHoverPreview = _ref.showHoverPreview,
38
- showAuthTooltipProp = _ref.showAuthTooltip,
38
+ showAuthTooltip = _ref.showAuthTooltip,
39
39
  analyticsEvents = _ref.analyticsEvents;
40
40
  var _useAnalyticsEvents = useAnalyticsEvents(),
41
41
  createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
@@ -58,8 +58,6 @@ function Component(_ref) {
58
58
  var isFlexibleUi = useMemo(function () {
59
59
  return isFlexibleUiCard(children);
60
60
  }, [children]);
61
- var showAuthTooltipFeatureFlagValue = useFeatureFlag('showAuthTooltip');
62
- var showAuthTooltip = showAuthTooltipFeatureFlagValue !== undefined ? showAuthTooltipFeatureFlagValue === 'experiment' : showAuthTooltipProp;
63
61
  var enableFlexibleBlockCardFlag = Boolean(useFeatureFlag('enableFlexibleBlockCard'));
64
62
  var showServerActions = showServerActionsProp && platform !== 'mobile';
65
63
 
@@ -181,7 +179,7 @@ function Component(_ref) {
181
179
  renderers: renderers,
182
180
  ui: ui,
183
181
  showHoverPreview: showHoverPreview,
184
- showAuthTooltip: showAuthTooltipProp,
182
+ showAuthTooltip: showAuthTooltip,
185
183
  showServerActions: showServerActions,
186
184
  url: url,
187
185
  testId: testId,
@@ -0,0 +1,71 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { HoverCard } from '../../../../HoverCard';
4
+ import { ElementName } from '../../../../../constants';
5
+ var FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
6
+ var HoverCardControl = function HoverCardControl(_ref) {
7
+ var children = _ref.children,
8
+ hideHoverCardPreviewButton = _ref.hideHoverCardPreviewButton,
9
+ isHoverPreview = _ref.isHoverPreview,
10
+ isAuthTooltip = _ref.isAuthTooltip,
11
+ showServerActions = _ref.showServerActions,
12
+ testId = _ref.testId,
13
+ url = _ref.url;
14
+ var _useState = useState(true),
15
+ _useState2 = _slicedToArray(_useState, 2),
16
+ canOpen = _useState2[0],
17
+ setCanOpen = _useState2[1];
18
+ var mouseStopTimer = useRef();
19
+ useEffect(function () {
20
+ return function () {
21
+ if (mouseStopTimer.current) {
22
+ clearTimeout(mouseStopTimer.current);
23
+ }
24
+ };
25
+ }, []);
26
+ var onMouseLeave = useCallback(function () {
27
+ if (mouseStopTimer.current) {
28
+ clearTimeout(mouseStopTimer.current);
29
+ }
30
+ }, []);
31
+ var onMouseMove = useCallback(function (e) {
32
+ var _e$target$closest;
33
+ if (mouseStopTimer.current) {
34
+ clearTimeout(mouseStopTimer.current);
35
+ }
36
+
37
+ // Never show hover card on action or when action dropdown opens.
38
+ // The code below can be simplified by using :is() and :has()
39
+ // but the pseudo-class isn't support by Firefox yet.
40
+ var action =
41
+ // Any action button group (title/footer block)
42
+ e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
43
+ (_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
44
+ var canOpenOnElement = isAuthTooltip && !action ||
45
+ // EDM-7060: For hover preview, also hide hover card on all elements
46
+ // except title element (link title)
47
+ isHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(ElementName.Title, "\"])"));
48
+ mouseStopTimer.current = setTimeout(function () {
49
+ if (canOpen !== canOpenOnElement) {
50
+ setCanOpen(Boolean(canOpenOnElement));
51
+ }
52
+ }, FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY);
53
+ }, [isAuthTooltip, isHoverPreview, canOpen]);
54
+ return /*#__PURE__*/React.createElement(HoverCard, {
55
+ allowEventPropagation: true,
56
+ canOpen: canOpen,
57
+ closeOnChildClick: true,
58
+ hidePreviewButton: hideHoverCardPreviewButton
59
+ // EDM-6709 extends the internal prop for showServerActions type to be
60
+ // an object. If we decide to use expose the type for hover preview
61
+ // remove the Boolean() conversion here.
62
+ ,
63
+ showServerActions: Boolean(showServerActions),
64
+ url: url
65
+ }, /*#__PURE__*/React.createElement("span", {
66
+ onMouseLeave: onMouseLeave,
67
+ onMouseMove: onMouseMove,
68
+ "data-testid": "".concat(testId, "-hover-card-wrapper")
69
+ }, children));
70
+ };
71
+ export default HoverCardControl;
@@ -1,16 +1,14 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
4
2
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
5
3
  /** @jsx jsx */
6
- import React, { useContext, useState, useCallback } from 'react';
4
+ import React, { useContext } from 'react';
7
5
  import { css, jsx } from '@emotion/react';
8
- import { ElementName, MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
6
+ import { MediaPlacement, SmartLinkSize, SmartLinkTheme } from '../../../../constants';
9
7
  import { isFlexibleUiBlock, isFlexibleUiPreviewBlock, isFlexibleUiTitleBlock } from '../../../../utils/flexible';
10
8
  import { tokens } from '../../../../utils/token';
11
9
  import { FlexibleUiContext } from '../../../../state/flexible-ui-context';
12
10
  import LayeredLink from './layered-link';
13
- import { HoverCard } from '../../../HoverCard';
11
+ import HoverCardControl from './hover-card-control';
14
12
  import { isFlexUiPreviewPresent } from '../../../../state/flexible-ui-context/utils';
15
13
  var elevationStyles = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n border: 1px solid transparent;\n border-radius: 1.5px;\n box-shadow: ", ";\n margin: ", ";\n"])), tokens.elevation, "var(--ds-space-025, 2px)");
16
14
  var getGap = function getGap(size) {
@@ -156,50 +154,23 @@ var Container = function Container(_ref3) {
156
154
  theme = _ref3$theme === void 0 ? SmartLinkTheme.Link : _ref3$theme;
157
155
  var context = useContext(FlexibleUiContext);
158
156
  var childrenOptions = getChildrenOptions(children, context);
159
- var _useState = useState(true),
160
- _useState2 = _slicedToArray(_useState, 2),
161
- hoverCardCanOpen = _useState2[0],
162
- setHoverCardCanOpen = _useState2[1];
163
157
  var canShowHoverPreview = showHoverPreview && status === 'resolved';
164
158
  var canShowAuthTooltip = showAuthTooltip && status === 'unauthorized';
165
- var onMouseOver = useCallback(function (e) {
166
- var _e$target$closest;
167
- // Never show hover card on action or when action dropdown opens.
168
- // The code below can be simplified by using :is() and :has()
169
- // but the pseudo-class isn't support by Firefox yet.
170
- var action =
171
- // Any action button group (title/footer block)
172
- e.target.closest('.actions-button-group') || ( // When action dropdown list is opened on action button group or lozenge action
173
- (_e$target$closest = e.target.closest('[data-smart-link-container]')) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.querySelector('[data-action-open="true"]'));
174
- var canOpen = canShowAuthTooltip && !action ||
175
- // EDM-7060: For hover preview, also hide hover card on all elements
176
- // except title element (link title)
177
- canShowHoverPreview && !action && !e.target.closest("[data-smart-element]:not([data-smart-element=\"".concat(ElementName.Title, "\"])"));
178
- if (hoverCardCanOpen !== canOpen) {
179
- setHoverCardCanOpen(canOpen);
180
- }
181
- }, [canShowAuthTooltip, canShowHoverPreview, hoverCardCanOpen]);
182
- var containerContent = jsx("div", _extends({
159
+ var container = jsx("div", {
183
160
  css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
184
161
  "data-smart-link-container": true,
185
162
  "data-testid": testId
186
- }, canShowHoverPreview || canShowAuthTooltip ? {
187
- onMouseOver: onMouseOver
188
- } : undefined), clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
163
+ }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
189
164
  if (context !== null && context !== void 0 && context.url && (canShowHoverPreview || canShowAuthTooltip)) {
190
- return jsx(HoverCard, {
191
- url: context === null || context === void 0 ? void 0 : context.url,
192
- allowEventPropagation: true,
193
- canOpen: hoverCardCanOpen,
194
- closeOnChildClick: true,
195
- hidePreviewButton: hideHoverCardPreviewButton
196
- // EDM-6709 extends the internal prop for showServerActions type to be
197
- // an object. If we decide to use expose the type for hover preview
198
- // remove the Boolean() conversion here.
199
- ,
200
- showServerActions: Boolean(showServerActions)
201
- }, containerContent);
165
+ return jsx(HoverCardControl, {
166
+ hideHoverCardPreviewButton: hideHoverCardPreviewButton,
167
+ isHoverPreview: canShowHoverPreview,
168
+ isAuthTooltip: canShowAuthTooltip,
169
+ showServerActions: showServerActions,
170
+ testId: testId,
171
+ url: context.url
172
+ }, container);
202
173
  }
203
- return containerContent;
174
+ return container;
204
175
  };
205
176
  export default Container;
@@ -0,0 +1,4 @@
1
+ import type { FC } from 'react';
2
+ import { HoverCardDelayProps } from './types';
3
+ declare const HoverCardControl: FC<HoverCardDelayProps>;
4
+ export default HoverCardControl;
@@ -0,0 +1,7 @@
1
+ import { ContainerProps } from '../types';
2
+ export type HoverCardDelayProps = Pick<ContainerProps, 'hideHoverCardPreviewButton' | 'showServerActions'> & {
3
+ isHoverPreview?: boolean;
4
+ isAuthTooltip?: boolean;
5
+ testId?: string;
6
+ url: string;
7
+ };
@@ -0,0 +1,4 @@
1
+ import type { FC } from 'react';
2
+ import { HoverCardDelayProps } from './types';
3
+ declare const HoverCardControl: FC<HoverCardDelayProps>;
4
+ export default HoverCardControl;
@@ -0,0 +1,7 @@
1
+ import { ContainerProps } from '../types';
2
+ export type HoverCardDelayProps = Pick<ContainerProps, 'hideHoverCardPreviewButton' | 'showServerActions'> & {
3
+ isHoverPreview?: boolean;
4
+ isAuthTooltip?: boolean;
5
+ testId?: string;
6
+ url: string;
7
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "26.9.3",
3
+ "version": "26.9.6",
4
4
  "description": "Smart card component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -12,14 +12,6 @@
12
12
  "module": "dist/esm/index.js",
13
13
  "module:es2019": "dist/es2019/index.js",
14
14
  "types": "dist/types/index.d.ts",
15
- "typesVersions": {
16
- ">=4.5 <4.9": {
17
- "*": [
18
- "dist/types-ts4.5/*",
19
- "dist/types-ts4.5/index.d.ts"
20
- ]
21
- }
22
- },
23
15
  "sideEffects": false,
24
16
  "atlaskit:src": "src/index.ts",
25
17
  "atlassian": {
@@ -45,7 +37,7 @@
45
37
  "@atlaskit/link-analytics": "^8.2.0",
46
38
  "@atlaskit/link-client-extension": "^1.5.0",
47
39
  "@atlaskit/link-extractors": "^1.1.0",
48
- "@atlaskit/linking-common": "^3.2.0",
40
+ "@atlaskit/linking-common": "^3.4.0",
49
41
  "@atlaskit/linking-types": "^8.1.0",
50
42
  "@atlaskit/logo": "^13.14.0",
51
43
  "@atlaskit/lozenge": "^11.4.0",
@@ -79,6 +71,7 @@
79
71
  "react-intl-next": "npm:react-intl@^5.18.1"
80
72
  },
81
73
  "devDependencies": {
74
+ "@af/visual-regression": "*",
82
75
  "@atlaskit/avatar": "^21.3.0",
83
76
  "@atlaskit/css-reset": "^6.5.0",
84
77
  "@atlaskit/link-test-helpers": "^4.1.0",
@@ -114,6 +107,22 @@
114
107
  "typescript": "~4.9.5",
115
108
  "xhr-mock": "^2.4.0"
116
109
  },
110
+ "techstack": {
111
+ "@repo/internal": {
112
+ "design-tokens": [
113
+ "color",
114
+ "spacing"
115
+ ]
116
+ }
117
+ },
118
+ "typesVersions": {
119
+ ">=4.5 <4.9": {
120
+ "*": [
121
+ "dist/types-ts4.5/*",
122
+ "dist/types-ts4.5/index.d.ts"
123
+ ]
124
+ }
125
+ },
117
126
  "af:exports": {
118
127
  "./ssr": "./src/ssr.tsx",
119
128
  "./in-product": "./src/in-product.ts",
@@ -135,13 +144,5 @@
135
144
  "type": "boolean"
136
145
  }
137
146
  },
138
- "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.1",
139
- "techstack": {
140
- "@repo/internal": {
141
- "design-tokens": [
142
- "color",
143
- "spacing"
144
- ]
145
- }
146
- }
147
+ "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.1"
147
148
  }