@atlaskit/smart-card 45.11.2 → 45.12.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 (99) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/cjs/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide1--default.png +3 -0
  3. package/dist/cjs/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide2--default.png +3 -0
  4. package/dist/cjs/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide3--default.png +3 -0
  5. package/dist/cjs/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide1--default.png +3 -0
  6. package/dist/cjs/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide2--default.png +3 -0
  7. package/dist/cjs/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide3--default.png +3 -0
  8. package/dist/cjs/messages.js +35 -25
  9. package/dist/cjs/utils/analytics/analytics.js +1 -1
  10. package/dist/cjs/utils/analytics/click.js +4 -69
  11. package/dist/cjs/view/EmbedCard/components/carousel/CarouselSlide.compiled.css +16 -4
  12. package/dist/cjs/view/EmbedCard/components/carousel/CarouselSlide.js +67 -27
  13. package/dist/cjs/view/EmbedCard/components/carousel/index.compiled.css +2 -2
  14. package/dist/cjs/view/EmbedCard/components/carousel/index.js +13 -5
  15. package/dist/cjs/view/EmbedCard/views/unauthorized-view/UnauthorizedCarouselView.js +191 -0
  16. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/IconSlot.compiled.css +7 -0
  17. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/IconSlot.js +31 -0
  18. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoChatBenefitImage.js +16 -0
  19. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoSearchBenefitImage.js +16 -0
  20. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/NoAuthAvailableImage.compiled.css +6 -0
  21. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/NoAuthAvailableImage.js +22 -0
  22. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/ProductIcon.js +47 -0
  23. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/RovoChatBenefitImage.js +359 -0
  24. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/RovoSearchBenefitImage.js +281 -0
  25. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/SmartLinkBenefitImage.js +502 -0
  26. package/dist/cjs/view/EmbedCard/views/unauthorized-view/carousel-images/assets/rovo-chat-avatar.png +0 -0
  27. package/dist/cjs/view/EmbedCard/views/unauthorized-view/index.js +9 -1
  28. package/dist/cjs/view/LinkUrl/index.js +1 -1
  29. package/dist/es2019/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide1--default.png +3 -0
  30. package/dist/es2019/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide2--default.png +3 -0
  31. package/dist/es2019/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide3--default.png +3 -0
  32. package/dist/es2019/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide1--default.png +3 -0
  33. package/dist/es2019/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide2--default.png +3 -0
  34. package/dist/es2019/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide3--default.png +3 -0
  35. package/dist/es2019/messages.js +49 -27
  36. package/dist/es2019/utils/analytics/analytics.js +1 -1
  37. package/dist/es2019/utils/analytics/click.js +3 -66
  38. package/dist/es2019/view/EmbedCard/components/carousel/CarouselSlide.compiled.css +16 -4
  39. package/dist/es2019/view/EmbedCard/components/carousel/CarouselSlide.js +64 -27
  40. package/dist/es2019/view/EmbedCard/components/carousel/index.compiled.css +2 -2
  41. package/dist/es2019/view/EmbedCard/components/carousel/index.js +10 -5
  42. package/dist/es2019/view/EmbedCard/views/unauthorized-view/UnauthorizedCarouselView.js +184 -0
  43. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/IconSlot.compiled.css +7 -0
  44. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/IconSlot.js +25 -0
  45. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoChatBenefitImage.js +3 -0
  46. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoSearchBenefitImage.js +3 -0
  47. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/NoAuthAvailableImage.compiled.css +6 -0
  48. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/NoAuthAvailableImage.js +13 -0
  49. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/ProductIcon.js +40 -0
  50. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/RovoChatBenefitImage.js +352 -0
  51. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/RovoSearchBenefitImage.js +268 -0
  52. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/SmartLinkBenefitImage.js +495 -0
  53. package/dist/es2019/view/EmbedCard/views/unauthorized-view/carousel-images/assets/rovo-chat-avatar.png +0 -0
  54. package/dist/es2019/view/EmbedCard/views/unauthorized-view/index.js +9 -1
  55. package/dist/es2019/view/LinkUrl/index.js +1 -1
  56. package/dist/esm/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide1--default.png +3 -0
  57. package/dist/esm/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide2--default.png +3 -0
  58. package/dist/esm/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-figma-in-trello-slide3--default.png +3 -0
  59. package/dist/esm/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide1--default.png +3 -0
  60. package/dist/esm/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide2--default.png +3 -0
  61. package/dist/esm/__tests__/vr-tests/__snapshots__/embed-card/embed-card-unauthorized-carousel-google-in-confluence-slide3--default.png +3 -0
  62. package/dist/esm/messages.js +35 -25
  63. package/dist/esm/utils/analytics/analytics.js +1 -1
  64. package/dist/esm/utils/analytics/click.js +3 -68
  65. package/dist/esm/view/EmbedCard/components/carousel/CarouselSlide.compiled.css +16 -4
  66. package/dist/esm/view/EmbedCard/components/carousel/CarouselSlide.js +65 -27
  67. package/dist/esm/view/EmbedCard/components/carousel/index.compiled.css +2 -2
  68. package/dist/esm/view/EmbedCard/components/carousel/index.js +13 -5
  69. package/dist/esm/view/EmbedCard/views/unauthorized-view/UnauthorizedCarouselView.js +182 -0
  70. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/IconSlot.compiled.css +7 -0
  71. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/IconSlot.js +24 -0
  72. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoChatBenefitImage.js +5 -0
  73. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoSearchBenefitImage.js +5 -0
  74. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/NoAuthAvailableImage.compiled.css +6 -0
  75. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/NoAuthAvailableImage.js +15 -0
  76. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/ProductIcon.js +40 -0
  77. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/RovoChatBenefitImage.js +351 -0
  78. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/RovoSearchBenefitImage.js +273 -0
  79. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/SmartLinkBenefitImage.js +494 -0
  80. package/dist/esm/view/EmbedCard/views/unauthorized-view/carousel-images/assets/rovo-chat-avatar.png +0 -0
  81. package/dist/esm/view/EmbedCard/views/unauthorized-view/index.js +9 -1
  82. package/dist/esm/view/LinkUrl/index.js +1 -1
  83. package/dist/types/messages.d.ts +1 -1
  84. package/dist/types/utils/analytics/click.d.ts +0 -2
  85. package/dist/types/utils/analytics/types.d.ts +0 -5
  86. package/dist/types/view/EmbedCard/components/carousel/CarouselSlide.d.ts +3 -1
  87. package/dist/types/view/EmbedCard/components/carousel/index.d.ts +3 -1
  88. package/dist/types/view/EmbedCard/views/unauthorized-view/UnauthorizedCarouselView.d.ts +4 -0
  89. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/IconSlot.d.ts +14 -0
  90. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoChatBenefitImage.d.ts +3 -0
  91. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/LazyRovoSearchBenefitImage.d.ts +3 -0
  92. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/NoAuthAvailableImage.d.ts +7 -0
  93. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/ProductIcon.d.ts +9 -0
  94. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/RovoChatBenefitImage.d.ts +8 -0
  95. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/RovoSearchBenefitImage.d.ts +8 -0
  96. package/dist/types/view/EmbedCard/views/unauthorized-view/carousel-images/SmartLinkBenefitImage.d.ts +6 -0
  97. package/dist/types/view/EmbedCard/views/unauthorized-view/index.d.ts +2 -2
  98. package/dist/types/view/EmbedCard/views/unauthorized-view/types.d.ts +1 -0
  99. package/package.json +5 -5
