@atlaskit/smart-card 20.0.6 → 20.1.2

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 (66) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/cjs/state/actions/constants.js +4 -2
  3. package/dist/cjs/state/actions/index.js +51 -19
  4. package/dist/cjs/version.json +1 -1
  5. package/dist/cjs/view/BlockCard/index.js +29 -0
  6. package/dist/cjs/view/CardWithUrl/component.js +7 -2
  7. package/dist/cjs/view/CardWithUrl/loader.js +2 -0
  8. package/dist/cjs/view/EmbedCard/index.js +29 -0
  9. package/dist/cjs/view/FlexibleCard/components/common/loading-skeleton/index.js +6 -4
  10. package/dist/cjs/view/FlexibleCard/index.js +34 -7
  11. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +27 -4
  12. package/dist/cjs/view/HoverCard/components/HoverCardContent.js +32 -10
  13. package/dist/cjs/view/HoverCard/components/HoverCardLoadingView.js +46 -0
  14. package/dist/cjs/view/HoverCard/styled.js +10 -4
  15. package/dist/cjs/view/InlineCard/index.js +29 -0
  16. package/dist/es2019/state/actions/constants.js +2 -1
  17. package/dist/es2019/state/actions/index.js +46 -18
  18. package/dist/es2019/version.json +1 -1
  19. package/dist/es2019/view/BlockCard/index.js +29 -0
  20. package/dist/es2019/view/CardWithUrl/component.js +7 -2
  21. package/dist/es2019/view/CardWithUrl/loader.js +2 -0
  22. package/dist/es2019/view/EmbedCard/index.js +29 -0
  23. package/dist/es2019/view/FlexibleCard/components/common/loading-skeleton/index.js +38 -31
  24. package/dist/es2019/view/FlexibleCard/index.js +32 -7
  25. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +27 -4
  26. package/dist/es2019/view/HoverCard/components/HoverCardContent.js +28 -9
  27. package/dist/es2019/view/HoverCard/components/HoverCardLoadingView.js +32 -0
  28. package/dist/es2019/view/HoverCard/styled.js +12 -1
  29. package/dist/es2019/view/InlineCard/index.js +29 -0
  30. package/dist/esm/state/actions/constants.js +2 -1
  31. package/dist/esm/state/actions/index.js +51 -20
  32. package/dist/esm/version.json +1 -1
  33. package/dist/esm/view/BlockCard/index.js +29 -0
  34. package/dist/esm/view/CardWithUrl/component.js +7 -2
  35. package/dist/esm/view/CardWithUrl/loader.js +2 -0
  36. package/dist/esm/view/EmbedCard/index.js +29 -0
  37. package/dist/esm/view/FlexibleCard/components/common/loading-skeleton/index.js +6 -3
  38. package/dist/esm/view/FlexibleCard/index.js +33 -7
  39. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +27 -4
  40. package/dist/esm/view/HoverCard/components/HoverCardContent.js +30 -10
  41. package/dist/esm/view/HoverCard/components/HoverCardLoadingView.js +31 -0
  42. package/dist/esm/view/HoverCard/styled.js +6 -3
  43. package/dist/esm/view/InlineCard/index.js +29 -0
  44. package/dist/types/state/actions/constants.d.ts +1 -0
  45. package/dist/types/state/actions/index.d.ts +1 -0
  46. package/dist/types/state/hooks/useSmartLink.d.ts +1 -0
  47. package/dist/types/view/BlockCard/types.d.ts +2 -0
  48. package/dist/types/view/Card/index.d.ts +1 -1
  49. package/dist/types/view/Card/types.d.ts +2 -1
  50. package/dist/types/view/CardWithUrl/component.d.ts +1 -1
  51. package/dist/types/view/CardWithUrl/types.d.ts +2 -1
  52. package/dist/types/view/EmbedCard/components/styled.d.ts +16 -16
  53. package/dist/types/view/EmbedCard/types.d.ts +2 -0
  54. package/dist/types/view/FlexibleCard/components/common/loading-skeleton/types.d.ts +8 -0
  55. package/dist/types/view/FlexibleCard/types.d.ts +9 -4
  56. package/dist/types/view/HoverCard/components/HoverCardLoadingView.d.ts +4 -0
  57. package/dist/types/view/HoverCard/styled.d.ts +3 -0
  58. package/dist/types/view/HoverCard/types.d.ts +7 -0
  59. package/dist/types/view/InlineCard/Frame/styled.d.ts +1 -1
  60. package/dist/types/view/InlineCard/Icon.d.ts +3 -3
  61. package/dist/types/view/InlineCard/IconAndTitleLayout/styled.d.ts +9 -9
  62. package/dist/types/view/InlineCard/ResolvingView/styled.d.ts +13 -5
  63. package/dist/types/view/InlineCard/styled.d.ts +8 -4
  64. package/dist/types/view/InlineCard/types.d.ts +2 -1
  65. package/dist/types/view/types.d.ts +6 -0
  66. package/package.json +4 -4
@@ -1,5 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { useEffect } from 'react';
3
+ import { SmartLinkStatus } from '../../constants';
3
4
  import Container from './components/container';
4
5
  import { FlexibleUiContext } from '../../state/flexible-ui-context';
5
6
  import { getContextByStatus, getRetryOptions } from './utils';
@@ -14,24 +15,49 @@ var FlexibleCard = function FlexibleCard(_ref) {
14
15
  var cardState = _ref.cardState,
15
16
  children = _ref.children,
16
17
  onAuthorize = _ref.onAuthorize,
18
+ onError = _ref.onError,
19
+ onResolve = _ref.onResolve,
17
20
  renderers = _ref.renderers,
18
21
  ui = _ref.ui,
19
22
  url = _ref.url,
20
23
  onClick = _ref.onClick,
21
- testId = _ref.testId,
22
- onResolve = _ref.onResolve;
24
+ testId = _ref.testId;
23
25
  var cardType = cardState.status,
24
26
  details = cardState.details;
25
27
  var status = cardType;
26
28
  var context = getContextByStatus(url, status, details, renderers);
27
29
  var retry = getRetryOptions(url, status, details, onAuthorize);
30
+
31
+ var _ref2 = context || {},
32
+ title = _ref2.title;
33
+
28
34
  useEffect(function () {
29
- if (status === 'resolved' && onResolve) {
30
- onResolve({
31
- url: url
32
- });
35
+ switch (status) {
36
+ case SmartLinkStatus.Resolved:
37
+ if (onResolve) {
38
+ onResolve({
39
+ title: title,
40
+ url: url
41
+ });
42
+ }
43
+
44
+ break;
45
+
46
+ case SmartLinkStatus.Errored:
47
+ case SmartLinkStatus.Fallback:
48
+ case SmartLinkStatus.Forbidden:
49
+ case SmartLinkStatus.NotFound:
50
+ case SmartLinkStatus.Unauthorized:
51
+ if (onError) {
52
+ onError({
53
+ status: status,
54
+ url: url
55
+ });
56
+ }
57
+
58
+ break;
33
59
  }
34
- }, [onResolve, status, url]);
60
+ }, [onError, onResolve, status, title, url]);
35
61
  return /*#__PURE__*/React.createElement(FlexibleUiContext.Provider, {
36
62
  value: context
37
63
  }, /*#__PURE__*/React.createElement(Container, _extends({
@@ -27,6 +27,10 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
27
27
  var fadeOutTimeoutId = useRef();
28
28
  var fadeInTimeoutId = useRef();
29
29
  var cardOpenTime = useRef();
30
+ var mousePos = useRef({
31
+ x: 0,
32
+ y: 0
33
+ });
30
34
  var renderers = useSmartLinkRenderers();
31
35
  var linkState = useLinkState(url);
32
36
  var hoverDisplay = 'card';
@@ -73,7 +77,17 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
73
77
  if (actionId === 'preview-content') {
74
78
  hideCard();
75
79
  }
76
- }, [hideCard]); // Stop hover preview content to propagate event to parent.
80
+ }, [hideCard]);
81
+ var setMousePosition = useCallback(function (event) {
82
+ if (isOpen) {
83
+ return;
84
+ }
85
+
86
+ mousePos.current = {
87
+ x: event.clientX,
88
+ y: event.clientY
89
+ };
90
+ }, [isOpen]); // Stop hover preview content to propagate event to parent.
77
91
 
78
92
  var onClick = useCallback(function (e) {
79
93
  return e.stopPropagation();
@@ -103,10 +117,19 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
103
117
  }));
104
118
  },
105
119
  trigger: function trigger(triggerProps) {
106
- return jsx("span", _extends({}, triggerProps, {
120
+ return jsx("span", {
107
121
  onMouseEnter: initShowCard,
108
- onMouseLeave: initHideCard
109
- }), children);
122
+ onMouseLeave: initHideCard,
123
+ onMouseMove: setMousePosition
124
+ }, jsx("span", _extends({}, triggerProps, {
125
+ css: {
126
+ position: 'sticky'
127
+ },
128
+ style: {
129
+ left: mousePos.current.x,
130
+ top: mousePos.current.y
131
+ }
132
+ })), children);
110
133
  },