@@ -165,49 +165,66 @@ export const messages = defineMessages({
165
165
  defaultMessage: 'To show a preview of this link, connect your {context} account.',
166
166
  description: 'Shown when a user does not have access to a link, but can connect their external account to view the link on card view. Displayed in byline.'
167
167
  },
168
- connect_link_account_embed_teaser_dot_label: {
169
- id: 'fabric.linking.connect_link_account_embed_teaser_dot_label.non-final',
168
+ connect_link_account_embed_carousel_dot_label: {
169
+ id: 'fabric.linking.connect_link_account_embed_carousel_dot_label.non-final',
170
170
  defaultMessage: 'Go to slide {index} of {total}',
171
171
  description: 'Accessible label for a dot indicator button in the teaser carousel, describing which slide it navigates to'
172
172
  },
173
- connect_link_account_embed_teaser_dot_row_label: {
174
- id: 'fabric.linking.connect_link_account_embed_teaser_dot_row_label.non-final',
173
+ connect_link_account_embed_carousel_dot_row_label: {
174
+ id: 'fabric.linking.connect_link_account_embed_carousel_dot_row_label.non-final',
175
175
  defaultMessage: 'Slides',
176
176
  description: 'Accessible label for the group of dot indicator buttons in the teaser carousel'
177
177
  },
178
- connect_link_account_embed_teaser_button_next: {
179
- id: 'fabric.linking.connect_link_account_embed_teaser_button_next.non-final',
178
+ connect_link_account_embed_carousel_button_back: {
179
+ id: 'fabric.linking.connect_link_account_embed_carousel_button_back.non-final',
180
+ defaultMessage: 'Back',
181
+ description: 'Label for the back button in the embed card carousel teaser'
182
+ },
183
+ connect_link_account_embed_carousel_button_next: {
184
+ id: 'fabric.linking.connect_link_account_embed_carousel_button_next.non-final',
180
185
  defaultMessage: 'Next',
181
186
  description: 'A button to view next teaser on benefit of connecting account on Smart Link embed'
182
187
  },
183
- connect_link_account_embed_teaser_slide_1_description: {
184
- id: 'fabric.linking.connect_link_account_embed_teaser_slide_1_description.non-final',
185
- defaultMessage: 'Connect your account to preview {context} files and documents directly inside Atlassian. No more context switching.',
186
- description: 'A description on a teaser slide 1 on benefit of connecting account on Smart Link embed'
187
- },
188
- connect_link_account_embed_teaser_slide_1_title: {
189
- id: 'fabric.linking.connect_link_account_embed_teaser_slide_1_title.non-final',
190
- defaultMessage: 'See your {context} work without leaving Atlassian',
188
+ connect_link_account_embed_carousel_sl_description: {
189
+ id: 'fabric.linking.connect_link_account_embed_carousel_sl_description.non-final',
190
+ defaultMessage: `Embed live previews of {context, select,
191
+ Google {Google Docs, Sheets, and Slides}
192
+ other {{context}}} {product, select,
193
+ BITBUCKET {right inside Bitbucket}
194
+ CONFLUENCE {right inside Confluence and Jira}
195
+ JIRA {right inside Confluence and Jira}
196
+ TRELLO {right inside Trello}
197
+ other {across Atlassian}}.`,
198
+ description: 'A description on a teaser slide 1 on benefit of connecting account on Smart Link embed.' + ' Example Google+CONFLUENCE: Embed live previews of Google Docs, Sheets, and Slides right inside Confluence and Jira.' + ' Example Google+TRELLO: Embed live previews of Google Docs, Sheets, and Slides right inside Trello.' + ' Example other+TRELLO: Embed live previews of Figma right inside Trello.' + ' Example other+other: Embed live previews of Figma across Atlassian.'
199
+ },
200
+ connect_link_account_embed_carousel_sl_title: {
201
+ id: 'fabric.linking.connect_link_account_embed_carousel_sl_title.non-final',
202
+ defaultMessage: 'Turn smart links into rich previews',
191
203
  description: 'A title on a teaser slide 1 on benefit of connecting account on Smart Link embed'
192
204
  },
193
- connect_link_account_embed_teaser_slide_2_title: {
194
- id: 'fabric.linking.connect_link_account_embed_teaser_slide_2_title.non-final',
195
- defaultMessage: 'Search once, find it everywhere',
205
+ connect_link_account_embed_carousel_rovo_title: {
206
+ id: 'fabric.linking.connect_link_account_embed_carousel_rovo_title.non-final',
207
+ defaultMessage: 'Find everything in one search',
196
208
  description: 'A title on a teaser slide 2 on benefit of connecting account on Smart Link embed'
197
209
  },
198
- connect_link_account_embed_teaser_slide_2_description: {
199
- id: 'fabric.linking.connect_link_account_embed_teaser_slide_2_description.non-final',
200
- defaultMessage: 'Search relevant {context} files alongside your Confluence pages and Jira issues, always respecting your {context} permissions.',
201
- description: 'A description on a teaser slide 2 on benefit of connecting account on Smart Link embed'
202
- },
203
- connect_link_account_embed_teaser_slide_3_title: {
204
- id: 'fabric.linking.connect_link_account_embed_teaser_slide_3_title.non-final',
210
+ connect_link_account_embed_carousel_rovo_description: {
211
+ id: 'fabric.linking.connect_link_account_embed_carousel_rovo_description.non-final',
212
+ defaultMessage: `Access {context} files alongside your work in {product, select,
213
+ BITBUCKET {Bitbucket}
214
+ CONFLUENCE {Confluence and Jira}
215
+ JIRA {Confluence and Jira}
216
+ TRELLO {Trello}
217
+ other {Atlassian}}. We'll always respect your {context} permissions.`,
218
+ description: 'A description on a teaser slide 2 on benefit of connecting account on Smart Link embed.' + " Example Figma+JIRA: Access Figma files alongside your work in Confluence and Jira. We'll always respect your Figma permissions." + " Example Figma+BITBUCKET: Access Figma files alongside your work in Bitbucket. We'll always respect your Figma permissions." + " Example Figma+other: Access Figma files alongside your work in Atlassian. We'll always respect your Figma permissions."
219
+ },
220
+ connect_link_account_embed_carousel_rovochat_title: {
221
+ id: 'fabric.linking.connect_link_account_embed_carousel_rovochat_title.non-final',
205
222
  defaultMessage: 'Get help from Rovo',
206
223
  description: 'A title on a teaser slide 3 on benefit of connecting account on Smart Link embed'
207
224
  },
208
- connect_link_account_embed_teaser_slide_3_description: {
209
- id: 'fabric.linking.connect_link_account_embed_teaser_slide_3_description.non-final',
210
- defaultMessage: "Rovo uses your {context} content to answer questions, summarise docs, and draft updates using the work you've already done.",
225
+ connect_link_account_embed_carousel_rovochat_description: {
226
+ id: 'fabric.linking.connect_link_account_embed_carousel_rovochat_description.non-final',
227
+ defaultMessage: 'Rovo uses your {context} content to answer questions, summarise docs, and draft updates using the work youve already done.',
211
228
  description: 'A description on a teaser slide 3 on benefit of connecting account on Smart Link embed'
212
229
  },
213
230
  connect_link_account_success_flag_description: {
@@ -230,6 +247,11 @@ export const messages = defineMessages({
230
247
  defaultMessage: 'Connect to {context}',
231
248
  description: 'Shown on a button to connect user external account to their Atlassian account.'
232
249
  },
250
+ connect_3p_account: {
251
+ id: 'fabric.linking.connect_3p_account.non-final',
252
+ defaultMessage: 'Connect {context}',
253
+ description: 'Shown on a button to connect user external 3P account to their Atlassian account, e.g. Connect Figma'
254
+ },
233
255
  connect_inline_social_proof: {
234
256
  id: 'fabric.linking.connect_inline_social_proof',
235
257
  defaultMessage: 'Connect',
@@ -2,7 +2,7 @@ export const ANALYTICS_CHANNEL = 'media';
2
2
  export const context = {
3
3
  componentName: 'smart-cards',
4
4
  packageName: "@atlaskit/smart-card" || '',
5
- packageVersion: "45.11.1" || ''
5
+ packageVersion: "45.12.0" || ''
6
6
  };
7
7
  export let TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
8
8
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -1,7 +1,5 @@
1
1
  import React from 'react';
2
2
  import { browser } from '@atlaskit/linking-common/user-agent';
3
- import { functionWithCondition } from '@atlaskit/platform-feature-flags-react';
4
- import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
5
3
  import { useLinkClicked, useMouseDownEvent } from '../../state/analytics/useLinkClicked';
6
4
  import { ANALYTICS_CHANNEL } from './analytics';
7
5
  export const buttonMap = new Map([[undefined, 'none'], [0, 'left'], [1, 'middle'], [2, 'right']]);
@@ -67,7 +65,7 @@ export function getLinkClickOutcome(e, clickType) {
67
65
  }
68
66
  return 'unknown';
69
67
  }
70
- const linkClickedEventOld = ({
68
+ const linkClickedEvent = ({
71
69
  clickType,
72
70
  clickOutcome,
73
71
  keysHeld,
@@ -83,25 +81,7 @@ const linkClickedEventOld = ({
83
81
  defaultPrevented
84
82
  }
85
83
  });
86
- const linkClickedEventWithShortLink = ({
87
- clickType,
88
- clickOutcome,
89
- keysHeld,
90
- defaultPrevented,
91
- isConfluenceShortLink
92
- }) => ({
93
- action: 'clicked',
94
- actionSubject: 'link',
95
- eventType: 'ui',
96
- attributes: {
97
- clickType,
98
- clickOutcome,
99
- keysHeld,
100
- defaultPrevented,
101
- isConfluenceShortLink
102
- }
103
- });
104
- export const createLinkClickedPayloadOld = event => {
84
+ export const createLinkClickedPayload = event => {
105
85
  // Through the `detail` property, we're able to determine if the event is (most likely) triggered via keyboard
106
86
  // https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
107
87
  const isKeyboard = event.nativeEvent.detail === 0;
@@ -112,7 +92,7 @@ export const createLinkClickedPayloadOld = event => {
112
92
  const clickOutcome = getLinkClickOutcome(event, clickType);
113
93
  const keysHeld = getKeys(event);
114
94
  const defaultPrevented = event.defaultPrevented;
115
- const linkClickedEventResult = linkClickedEventOld({
95
+ const linkClickedEventResult = linkClickedEvent({
116
96
  clickType,
117
97
  clickOutcome,
118
98
  keysHeld,
@@ -133,49 +113,6 @@ export const createLinkClickedPayloadOld = event => {
133
113
  return linkClickedEventResult;
134
114
  }
135
115
  };
136
- export const createLinkClickedPayloadNew = event => {
137
- // Through the `detail` property, we're able to determine if the event is (most likely) triggered via keyboard
138
- // https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
139
- const isKeyboard = event.nativeEvent.detail === 0;
140
- const clickType = isKeyboard ? 'keyboard' : buttonMap.get(event.button);
141
- if (!clickType) {
142
- return;
143
- }
144
- const clickOutcome = getLinkClickOutcome(event, clickType);
145
- const keysHeld = getKeys(event);
146
- const defaultPrevented = event.defaultPrevented;
147
-
148
- // Check if the URL is a Confluence shortLink (contains "/l/cp/")
149
- let isConfluenceShortLink = false;
150
- if (event.currentTarget instanceof HTMLAnchorElement) {
151
- const url = event.currentTarget.href;
152
- isConfluenceShortLink = url.includes('/l/cp/');
153
- }
154
- const linkClickedEventResult = linkClickedEventWithShortLink({
155
- clickType,
156
- clickOutcome,
157
- keysHeld,
158
- defaultPrevented,
159
- isConfluenceShortLink
160
- });
161
-
162
- // if the current target is an anchor tag, we can get the href from it and use that as the url being navigated too.
163
- if (event.currentTarget instanceof HTMLAnchorElement) {
164
- const url = event.currentTarget.href;
165
- return {
166
- ...linkClickedEventResult,
167
- nonPrivacySafeAttributes: {
168
- url
169
- }
170
- };
171
- } else {
172
- // We can't get the href from the event target, so dont include the url or any non privacy safe attributes
173
- return linkClickedEventResult;
174
- }
175
- };
176
- export const createLinkClickedPayload = functionWithCondition(() => expValEquals('smart_link_confluence_short_link_analytics', 'cohort', 'test'),
177
- // 12/17/2025: Clean up this feature gate once it's out in prod for 2 weeks - https://product-fabric.atlassian.net/browse/CCPERMS-5030
178
- createLinkClickedPayloadNew, createLinkClickedPayloadOld);
179
116
  export const fireLinkClickedEvent = createAnalyticsEvent => (event, overrides = {}) => {
180
117
  const payload = createLinkClickedPayload(event);
181
118
  if (payload) {
@@ -1,23 +1,33 @@
1
1
  ._2rko1rr0{border-radius:var(--ds-radius-full,9999px)}
2
2
  ._zulp1ejb{gap:var(--ds-space-300,24px)}
3
+ ._zulppxbi{gap:var(--ds-space-200,1pc)}
3
4
  ._zulpu2gc{gap:var(--ds-space-100,8px)}
4
- ._zulpze3t{gap:var(--ds-space-0,0)}._16jlkb7n{flex-grow:1}
5
+ ._zulpze3t{gap:var(--ds-space-0,0)}._154iidpf{top:0}
6
+ ._16jlkb7n{flex-grow:1}
7
+ ._18m915vq{overflow-y:hidden}
5
8
  ._18m91wug{overflow-y:auto}
6
9
  ._19bv1jfw{padding-left:var(--ds-space-500,40px)}
7
10
  ._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
8
11
  ._19bvze3t{padding-left:var(--ds-space-0,0)}
9
12
  ._1bah1h6o{justify-content:center}
13
+ ._1bah1y6m{justify-content:flex-start}
14
+ ._1bah1yb4{justify-content:space-between}
10
15
  ._1bsb1osq{width:100%}
11
16
  ._1bsb1tcg{width:24px}
12
17
  ._1bsb7vkz{width:1pc}
13
- ._1bsbi2wt{width:6px}
18
+ ._1bsbftgi{width:8px}
14
19
  ._1e0c1txw{display:flex}
15
20
  ._1e0c1ule{display:block}
21
+ ._1ltvidpf{left:0}
16
22
  ._1n261g80{flex-wrap:wrap}
23
+ ._1n261q9c{flex-wrap:nowrap}
17
24
  ._1o9zidpf{flex-shrink:0}
18
25
  ._1o9zkb7n{flex-shrink:1}
19
26
  ._1oecfnf5{transition-duration:.2s}
27
+ ._1reo15vq{overflow-x:hidden}
20
28
  ._1reo1wug{overflow-x:auto}
29
+ ._1tkeidpf{min-height:0}
30
+ ._1ul9idpf{min-width:0}
21
31
  ._2lx21bp4{flex-direction:column}
22
32
  ._2lx2vrvc{flex-direction:row}
23
33
  ._4cvr1fhb{align-items:stretch}
@@ -26,10 +36,10 @@
26
36
  ._4t3i1osq{height:100%}
27
37
  ._4t3i1tcg{height:24px}
28
38
  ._4t3i7vkz{height:1pc}
29
- ._4t3ii2wt{height:6px}
39
+ ._4t3iftgi{height:8px}
30
40
  ._5ral1f51{object-fit:contain}
31
41
  ._6fl45ucs{transition-timing-function:ease}
32
- ._bfhk1dy8{background-color:var(--ds-background-accent-blue-subtler,#cfe1fd)}
42
+ ._bfhk9pm7{background-color:var(--ds-background-information-subtle,#8fb8f6)}
33
43
  ._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
34
44
  ._bfhkjmqp{background-color:var(--ds-background-selected-bold,#1868db)}
35
45
  ._bfhksm61{background-color:var(--ds-background-neutral-subtle,#00000000)}
@@ -40,6 +50,8 @@
40
50
  ._i0dlghg7{flex-basis:240px}
41
51
  ._i0dluuw1{flex-basis:200px}
42
52
  ._k8m01k61{transition-property:background-color}
53
+ ._kqswh2mm{position:relative}
54
+ ._kqswstnw{position:absolute}
43
55
  ._lcxvglyw{pointer-events:none}
44
56
  ._n3td1jfw{padding-bottom:var(--ds-space-500,40px)}
45
57
  ._n3tdpxbi{padding-bottom:var(--ds-space-200,1pc)}
@@ -1,59 +1,82 @@
1
1
  /* CarouselSlide.tsx generated by @compiled/babel-plugin v0.40.0 */
2
2
  import "./CarouselSlide.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
- import React from 'react';
4
+ import React, { useMemo } from 'react';
5
5
  import { useIntl } from 'react-intl';
6
6
  import Button from '@atlaskit/button/new';
7
7
  import { cx } from '@atlaskit/css';
8
8
  import Heading from '@atlaskit/heading';
9
+ import SmartLinkIcon from '@atlaskit/icon/core/smart-link';
10
+ import IconTile from '@atlaskit/icon/icon-tile';
9
11
  import Image from '@atlaskit/image';
10
12
  import { Box, Pressable, Text } from '@atlaskit/primitives/compiled';
11
13
  import { messages } from '../../../../messages';
12
14
  const styles = {
13
- columnImage: "_16jlkb7n _1o9zkb7n _i0dlghg7 _1e0c1txw _4cvr1h6o _1bah1h6o _ca0qpxbi _u5f3pxbi _n3tdpxbi _19bvpxbi _bfhk1dy8",
14
- columnContent: "_zulp1ejb _16jlkb7n _1o9zkb7n _i0dluuw1 _1e0c1txw _2lx21bp4 _ca0q1jfw _u5f31jfw _n3td1jfw _19bv1jfw _4cvr1y6m _1bah1h6o",
15
+ columnImage: "_16jlkb7n _1o9zkb7n _i0dlghg7 _1reo15vq _18m915vq _1e0c1txw _4cvr1fhb _1bah1y6m _1tkeidpf _1ul9idpf _bfhk9pm7",
16
+ imageContainer: "_kqswh2mm _1bsb1osq _4t3i1osq",
17
+ imageAbsolute: "_kqswstnw _154iidpf _1ltvidpf _1bsb1osq",
18
+ columnContent: "_zulp1ejb _16jlkb7n _1o9zkb7n _i0dluuw1 _1reo1wug _18m91wug _1e0c1txw _2lx21bp4 _1tkeidpf _ca0q1jfw _u5f31jfw _n3td1jfw _19bv1jfw _4cvr1y6m _1bah1yb4",
19
+ columnContentTop: "_zulppxbi _1e0c1txw _2lx21bp4 _4cvr1y6m _1bsb1osq",
20
+ columnContentBody: "_zulp1ejb _1e0c1txw _2lx21bp4 _4cvr1y6m _1bsb1osq",
15
21
  columnContentCompact: "_ca0qpxbi _u5f3pxbi _n3tdpxbi _19bvpxbi",
16
- dot: "_2rko1rr0 _1bsbi2wt _4t3ii2wt _bfhki8nm _1oecfnf5 _k8m01k61 _6fl45ucs _lcxvglyw",
22
+ dot: "_2rko1rr0 _1bsbftgi _4t3iftgi _bfhki8nm _1oecfnf5 _k8m01k61 _6fl45ucs _lcxvglyw",
17
23
  dotActive: "_bfhkjmqp",
18
24
  dotPassable: "_2rko1rr0 _1e0c1txw _4cvr1h6o _1bah1h6o _1bsb7vkz _4t3i7vkz _bfhksm61 _ca0qze3t _u5f3ze3t _n3tdze3t _19bvze3t",
19
25
  icon: "_1o9zidpf _1bsb1tcg _4t3i1tcg _1e0c1txw _4cvr1h6o _1bah1h6o",
20
26
  iconImage: "_1bsb1osq _4t3i1osq _5ral1f51",
21
27
  image: "_1bsb1osq _c71l1wdt _5ral1f51 _rsufaqso _1e0c1ule",
22
28
  rowButton: "_zulpu2gc _1e0c1txw _2lx2vrvc _1n261g80 _4cvr1h6o",
29
+ rowButtonNavGroup: "_zulpu2gc _1e0c1txw _2lx2vrvc _4cvr1h6o _1o9zidpf",
23
30
  rowButtonCompact: "_1bsb1osq",
24
31
  rowDot: "_zulpze3t _1e0c1txw _2lx2vrvc _4cvr1h6o",
25
32
  rowIcon: "_zulpu2gc _1e0c1txw _4cvr1h6o",
26
- slide: "_1reo1wug _18m91wug _1e0c1txw _1n261g80 _1bsb1osq _4t3i1osq _4cvr1fhb _vchhusvi"
33
+ slide: "_1reo15vq _18m915vq _1e0c1txw _1n261q9c _1bsb1osq _4t3i1osq _4cvr1fhb _vchhusvi"
27
34
  };
28
35
  const CarouselSlide = ({
29
36
  icon,
30
- iconLabel,
37
+ iconLabel = '',
31
38
  title,
32
39
  description,
33
40
  image,
34
41
  primaryButtonLabel,
35
42
  onPrimaryButtonClick,
43
+ onBackClick,
36
44
  onDotClick,
37
45
  onNextClick,
38
46
  slideIndex,
39
47
  totalSlides,
40
48
  size,
41
- testId = 'embed-card-teaser-slide'
49
+ testId = 'embed-card-carousel-slide'
42
50
  }) => {
43
51
  const {
44
52
  formatMessage
45
53
  } = useIntl();
46
54
  const isCompact = size !== 'full';
55
+ const showPrimaryButton = typeof onPrimaryButtonClick === 'function';
47
56
  const showNavigation = totalSlides > 1;
48
- const renderedIcon = icon == null ? null : typeof icon === 'string' ? /*#__PURE__*/React.createElement(Box, {
49
- xcss: styles.icon
50
- }, /*#__PURE__*/React.createElement(Image, {
51
- src: icon,
52
- alt: iconLabel,
53
- className: ax([styles.iconImage])
54
- })) : /*#__PURE__*/React.createElement(Box, {
55
- xcss: styles.icon
56
- }, icon);
57
+ const renderedIcon = useMemo(() => {
58
+ if (typeof icon === 'string') {
59
+ return /*#__PURE__*/React.createElement(Box, {
60
+ xcss: styles.icon
61
+ }, /*#__PURE__*/React.createElement(Image, {
62
+ src: icon,
63
+ alt: iconLabel,
64
+ className: ax([styles.iconImage])
65
+ }));
66
+ }
67
+ if (icon) {
68
+ return /*#__PURE__*/React.createElement(Box, {
69
+ xcss: styles.icon
70
+ }, icon);
71
+ }
72
+ return /*#__PURE__*/React.createElement(IconTile, {
73
+ appearance: "blue",
74
+ icon: SmartLinkIcon,
75
+ label: iconLabel,
76
+ size: "small",
77
+ testId: "embed-card-fallback-icon"
78
+ });
79
+ }, [icon, iconLabel]);
57
80
  const renderedImage = image == null ? null : typeof image === 'string' ? /*#__PURE__*/React.createElement(Image, {
58
81
  src: image,
59
82
  alt: title,
@@ -64,7 +87,9 @@ const CarouselSlide = ({
64
87
  testId: testId
65
88
  }, /*#__PURE__*/React.createElement(Box, {
66
89
  xcss: cx(styles.columnContent, isCompact && styles.columnContentCompact)
67
- }, isCompact && /*#__PURE__*/React.createElement(Box, {
90
+ }, /*#__PURE__*/React.createElement(Box, {
91
+ xcss: styles.columnContentTop
92
+ }, showPrimaryButton && isCompact && /*#__PURE__*/React.createElement(Box, {
68
93
  xcss: cx(styles.rowButton, styles.rowButtonCompact)
69
94
  }, /*#__PURE__*/React.createElement(Button, {
70
95
  appearance: "primary",
@@ -76,29 +101,37 @@ const CarouselSlide = ({
76
101
  }, renderedIcon), /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(Heading, {
77
102
  size: "medium",
78
103
  testId: `${testId}-title`
79
- }, title)), /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(Text, {
104
+ }, title)), /*#__PURE__*/React.createElement(Box, {
105
+ xcss: styles.columnContentBody
106
+ }, /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(Text, {
80
107
  testId: `${testId}-description`
81
- }, description)), /*#__PURE__*/React.createElement(Box, {
108
+ }, description)), (showPrimaryButton && !isCompact || showNavigation && (onNextClick || onBackClick)) && /*#__PURE__*/React.createElement(Box, {
82
109
  xcss: styles.rowButton
83
- }, !isCompact && /*#__PURE__*/React.createElement(Button, {
110
+ }, showPrimaryButton && !isCompact && /*#__PURE__*/React.createElement(Button, {
84
111
  appearance: "primary",
85
112
  onClick: onPrimaryButtonClick,
86
113
  testId: `${testId}-connect`
87
- }, primaryButtonLabel), showNavigation && onNextClick && /*#__PURE__*/React.createElement(Button, {
114
+ }, primaryButtonLabel), showNavigation && (onBackClick || onNextClick) && /*#__PURE__*/React.createElement(Box, {
115
+ xcss: styles.rowButtonNavGroup
116
+ }, onBackClick && /*#__PURE__*/React.createElement(Button, {
117
+ appearance: "subtle",
118
+ onClick: onBackClick,
119
+ testId: `${testId}-back`
120
+ }, formatMessage(messages.connect_link_account_embed_carousel_button_back)), onNextClick && /*#__PURE__*/React.createElement(Button, {
88
121
  appearance: "subtle",
89
122
  onClick: onNextClick,
90
123
  testId: `${testId}-next`
91
- }, formatMessage(messages.connect_link_account_embed_teaser_button_next)), showNavigation && /*#__PURE__*/React.createElement(Box, {
124
+ }, formatMessage(messages.connect_link_account_embed_carousel_button_next)))))), showNavigation && /*#__PURE__*/React.createElement(Box, {
92
125
  xcss: styles.rowDot,
93
126
  role: "group",
94
- "aria-label": formatMessage(messages.connect_link_account_embed_teaser_dot_row_label)
127
+ "aria-label": formatMessage(messages.connect_link_account_embed_carousel_dot_row_label)
95
128
  }, Array.from({
96
129
  length: totalSlides
97
130
  }, (_, i) => /*#__PURE__*/React.createElement(Pressable, {
98
131
  key: i,
99
132
  xcss: styles.dotPassable,
100
133
  onClick: () => onDotClick === null || onDotClick === void 0 ? void 0 : onDotClick(i),
101
- "aria-label": formatMessage(messages.connect_link_account_embed_teaser_dot_label, {
134
+ "aria-label": formatMessage(messages.connect_link_account_embed_carousel_dot_label, {
102
135
  index: i + 1,
103
136
  total: totalSlides
104
137
  }),
@@ -106,9 +139,13 @@ const CarouselSlide = ({
106
139
  testId: `${testId}-dot-${i}`
107
140
  }, /*#__PURE__*/React.createElement(Box, {
108
141
  xcss: cx(styles.dot, i === slideIndex && styles.dotActive)
109
- })))))), !isCompact && /*#__PURE__*/React.createElement(Box, {
142
+ }))))), !isCompact && /*#__PURE__*/React.createElement(Box, {
110
143
  xcss: styles.columnImage,
111
- testId: `${testId}-image-panel`
112
- }, renderedImage));
144
+ testId: `${testId}-image-panel-${slideIndex}`
145
+ }, /*#__PURE__*/React.createElement(Box, {
146
+ xcss: styles.imageContainer
147
+ }, /*#__PURE__*/React.createElement(Box, {
148
+ xcss: styles.imageAbsolute
149
+ }, renderedImage))));
113
150
  };
114
151
  export default CarouselSlide;
@@ -6,7 +6,7 @@
6
6
  ._1reo15vq{overflow-x:hidden}
7
7
  ._4t3i1osq{height:100%}
8
8
  ._5sagjx92{animation-duration:.28s}
9
- ._j7hql61g{animation-name:kjqoltm}
9
+ ._j7hq1wwu{animation-name:kgnpaw5}
10
10
  ._kqswh2mm{position:relative}
11
- @keyframes kjqoltm{0%{opacity:0;transform:translateX(40px)}to{opacity:1;transform:translateX(0)}}
11
+ @keyframes kgnpaw5{0%{opacity:0}to{opacity:1}}
12
12
  @media (prefers-reduced-motion:reduce){._bl8aglyw{animation-name:none}._2hwzhgkh{animation-duration:.01ms}}
@@ -7,12 +7,10 @@ import CarouselSlide from './CarouselSlide';
7
7
  const styles = {
8
8
  carousel: "_1reo15vq _18m915vq _1e0c1txw _1bsb1osq _4t3i1osq _kqswh2mm"
9
9
  };
10
-
11
- // Slide enters from the right: translates from 40px right + fades in
12
- const slideInFromRight = null;
10
+ const fadeIn = null;
13
11
  const slideWrapperMap = {
14
12
  static: "_1bsb1osq _4t3i1osq",
15
- animated: "_1bsb1osq _4t3i1osq _j7hql61g _5sagjx92 _1pglafbj _1o511hrf _bl8aglyw _2hwzhgkh"
13
+ animated: "_1bsb1osq _4t3i1osq _j7hq1wwu _5sagjx92 _1pglafbj _1o511hrf _bl8aglyw _2hwzhgkh"
16
14
  };
17
15
  /**
18
16
  * Derives layout size bucket from pixel dimensions.
@@ -31,12 +29,13 @@ const getSize = (width, height) => {
31
29
  const Carousel = ({
32
30
  icon,
33
31
  iconLabel,
32
+ initialSlideIndex = 0,
34
33
  items,
35
34
  onPrimaryButtonClick,
36
35
  primaryButtonLabel,
37
36
  testId = 'embed-card-teaser-carousel'
38
37
  }) => {
39
- const [activeIndex, setActiveIndex] = useState(0);
38
+ const [activeIndex, setActiveIndex] = useState(initialSlideIndex);
40
39
  const [size, setSize] = useState('full');
41
40
 
42
41
  // Tracks whether the user has navigated at least once.
@@ -65,6 +64,10 @@ const Carousel = ({
65
64
  hasNavigated.current = true;
66
65
  setActiveIndex(current => (current + 1) % items.length);
67
66
  }, [items.length]);
67
+ const goPrev = useCallback(() => {
68
+ hasNavigated.current = true;
69
+ setActiveIndex(current => Math.max(0, current - 1));
70
+ }, []);
68
71
  const goTo = useCallback(index => {
69
72
  if (index === activeIndex) {
70
73
  return;
@@ -73,6 +76,7 @@ const Carousel = ({
73
76
  setActiveIndex(index);
74
77
  }, [activeIndex]);
75
78
  const currentSlide = items[activeIndex];
79
+ const isFirstSlide = activeIndex === 0;
76
80
  const isLastSlide = activeIndex === items.length - 1;
77
81
  return /*#__PURE__*/React.createElement(Box, {
78
82
  ref: containerRef,
@@ -90,6 +94,7 @@ const Carousel = ({
90
94
  image: currentSlide.image,
91
95
  title: currentSlide.title,
92
96
  onPrimaryButtonClick: onPrimaryButtonClick,
97
+ onBackClick: !isFirstSlide ? goPrev : undefined,
93
98
  onDotClick: goTo,
94
99
  onNextClick: !isLastSlide ? goNext : undefined,
95
100
  size: size,