111
134
  zIndex: 511 // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
112
135
 
@@ -4,12 +4,14 @@ import React, { useCallback, useEffect, useMemo } from 'react';
4
4
  import { ActionName, SmartLinkPosition, SmartLinkSize } from '../../../constants';
5
5
  import extractPreview from '../../../extractors/flexible/extract-preview';
6
6
  import { extractMetadata } from '../../../extractors/hover/extractMetadata';
7
+ import { useSmartCardActions } from '../../../state/actions';
7
8
  import { getExtensionKey } from '../../../state/helpers';
8
9
  import { isSpecialEvent } from '../../../utils';
9
10
  import FlexibleCard from '../../FlexibleCard';
10
11
  import { FooterBlock, MetadataBlock, PreviewBlock, SnippetBlock, TitleBlock } from '../../FlexibleCard/components/blocks';
11
12
  import { flexibleUiOptions, footerBlockCss, metadataBlockCss, titleBlockCss } from '../styled';
12
13
  import { getSimulatedMetadata, SMART_CARD_ANALYTICS_DISPLAY } from '../utils';
14
+ import HoverCardLoadingView from './HoverCardLoadingView';
13
15
  export var getOpenAction = function getOpenAction(url, analytics, onActionClick) {
14
16
  return {
15
17
  name: ActionName.CustomAction,
@@ -49,7 +51,9 @@ export var toFooterActions = function toFooterActions(cardActions, onActionClick
49
51
  var HoverCardContent = function HoverCardContent(_ref) {
50
52
  var _cardState$details;
51
53
 
52
- var analytics = _ref.analytics,
54
+ var _ref$id = _ref.id,
55
+ id = _ref$id === void 0 ? '' : _ref$id,
56
+ analytics = _ref.analytics,
53
57
  _ref$cardActions = _ref.cardActions,
54
58
  cardActions = _ref$cardActions === void 0 ? [] : _ref$cardActions,
55
59
  cardState = _ref.cardState,
@@ -57,6 +61,10 @@ var HoverCardContent = function HoverCardContent(_ref) {
57
61
  onResolve = _ref.onResolve,
58
62
  renderers = _ref.renderers,
59
63
  url = _ref.url;
64
+ var actions = useSmartCardActions(id, url, analytics);
65
+ useEffect(function () {
66
+ actions.loadMetadata();
67
+ }, [actions]);
60
68
  useEffect(function () {
61
69
  // Since hover preview only render on resolved status,
62
70
  // there is no need to check for statuses.
@@ -85,21 +93,33 @@ var HoverCardContent = function HoverCardContent(_ref) {
85
93
 
86
94
  var titleMaxLines = subtitle && subtitle.length > 0 ? 1 : 2;
87
95
  var body = data && extractPreview(data) ? /*#__PURE__*/React.createElement(PreviewBlock, null) : /*#__PURE__*/React.createElement(SnippetBlock, null);
88
- return /*#__PURE__*/React.createElement(FlexibleCard, {
89
- cardState: cardState,
90
- onClick: onClick,
91
- onResolve: onResolve,
92
- renderers: renderers,
93
- ui: flexibleUiOptions,
94
- url: url
95
- }, /*#__PURE__*/React.createElement(TitleBlock, {
96
+ var titleBlockProps = {
96
97
  actions: titleActions,
97
98
  maxLines: titleMaxLines,
98
99
  overrideCss: titleBlockCss,
99
100
  size: SmartLinkSize.Large,
100
101
  position: SmartLinkPosition.Center,
101
102
  subtitle: subtitle
102
- }), /*#__PURE__*/React.createElement(MetadataBlock, {
103
+ };
104
+ var flexibleCardProps = {
105
+ cardState: cardState,
106
+ onClick: onClick,
107
+ onResolve: onResolve,
108
+ renderers: renderers,
109
+ ui: flexibleUiOptions,
110
+ url: url,
111
+ children: {}
112
+ };
113
+
114
+ if (cardState.metadataStatus === 'pending') {
115
+ return /*#__PURE__*/React.createElement(HoverCardLoadingView, {
116
+ flexibleCardProps: flexibleCardProps,
117
+ titleBlockProps: titleBlockProps
118
+ });
119
+ } // if metadataStatus is 'errored' simply render using data available (normal path)
120
+
121
+
122
+ return /*#__PURE__*/React.createElement(FlexibleCard, flexibleCardProps, /*#__PURE__*/React.createElement(TitleBlock, titleBlockProps), /*#__PURE__*/React.createElement(MetadataBlock, {
103
123
  primary: primary,
104
124
  secondary: secondary,
105
125
  size: SmartLinkSize.Large,
@@ -0,0 +1,31 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/core';
3
+ import React from 'react';
4
+ import LoadingSkeleton from '../../FlexibleCard/components/common/loading-skeleton';
5
+ import FlexibleCard from '../../FlexibleCard';
6
+ import { TitleBlock } from '../../FlexibleCard/components/blocks';
7
+ import { CARD_WIDTH_REM, loadingViewContainer, skeletonContainer } from '../styled';
8
+
9
+ var HoverCardLoadingView = function HoverCardLoadingView(_ref) {
10
+ var flexibleCardProps = _ref.flexibleCardProps,
11
+ titleBlockProps = _ref.titleBlockProps;
12
+ var lineHeightRem = 1.25;
13
+ var skeletonWidth = CARD_WIDTH_REM - 2;
14
+ return jsx("div", {
15
+ css: loadingViewContainer,
16
+ "data-testid": "hover-card-loading-view"
17
+ }, jsx(FlexibleCard, flexibleCardProps, jsx(TitleBlock, titleBlockProps)), jsx("div", {
18
+ css: skeletonContainer
19
+ }, jsx("span", null), jsx(LoadingSkeleton, {
20
+ width: skeletonWidth,
21
+ height: lineHeightRem
22
+ }), jsx(LoadingSkeleton, {
23
+ width: skeletonWidth,
24
+ height: lineHeightRem * 3
25
+ }), jsx(LoadingSkeleton, {
26
+ width: skeletonWidth,
27
+ height: lineHeightRem
28
+ })));
29
+ };
30
+
31
+ export default HoverCardLoadingView;
@@ -1,6 +1,6 @@
1
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
2
2
 
3
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
3
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7;
4
4
 
5
5
  import { css } from '@emotion/core';
6
6
  import { loadingPlaceholderClassName } from '../../index';
@@ -12,10 +12,13 @@ export var flexibleUiOptions = {
12
12
  theme: SmartLinkTheme.Black,
13
13
  hidePadding: true
14
14
  };
15
+ export var CARD_WIDTH_REM = 24;
15
16
  var blockGap = '0.5rem';
16
17
  var elementGap = '0.5rem';
17
18
  var separatorCss = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n [data-separator] + [data-separator]:before {\n margin-right: ", ";\n }\n"])), elementGap);
18
- export var HoverCardContainer = css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n background: none;\n border-width: 0;\n box-sizing: border-box;\n width: 24rem;\n padding: 1rem;\n\n .", " {\n display: none;\n }\n"])), loadingPlaceholderClassName);
19
+ export var HoverCardContainer = css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n background: none;\n border-width: 0;\n box-sizing: border-box;\n width: ", "rem;\n padding: 1rem;\n\n .", " {\n display: none;\n }\n"])), CARD_WIDTH_REM, loadingPlaceholderClassName);
19
20
  export var titleBlockCss = css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n gap: ", ";\n\n ", "\n\n // title and subtitle element group\n [data-smart-element-group] {\n // gap between title and subtitle\n gap: 0.06rem;\n\n /* subtitle element group */\n > [data-smart-element-group] {\n > span {\n margin-right: ", ";\n }\n }\n }\n"])), blockGap, separatorCss, elementGap);
20
21
  export var metadataBlockCss = css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n gap: 0px;\n\n /* primary element group */\n [data-smart-element-group]:nth-of-type(1) {\n flex-grow: 7;\n\n // a separator between text-based element\n ", "\n\n /* horizontal spacing between elements in group */\n > span {\n margin-right: ", ";\n }\n }\n /* secondary element group */\n [data-smart-element-group]:nth-of-type(2) {\n flex-grow: 3;\n /* horizontal spacing between elements in group */\n > span {\n margin-left: ", ";\n }\n }\n"])), separatorCss, elementGap, elementGap);
21
- export var footerBlockCss = css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding-top: 0.25rem;\n"])));
22
+ export var footerBlockCss = css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding-top: 0.25rem;\n"])));
23
+ export var loadingViewContainer = css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n"])));
24
+ export var skeletonContainer = css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n align-items: center;\n"])));
@@ -22,6 +22,7 @@ export var InlineCard = function InlineCard(_ref) {
22
22
  isSelected = _ref.isSelected,
23
23
  renderers = _ref.renderers,
24
24
  onResolve = _ref.onResolve,
25
+ onError = _ref.onError,
25
26
  testId = _ref.testId,
26
27
  inlinePreloaderStyle = _ref.inlinePreloaderStyle,
27
28
  showHoverPreview = _ref.showHoverPreview;
@@ -61,6 +62,13 @@ export var InlineCard = function InlineCard(_ref) {
61
62
  }));
62
63
 
63
64
  case 'unauthorized':
65
+ if (onError) {
66
+ onError({
67
+ url: url,
68
+ status: status
69
+ });
70
+ }
71
+
64
72
  var provider = extractProvider(cardDetails);
65
73
  return /*#__PURE__*/React.createElement(InlineCardUnauthorizedView, {
66
74
  icon: provider && provider.icon,
@@ -72,6 +80,13 @@ export var InlineCard = function InlineCard(_ref) {
72
80
  });
73
81
 
74
82
  case 'forbidden':
83
+ if (onError) {
84
+ onError({
85
+ url: url,
86
+ status: status
87
+ });
88
+ }
89
+
75
90
  var providerForbidden = extractProvider(cardDetails);
76
91
  var cardMetadata = (_details$meta = details === null || details === void 0 ? void 0 : details.meta) !== null && _details$meta !== void 0 ? _details$meta : getUnauthorizedJsonLd().meta;
77
92
  var requestAccessContext = extractRequestAccessContext({
@@ -91,6 +106,13 @@ export var InlineCard = function InlineCard(_ref) {
91
106
  });
92
107
 
93
108
  case 'not_found':
109
+ if (onError) {
110
+ onError({
111
+ url: url,
112
+ status: status
113
+ });
114
+ }
115
+
94
116
  var providerNotFound = extractProvider(cardDetails);
95
117
  return /*#__PURE__*/React.createElement(InlineCardErroredView, {
96
118
  url: url,
@@ -103,6 +125,13 @@ export var InlineCard = function InlineCard(_ref) {
103
125
 
104
126
  case 'fallback':
105
127
  case 'errored':
128
+ if (onError) {
129
+ onError({
130
+ url: url,
131
+ status: status
132
+ });
133
+ }
134
+
106
135
  return /*#__PURE__*/React.createElement(CardLinkView, {
107
136
  link: url,
108
137
  isSelected: isSelected,
@@ -3,3 +3,4 @@ export declare const ANALYTICS_ERROR = "errored";
3
3
  export declare const ANALYTICS_FALLBACK = "fallback";
4
4
  export declare const ERROR_MESSAGE_OAUTH = "Provider.authFlow is not set to OAuth2.";
5
5
  export declare const ERROR_MESSAGE_FATAL = "Fatal error resolving URL";
6
+ export declare const ERROR_MESSAGE_METADATA = "Error resolving metadata.";
@@ -8,4 +8,5 @@ export declare const useSmartCardActions: (id: string, url: string, analytics: A
8
8
  reload: () => void;
9
9
  authorize: (appearance: CardAppearance) => void;
10
10
  invoke: (opts: InvokeClientOpts | InvokeServerOpts, appearance: CardInnerAppearance) => Promise<JsonLd.Response | void>;
11
+ loadMetadata: () => Promise<void> | undefined;
11
12
  };
@@ -7,6 +7,7 @@ export declare function useSmartLink(id: string, url: string, dispatchAnalytics:
7
7
  reload: () => void;
8
8
  authorize: (appearance: import("@atlaskit/linking-common").CardAppearance) => void;
9
9
  invoke: (opts: import("../../model/invoke-opts").InvokeClientOpts | import("../../model/invoke-opts").InvokeServerOpts, appearance: import("../../view/Card/types").CardInnerAppearance) => Promise<void | import("json-ld-types").JsonLd.Response<import("json-ld-types").JsonLd.Data.BaseData>>;
10
+ loadMetadata: () => Promise<void> | undefined;
10
11
  };
11
12
  config: (import("@atlaskit/link-provider").CardProviderCacheOpts & import("@atlaskit/link-provider").CardAuthFlowOpts) | undefined;
12
13
  analytics: {
@@ -4,6 +4,7 @@ import { CardState } from '../../state/types';
4
4
  import { InvokeHandler } from '../../model/invoke-handler';
5
5
  import { AnalyticsHandler } from '../../utils/types';
6
6
  import { OnResolveCallback, CardPlatform } from '../Card/types';
7
+ import { OnErrorCallback } from '../types';
7
8
  export declare type BlockCardProps = {
8
9
  id: string;
9
10
  url: string;
@@ -16,6 +17,7 @@ export declare type BlockCardProps = {
16
17
  handleFrameClick: React.EventHandler<React.MouseEvent | React.KeyboardEvent>;
17
18
  isSelected?: boolean;
18
19
  onResolve?: OnResolveCallback;
20
+ onError?: OnErrorCallback;
19
21
  testId?: string;
20
22
  showActions?: boolean;
21
23
  renderers?: CardProviderRenderers;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
2
  import { CardAppearance, CardPlatform, CardProps } from './types';
3
3
  import { WrappedComponentProps } from 'react-intl-next';
4
- export declare const Card: React.ForwardRefExoticComponent<Pick<Omit<React.PropsWithChildren<import("react-intl-next").WithIntlProps<CardProps & WrappedComponentProps<"intl">>>, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps> & React.RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "children" | "data" | "appearance" | "testId" | "isSelected" | "inheritDimensions" | "id" | "placeholder" | "onClick" | "analyticsContext" | "key" | "url" | "ui" | "showActions" | "onResolve" | "platform" | "isFrameVisible" | "embedIframeRef" | "showHoverPreview" | "inlinePreloaderStyle" | "importer" | "container" | "analyticsEvents" | "forwardedRef"> & React.RefAttributes<any>>;
4
+ export declare const Card: React.ForwardRefExoticComponent<Pick<Omit<React.PropsWithChildren<import("react-intl-next").WithIntlProps<CardProps & WrappedComponentProps<"intl">>>, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps> & React.RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "children" | "data" | "appearance" | "testId" | "isSelected" | "inheritDimensions" | "id" | "placeholder" | "onError" | "onClick" | "analyticsContext" | "key" | "url" | "ui" | "showActions" | "onResolve" | "platform" | "isFrameVisible" | "embedIframeRef" | "showHoverPreview" | "inlinePreloaderStyle" | "importer" | "container" | "analyticsEvents" | "forwardedRef"> & React.RefAttributes<any>>;
5
5
  export type { CardAppearance, CardProps, CardPlatform };
@@ -3,7 +3,7 @@ import { WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
3
3
  import { CardAppearance, CardPlatform } from '@atlaskit/linking-common';
4
4
  import { AnalyticsFacade } from '../../state/analytics';
5
5
  import { FlexibleUiOptions } from '../FlexibleCard/types';
6
- import { InlinePreloaderStyle } from '../types';
6
+ import { InlinePreloaderStyle, OnErrorCallback } from '../types';
7
7
  export type { CardAppearance, CardPlatform };
8
8
  export declare type CardInnerAppearance = CardAppearance | 'preview' | 'flexible';
9
9
  export declare type OnResolveCallback = (data: {
@@ -25,6 +25,7 @@ export interface CardProps extends WithAnalyticsEventsProps {
25
25
  testId?: string;
26
26
  showActions?: boolean;
27
27
  onResolve?: OnResolveCallback;
28
+ onError?: OnErrorCallback;
28
29
  inheritDimensions?: boolean;
29
30
  embedIframeRef?: React.Ref<HTMLIFrameElement>;
30
31
  inlinePreloaderStyle?: InlinePreloaderStyle;
@@ -1,3 +1,3 @@
1
1
  /// <reference types="react" />
2
2
  import { CardWithUrlContentProps } from './types';
3
- export declare function CardWithUrlContent({ id, url, isSelected, isFrameVisible, platform, onClick, appearance, dispatchAnalytics, onResolve, testId, showActions, inheritDimensions, embedIframeRef, inlinePreloaderStyle, ui, children, showHoverPreview, analyticsEvents, }: CardWithUrlContentProps): JSX.Element;
3
+ export declare function CardWithUrlContent({ id, url, isSelected, isFrameVisible, platform, onClick, appearance, dispatchAnalytics, onResolve, onError, testId, showActions, inheritDimensions, embedIframeRef, inlinePreloaderStyle, ui, children, showHoverPreview, analyticsEvents, }: CardWithUrlContentProps): JSX.Element;
@@ -2,7 +2,7 @@ import { EventHandler, MouseEvent, KeyboardEvent } from 'react';
2
2
  import { CardAppearance, CardPlatform, OnResolveCallback } from '../Card/types';
3
3
  import { AnalyticsHandler } from '../../utils/types';
4
4
  import { FlexibleUiOptions } from '../FlexibleCard/types';
5
- import { InlinePreloaderStyle } from '../types';
5
+ import { InlinePreloaderStyle, OnErrorCallback } from '../types';
6
6
  import { AnalyticsFacade } from '../../state/analytics';
7
7
  export declare type CardWithUrlContentProps = {
8
8
  id: string;
@@ -16,6 +16,7 @@ export declare type CardWithUrlContentProps = {
16
16
  dispatchAnalytics: AnalyticsHandler;
17
17
  testId?: string;
18
18
  onResolve?: OnResolveCallback;
19
+ onError?: OnErrorCallback;
19
20
  showActions?: boolean;
20
21
  inheritDimensions?: boolean;
21
22
  embedIframeRef?: React.Ref<HTMLIFrameElement>;
@@ -13,33 +13,33 @@ export interface WrapperProps {
13
13
  export declare const borderRadius: string;
14
14
  export declare const ellipsis: (maxWidth?: string | number) => string;
15
15
  export declare const csssize: (value?: string | number) => string;
16
- export declare const LinkWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, WrapperProps, any>;
17
- export declare const Wrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, WrapperProps, any>;
16
+ export declare const LinkWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, WrapperProps, object>;
17
+ export declare const Wrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, WrapperProps, object>;
18
18
  export declare const embedHeaderHeight = 32;
19
- export declare const Header: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
19
+ export declare const Header: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
20
20
  export interface PlaceholderProps {
21
21
  isPlaceholder: boolean;
22
22
  }
23
- export declare const IconWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, PlaceholderProps, any>;
24
- export declare const TextWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, PlaceholderProps, any>;
23
+ export declare const IconWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, PlaceholderProps, object>;
24
+ export declare const TextWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, PlaceholderProps, object>;
25
25
  export interface ContentProps {
26
26
  isInteractive: boolean;
27
27
  }
28
- export declare const Content: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, ContentProps, any>;
28
+ export declare const Content: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, ContentProps, object>;
29
29
  export interface ImageProps {
30
30
  size: number;
31
31
  }
32
- export declare const Image: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, ImageProps, any>;
32
+ export declare const Image: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, ImageProps, object>;
33
33
  export declare const maxAvatarCount = 6;
34
- export declare const ContentWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
35
- export declare const Title: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
36
- export declare const Byline: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
37
- export declare const Description: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
38
- export declare const ResolvedViewIconWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
34
+ export declare const ContentWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
35
+ export declare const Title: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
36
+ export declare const Byline: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
37
+ export declare const Description: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
38
+ export declare const ResolvedViewIconWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
39
39
  export interface ThumbnailProps {
40
40
  src: string;
41
41
  }
42
- export declare const Thumbnail: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, ThumbnailProps, any>;
43
- export declare const UsersWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
44
- export declare const ActionsWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
45
- export declare const AlertWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").ClassAttributes<any>>, any>;
42
+ export declare const Thumbnail: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, ThumbnailProps, object>;
43
+ export declare const UsersWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
44
+ export declare const ActionsWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
45
+ export declare const AlertWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Pick<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement>, keyof import("react").HTMLAttributes<HTMLDivElement>>, object>;
@@ -5,6 +5,7 @@ import { CardPlatform, OnResolveCallback } from '../Card/types';
5
5
  import { ReactNode } from 'react';
6
6
  import { ActionProps } from '../BlockCard/components/Action';
7
7
  import { RequestAccessMessageKey } from '../../messages';
8
+ import { OnErrorCallback } from '../types';
8
9
  export declare type EmbedCardProps = {
9
10
  url: string;
10
11
  cardState: CardState;
@@ -18,6 +19,7 @@ export declare type EmbedCardProps = {
18
19
  isFrameVisible?: boolean;
19
20
  platform?: CardPlatform;
20
21
  onResolve?: OnResolveCallback;
22
+ onError?: OnErrorCallback;
21
23
  testId?: string;
22
24
  inheritDimensions?: boolean;
23
25
  showActions?: boolean;
@@ -5,4 +5,12 @@ export declare type LoadingSkeletonProps = {
5
5
  * code, serving as a hook for automated tests
6
6
  */
7
7
  testId?: string;
8
+ /**
9
+ * Width of the loading skeleton, defaults to width of the parent element
10
+ */
11
+ width?: number;
12
+ /**
13
+ * Height of loading skeleton, defaults to height of the parent element
14
+ */
15
+ height?: number;
8
16
  };
@@ -5,6 +5,7 @@ import { CardProviderRenderers } from '@atlaskit/link-provider';
5
5
  import { SmartLinkSize, SmartLinkTheme } from '../../constants';
6
6
  import { CardAppearance } from '../../view/Card';
7
7
  import { OnResolveCallback } from '../Card/types';
8
+ import { OnErrorCallback } from '../types';
8
9
  export declare type FlexibleCardProps = {
9
10
  /**
10
11
  * @internal A unique ID for a Smart Link.
@@ -36,6 +37,14 @@ export declare type FlexibleCardProps = {
36
37
  * @internal
37
38
  */
38
39
  onAuthorize?: () => void;
40
+ /**
41
+ * function to be called after a flexible card has rendered its error states
42
+ */
43
+ onError?: OnErrorCallback;
44
+ /**
45
+ * function to be called after a flexible card has rendered its resolved state
46
+ */
47
+ onResolve?: OnResolveCallback;
39
48
  /**
40
49
  * Any additional renderers required by Flexible UI. Currently used by icon
41
50
  * to render Emoji.
@@ -56,10 +65,6 @@ export declare type FlexibleCardProps = {
56
65
  * Determines the URL of the Smart Link.
57
66
  */
58
67
  url: string;
59
- /**
60
- * function to be called after a flexible card has rendered its resolved state
61
- */
62
- onResolve?: OnResolveCallback;
63
68
  };
64
69
  export declare type FlexibleUiOptions = {
65
70
  /**
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { HoverCardLoadingViewProps } from '../types';
3
+ declare const HoverCardLoadingView: React.FC<HoverCardLoadingViewProps>;
4
+ export default HoverCardLoadingView;
@@ -1,6 +1,9 @@
1
1
  import { FlexibleUiOptions } from '../FlexibleCard/types';
2
2
  export declare const flexibleUiOptions: FlexibleUiOptions;
3
+ export declare const CARD_WIDTH_REM = 24;
3
4
  export declare const HoverCardContainer: import("@emotion/utils").SerializedStyles;
4
5
  export declare const titleBlockCss: import("@emotion/utils").SerializedStyles;
5
6
  export declare const metadataBlockCss: import("@emotion/utils").SerializedStyles;
6
7
  export declare const footerBlockCss: import("@emotion/utils").SerializedStyles;
8
+ export declare const loadingViewContainer: import("@emotion/utils").SerializedStyles;
9
+ export declare const skeletonContainer: import("@emotion/utils").SerializedStyles;
@@ -6,6 +6,8 @@ import { CardState } from '@atlaskit/linking-common';
6
6
  import { CardProviderRenderers } from '@atlaskit/link-provider';
7
7
  import { AnalyticsHandler } from '../../utils/types';
8
8
  import { ReactElement } from 'react';
9
+ import { TitleBlockProps } from '../FlexibleCard/components/blocks/title-block/types';
10
+ import { FlexibleCardProps } from '../FlexibleCard/types';
9
11
  export interface HoverCardProps extends WithAnalyticsEventsProps {
10
12
  id?: string;
11
13
  url: string;
@@ -23,6 +25,7 @@ export interface MetadataOptions {
23
25
  subtitle: Array<ElementItem>;
24
26
  }
25
27
  export declare type HoverCardContentProps = {
28
+ id?: string;
26
29
  analytics: AnalyticsFacade;
27
30
  cardActions?: LinkAction[];
28
31
  cardState: CardState;
@@ -31,3 +34,7 @@ export declare type HoverCardContentProps = {
31
34
  onResolve: () => void;
32
35
  url: string;
33
36
  };
37
+ export declare type HoverCardLoadingViewProps = {
38
+ flexibleCardProps: FlexibleCardProps;
39
+ titleBlockProps: TitleBlockProps;
40
+ };
@@ -5,4 +5,4 @@ export interface WrapperProps {
5
5
  withoutHover?: boolean;
6
6
  withoutBackground?: boolean;
7
7
  }
8
- export declare const Wrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, WrapperProps, any>;
8
+ export declare const Wrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, WrapperProps, object>;
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
- export declare const Icon: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLImageElement> & import("react").ImgHTMLAttributes<HTMLImageElement>, keyof import("react").ClassAttributes<any>>, any>;
3
- export declare const AKIconWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement>, keyof import("react").ClassAttributes<any>>, any>;
4
- export declare const Shimmer: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, import("@emotion/styled-base/types/helper").Omit<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement>, keyof import("react").ClassAttributes<any>>, any>;
2
+ export declare const Icon: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, Pick<import("react").ClassAttributes<HTMLImageElement> & import("react").ImgHTMLAttributes<HTMLImageElement>, keyof import("react").ImgHTMLAttributes<HTMLImageElement>>, object>;
3
+ export declare const AKIconWrapper: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, Pick<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement>, keyof import("react").HTMLAttributes<HTMLSpanElement>>, object>;
4
+ export declare const Shimmer: import("@emotion/styled-base").StyledComponent<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, Pick<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement>, keyof import("react").HTMLAttributes<HTMLSpanElement>>, object>;