@pega/cosmos-react-core 10.0.0-build.5.2 → 10.0.0-build.5.21

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 (131) hide show
  1. package/lib/components/AIRewrite/AIRewrite.styles.d.ts +19 -3
  2. package/lib/components/AIRewrite/AIRewrite.styles.d.ts.map +1 -1
  3. package/lib/components/AppShell/AppHeader.styles.d.ts.map +1 -1
  4. package/lib/components/AppShell/AppHeader.styles.js +8 -3
  5. package/lib/components/AppShell/AppHeader.styles.js.map +1 -1
  6. package/lib/components/AppShell/AppShell.d.ts.map +1 -1
  7. package/lib/components/AppShell/AppShell.js +16 -6
  8. package/lib/components/AppShell/AppShell.js.map +1 -1
  9. package/lib/components/AppShell/AppShell.styles.d.ts +3 -0
  10. package/lib/components/AppShell/AppShell.styles.d.ts.map +1 -1
  11. package/lib/components/AppShell/AppShell.styles.js +33 -17
  12. package/lib/components/AppShell/AppShell.styles.js.map +1 -1
  13. package/lib/components/AppShell/AppShell.types.d.ts +33 -0
  14. package/lib/components/AppShell/AppShell.types.d.ts.map +1 -1
  15. package/lib/components/AppShell/AppShell.types.js.map +1 -1
  16. package/lib/components/AppShell/DocumentTabs.d.ts +6 -0
  17. package/lib/components/AppShell/DocumentTabs.d.ts.map +1 -0
  18. package/lib/components/AppShell/DocumentTabs.js +409 -0
  19. package/lib/components/AppShell/DocumentTabs.js.map +1 -0
  20. package/lib/components/AppShell/DocumentTabs.styles.d.ts +231 -0
  21. package/lib/components/AppShell/DocumentTabs.styles.d.ts.map +1 -0
  22. package/lib/components/AppShell/DocumentTabs.styles.js +562 -0
  23. package/lib/components/AppShell/DocumentTabs.styles.js.map +1 -0
  24. package/lib/components/AppShell/NavigationListItemWrapper.d.ts.map +1 -1
  25. package/lib/components/AppShell/NavigationListItemWrapper.js +6 -5
  26. package/lib/components/AppShell/NavigationListItemWrapper.js.map +1 -1
  27. package/lib/components/AppShell/Operator.d.ts.map +1 -1
  28. package/lib/components/AppShell/Operator.js +8 -5
  29. package/lib/components/AppShell/Operator.js.map +1 -1
  30. package/lib/components/AppShell/ThemeSwitcher.d.ts.map +1 -1
  31. package/lib/components/AppShell/ThemeSwitcher.js +1 -0
  32. package/lib/components/AppShell/ThemeSwitcher.js.map +1 -1
  33. package/lib/components/AppShell/index.d.ts +1 -1
  34. package/lib/components/AppShell/index.d.ts.map +1 -1
  35. package/lib/components/AppShell/index.js.map +1 -1
  36. package/lib/components/Backdrop/Backdrop.js +2 -2
  37. package/lib/components/Backdrop/Backdrop.js.map +1 -1
  38. package/lib/components/DateTime/Input/DateInput.d.ts.map +1 -1
  39. package/lib/components/DateTime/Input/DateInput.js +15 -9
  40. package/lib/components/DateTime/Input/DateInput.js.map +1 -1
  41. package/lib/components/DateTime/Input/DateTime.styles.d.ts +3 -0
  42. package/lib/components/DateTime/Input/DateTime.styles.d.ts.map +1 -1
  43. package/lib/components/DateTime/Input/DateTime.styles.js +25 -0
  44. package/lib/components/DateTime/Input/DateTime.styles.js.map +1 -1
  45. package/lib/components/DateTime/Input/DateTimeInput.d.ts.map +1 -1
  46. package/lib/components/DateTime/Input/DateTimeInput.js +27 -18
  47. package/lib/components/DateTime/Input/DateTimeInput.js.map +1 -1
  48. package/lib/components/DateTime/Input/TimeInput.d.ts +6 -3
  49. package/lib/components/DateTime/Input/TimeInput.d.ts.map +1 -1
  50. package/lib/components/DateTime/Input/TimeInput.js +54 -24
  51. package/lib/components/DateTime/Input/TimeInput.js.map +1 -1
  52. package/lib/components/DateTime/Input/WeekInput.d.ts +6 -3
  53. package/lib/components/DateTime/Input/WeekInput.d.ts.map +1 -1
  54. package/lib/components/DateTime/Input/WeekInput.js +29 -16
  55. package/lib/components/DateTime/Input/WeekInput.js.map +1 -1
  56. package/lib/components/DateTime/Picker/Calendar.styles.d.ts.map +1 -1
  57. package/lib/components/DateTime/Picker/Calendar.styles.js +5 -0
  58. package/lib/components/DateTime/Picker/Calendar.styles.js.map +1 -1
  59. package/lib/components/DateTime/Picker/DatePicker.styles.d.ts.map +1 -1
  60. package/lib/components/DateTime/Picker/DatePicker.styles.js +32 -7
  61. package/lib/components/DateTime/Picker/DatePicker.styles.js.map +1 -1
  62. package/lib/components/DateTime/Picker/TimePicker.d.ts.map +1 -1
  63. package/lib/components/DateTime/Picker/TimePicker.js +10 -2
  64. package/lib/components/DateTime/Picker/TimePicker.js.map +1 -1
  65. package/lib/components/Dialog/Dialog.types.d.ts +23 -13
  66. package/lib/components/Dialog/Dialog.types.d.ts.map +1 -1
  67. package/lib/components/Dialog/Dialog.types.js.map +1 -1
  68. package/lib/components/Dialog/FormDialog.d.ts.map +1 -1
  69. package/lib/components/Dialog/FormDialog.js +50 -18
  70. package/lib/components/Dialog/FormDialog.js.map +1 -1
  71. package/lib/components/Dialog/InfoDialog.d.ts.map +1 -1
  72. package/lib/components/Dialog/InfoDialog.js +6 -4
  73. package/lib/components/Dialog/InfoDialog.js.map +1 -1
  74. package/lib/components/Dialog/TouchDialog.js +1 -1
  75. package/lib/components/Dialog/TouchDialog.js.map +1 -1
  76. package/lib/components/Dialog/TouchDialog.styles.d.ts.map +1 -1
  77. package/lib/components/Dialog/TouchDialog.styles.js +2 -1
  78. package/lib/components/Dialog/TouchDialog.styles.js.map +1 -1
  79. package/lib/components/InlineEdit/InlineEdit.d.ts +6 -0
  80. package/lib/components/InlineEdit/InlineEdit.d.ts.map +1 -1
  81. package/lib/components/InlineEdit/InlineEdit.js +45 -4
  82. package/lib/components/InlineEdit/InlineEdit.js.map +1 -1
  83. package/lib/components/InlineEdit/InlineEdit.styles.d.ts +19 -3
  84. package/lib/components/InlineEdit/InlineEdit.styles.d.ts.map +1 -1
  85. package/lib/components/InlineEdit/InlineEdit.styles.js +38 -20
  86. package/lib/components/InlineEdit/InlineEdit.styles.js.map +1 -1
  87. package/lib/components/Link/Link.d.ts +7 -2
  88. package/lib/components/Link/Link.d.ts.map +1 -1
  89. package/lib/components/Link/Link.js +45 -20
  90. package/lib/components/Link/Link.js.map +1 -1
  91. package/lib/components/Link/Link.test-ids.d.ts +1 -1
  92. package/lib/components/Link/Link.test-ids.d.ts.map +1 -1
  93. package/lib/components/Link/Link.test-ids.js +2 -1
  94. package/lib/components/Link/Link.test-ids.js.map +1 -1
  95. package/lib/components/ListToolbar/ListToolbar.styles.d.ts +19 -3
  96. package/lib/components/ListToolbar/ListToolbar.styles.d.ts.map +1 -1
  97. package/lib/components/Menu/FlyoutMenuList.d.ts.map +1 -1
  98. package/lib/components/Menu/FlyoutMenuList.js +1 -1
  99. package/lib/components/Menu/FlyoutMenuList.js.map +1 -1
  100. package/lib/components/Menu/Menu.js +2 -1
  101. package/lib/components/Menu/Menu.js.map +1 -1
  102. package/lib/components/MenuButton/MenuButton.d.ts.map +1 -1
  103. package/lib/components/MenuButton/MenuButton.js +5 -1
  104. package/lib/components/MenuButton/MenuButton.js.map +1 -1
  105. package/lib/components/Popover/getResolvedTarget.d.ts +11 -0
  106. package/lib/components/Popover/getResolvedTarget.d.ts.map +1 -0
  107. package/lib/components/Popover/getResolvedTarget.js +13 -0
  108. package/lib/components/Popover/getResolvedTarget.js.map +1 -0
  109. package/lib/components/Popover/index.d.ts +1 -0
  110. package/lib/components/Popover/index.d.ts.map +1 -1
  111. package/lib/components/Popover/index.js +1 -0
  112. package/lib/components/Popover/index.js.map +1 -1
  113. package/lib/components/QRCode/QRCode.d.ts.map +1 -1
  114. package/lib/components/QRCode/QRCode.js +2 -0
  115. package/lib/components/QRCode/QRCode.js.map +1 -1
  116. package/lib/components/Tooltip/Tooltip.d.ts.map +1 -1
  117. package/lib/components/Tooltip/Tooltip.js +8 -2
  118. package/lib/components/Tooltip/Tooltip.js.map +1 -1
  119. package/lib/hooks/useI18n.d.ts +18 -0
  120. package/lib/hooks/useI18n.d.ts.map +1 -1
  121. package/lib/i18n/default.d.ts +18 -0
  122. package/lib/i18n/default.d.ts.map +1 -1
  123. package/lib/i18n/default.js +23 -3
  124. package/lib/i18n/default.js.map +1 -1
  125. package/lib/i18n/i18n.d.ts +18 -0
  126. package/lib/i18n/i18n.d.ts.map +1 -1
  127. package/lib/theme/theme.d.ts +25 -0
  128. package/lib/theme/theme.d.ts.map +1 -1
  129. package/lib/theme/themeDefinition.json +18 -3
  130. package/lib/theme/themeOverrides.schema.json +16 -0
  131. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { forwardRef } from 'react';
2
+ import { forwardRef, useLayoutEffect, useMemo } from 'react';
3
3
  import useTestIds from '../../hooks/useTestIds';
4
4
  import useI18n from '../../hooks/useI18n';
5
5
  import Icon, { registerIcon } from '../Icon';
@@ -9,13 +9,54 @@ import { useConsolidatedRef, useElement } from '../../hooks';
9
9
  import { getInlineEditTestIds } from './InlineEdit.test-ids';
10
10
  import { StyledEditButton, StyledInlineEdit, StyledContent, StyledInlineEditDialog } from './InlineEdit.styles';
11
11
  registerIcon(pencilIcon);
12
- const InlineEdit = forwardRef(function InlineEdit({ children, contextualLabel, editForm, progress, onEdit, onCancel, onSubmit, testId, ...restProps }, refProp) {
12
+ const InlineEdit = forwardRef(function InlineEdit({ children, contextualLabel, editForm, multi = false, progress, onEdit, onCancel, onSubmit, testId, ...restProps }, refProp) {
13
13
  const ref = useConsolidatedRef(refProp);
14
14
  const t = useI18n();
15
15
  const testIds = useTestIds(testId, getInlineEditTestIds);
16
16
  const editLabel = `${t('edit')} - ${contextualLabel}`;
17
- const [editButton, setButtonEl] = useElement();
18
- return (_jsxs(Flex, { "data-testid": testIds.root, ...restProps, container: { inline: true, alignItems: 'start', justify: 'between', gap: 0.5 }, as: StyledInlineEdit, onDoubleClick: onEdit, ref: ref, children: [_jsx(StyledContent, { children: children }), _jsx(StyledEditButton, { "data-testid": testIds.button, ref: setButtonEl, icon: true, compact: true, variant: 'simple', onClick: onEdit, label: t('edit'), "aria-label": editLabel, "aria-haspopup": 'dialog', "aria-hidden": !!editForm && !!editButton ? true : undefined, children: _jsx(Icon, { name: 'pencil' }) }), editForm && editButton && (_jsx(StyledInlineEditDialog, { "data-testid": testIds.dialog, progress: progress, target: editButton, placement: 'bottom-start', "aria-label": editLabel, onCancel: onCancel, onSubmit: onSubmit, children: editForm }))] }));
17
+ const [editButtonEl, setButtonEl] = useElement();
18
+ const [editableContent, setEditableContent] = useElement();
19
+ const virtualTarget = useMemo(() => {
20
+ return {
21
+ get contextElement() {
22
+ return editButtonEl ?? undefined;
23
+ },
24
+ getBoundingClientRect() {
25
+ const rect = editableContent?.getBoundingClientRect();
26
+ const top = rect?.top ?? 0;
27
+ const left = rect?.left ?? 0;
28
+ return {
29
+ width: 0,
30
+ height: 0,
31
+ top,
32
+ bottom: top,
33
+ left,
34
+ right: left,
35
+ x: left,
36
+ y: top,
37
+ toJSON() {
38
+ return this;
39
+ }
40
+ };
41
+ }
42
+ };
43
+ }, [editButtonEl, editableContent]);
44
+ useLayoutEffect(() => {
45
+ if (!ref.current || !editButtonEl)
46
+ return;
47
+ const ctnHeight = ref.current.getBoundingClientRect().height;
48
+ const btnHeight = editButtonEl.getBoundingClientRect().height;
49
+ // If the content is shorter than the button, vertically center the button.
50
+ // Otherwise the button is aligned at the vertical start of the content by default.
51
+ if (ctnHeight < btnHeight) {
52
+ const offset = (btnHeight - ctnHeight) / 2;
53
+ ref.current.style.setProperty('--button-offset', `${offset}px`);
54
+ }
55
+ else {
56
+ ref.current.style.removeProperty('--button-offset');
57
+ }
58
+ }, [children, editButtonEl, editableContent]);
59
+ return (_jsxs(Flex, { "data-testid": testIds.root, ...restProps, container: { inline: true, alignItems: 'start', justify: 'between', gap: 0.5 }, as: StyledInlineEdit, onDoubleClick: onEdit, ref: ref, children: [_jsx(StyledContent, { ref: setEditableContent, children: children }), _jsx(StyledEditButton, { "data-testid": testIds.button, ref: setButtonEl, icon: true, compact: true, variant: 'simple', onClick: onEdit, label: t('edit'), "aria-label": editLabel, "aria-haspopup": 'dialog', "aria-hidden": !!editForm && !!editButtonEl ? true : undefined, children: _jsx(Icon, { name: 'pencil' }) }), editForm && editButtonEl && editableContent && (_jsx(StyledInlineEditDialog, { compact: !multi, arrow: false, "data-testid": testIds.dialog, progress: progress, target: virtualTarget, placement: 'bottom-start', "aria-label": editLabel, onCancel: onCancel, onSubmit: onSubmit, children: editForm }))] }));
19
60
  });
20
61
  export default InlineEdit;
21
62
  //# sourceMappingURL=InlineEdit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InlineEdit.js","sourceRoot":"","sources":["../../../src/components/InlineEdit/InlineEdit.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAInC,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,OAAO,MAAM,qBAAqB,CAAC;AAC1C,OAAO,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,2BAA2B,CAAC;AACxD,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,CAAC,UAAU,CAAC,CAAC;AA0BzB,MAAM,UAAU,GAAqD,UAAU,CAAC,SAAS,UAAU,CACjG,EACE,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,GAAG,SAAS,EACqB,EACnC,OAA+B;IAE/B,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,eAAe,EAAE,CAAC;IACtD,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,UAAU,EAAqB,CAAC;IAElE,OAAO,CACL,MAAC,IAAI,mBACU,OAAO,CAAC,IAAI,KACrB,SAAS,EACb,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,EAC9E,EAAE,EAAE,gBAAgB,EACpB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,GAAG,aAER,KAAC,aAAa,cAAE,QAAQ,GAAiB,EAEzC,KAAC,gBAAgB,mBACF,OAAO,CAAC,MAAM,EAC3B,GAAG,EAAE,WAAW,EAChB,IAAI,QACJ,OAAO,QACP,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,gBACJ,SAAS,mBACP,QAAQ,iBACT,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,YAE1D,KAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG,GACL,EAClB,QAAQ,IAAI,UAAU,IAAI,CACzB,KAAC,sBAAsB,mBACR,OAAO,CAAC,MAAM,EAC3B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAC,cAAc,gBACZ,SAAS,EACrB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,YAEjB,QAAQ,GACc,CAC1B,IACI,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,eAAe,UAAU,CAAC","sourcesContent":["import { forwardRef } from 'react';\nimport type { PropsWithoutRef, ReactNode, Ref } from 'react';\n\nimport type { ForwardRefForwardPropsComponent, TestIdProp, WithAttributes } from '../../types';\nimport useTestIds from '../../hooks/useTestIds';\nimport useI18n from '../../hooks/useI18n';\nimport Icon, { registerIcon } from '../Icon';\nimport * as pencilIcon from '../Icon/icons/pencil.icon';\nimport Flex from '../Flex';\nimport { useConsolidatedRef, useElement } from '../../hooks';\nimport type { FormDialogProps } from '../Dialog';\n\nimport { getInlineEditTestIds } from './InlineEdit.test-ids';\nimport type { elements } from './InlineEdit.test-ids';\nimport {\n StyledEditButton,\n StyledInlineEdit,\n StyledContent,\n StyledInlineEditDialog\n} from './InlineEdit.styles';\n\nregisterIcon(pencilIcon);\n\nexport type InlineEditProps = WithAttributes<\n 'div',\n TestIdProp<typeof elements> &\n Pick<FormDialogProps, 'progress'> & {\n /** Editable content. */\n children: ReactNode;\n /** Accessible label for the editable content. */\n contextualLabel: string;\n /**\n * Form content for updating the editable content rendered within a dialog.\n * Pass this value to show the dialog and conversely set to undefined to hide.\n */\n editForm?: ReactNode;\n /** Called when the edit button is clicked. */\n onEdit: () => void;\n /** Called when the user cancels the edit. */\n onCancel: () => void;\n /** Called when the user confirms the edit. */\n onSubmit: () => void;\n /** Ref forwarded to the wrapping element. */\n ref?: Ref<HTMLDivElement>;\n }\n>;\n\nconst InlineEdit: ForwardRefForwardPropsComponent<InlineEditProps> = forwardRef(function InlineEdit(\n {\n children,\n contextualLabel,\n editForm,\n progress,\n onEdit,\n onCancel,\n onSubmit,\n testId,\n ...restProps\n }: PropsWithoutRef<InlineEditProps>,\n refProp: InlineEditProps['ref']\n) {\n const ref = useConsolidatedRef(refProp);\n const t = useI18n();\n const testIds = useTestIds(testId, getInlineEditTestIds);\n const editLabel = `${t('edit')} - ${contextualLabel}`;\n const [editButton, setButtonEl] = useElement<HTMLButtonElement>();\n\n return (\n <Flex\n data-testid={testIds.root}\n {...restProps}\n container={{ inline: true, alignItems: 'start', justify: 'between', gap: 0.5 }}\n as={StyledInlineEdit}\n onDoubleClick={onEdit}\n ref={ref}\n >\n <StyledContent>{children}</StyledContent>\n\n <StyledEditButton\n data-testid={testIds.button}\n ref={setButtonEl}\n icon\n compact\n variant='simple'\n onClick={onEdit}\n label={t('edit')}\n aria-label={editLabel}\n aria-haspopup='dialog'\n aria-hidden={!!editForm && !!editButton ? true : undefined}\n >\n <Icon name='pencil' />\n </StyledEditButton>\n {editForm && editButton && (\n <StyledInlineEditDialog\n data-testid={testIds.dialog}\n progress={progress}\n target={editButton}\n placement='bottom-start'\n aria-label={editLabel}\n onCancel={onCancel}\n onSubmit={onSubmit}\n >\n {editForm}\n </StyledInlineEditDialog>\n )}\n </Flex>\n );\n});\n\nexport default InlineEdit;\n"]}
1
+ {"version":3,"file":"InlineEdit.js","sourceRoot":"","sources":["../../../src/components/InlineEdit/InlineEdit.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useLayoutEffect, useMemo } from 'react';\nimport type { PropsWithoutRef, ReactNode, Ref } from 'react';\nimport type { VirtualElement } from '@popperjs/core';\n\nimport type { ForwardRefForwardPropsComponent, TestIdProp, WithAttributes } from '../../types';\nimport useTestIds from '../../hooks/useTestIds';\nimport useI18n from '../../hooks/useI18n';\nimport Icon, { registerIcon } from '../Icon';\nimport * as pencilIcon from '../Icon/icons/pencil.icon';\nimport Flex from '../Flex';\nimport { useConsolidatedRef, useElement } from '../../hooks';\nimport type { FormDialogProps } from '../Dialog';\n\nimport { getInlineEditTestIds } from './InlineEdit.test-ids';\nimport type { elements } from './InlineEdit.test-ids';\nimport {\n StyledEditButton,\n StyledInlineEdit,\n StyledContent,\n StyledInlineEditDialog\n} from './InlineEdit.styles';\n\nregisterIcon(pencilIcon);\n\nexport type InlineEditProps = WithAttributes<\n 'div',\n TestIdProp<typeof elements> &\n Pick<FormDialogProps, 'progress'> & {\n /** Editable content. */\n children: ReactNode;\n /** Accessible label for the editable content. */\n contextualLabel: string;\n /**\n * Form content for updating the editable content rendered within a dialog.\n * Pass this value to show the dialog and conversely set to undefined to hide.\n */\n editForm?: ReactNode;\n /**\n * Use when the edit form contains multiple input fields.\n * Renders form actions at end of edit dialog.\n * @default false\n */\n multi?: boolean;\n /** Called when the edit button is clicked. */\n onEdit: () => void;\n /** Called when the user cancels the edit. */\n onCancel: () => void;\n /** Called when the user confirms the edit. */\n onSubmit: () => void;\n /** Ref forwarded to the wrapping element. */\n ref?: Ref<HTMLDivElement>;\n }\n>;\n\nconst InlineEdit: ForwardRefForwardPropsComponent<InlineEditProps> = forwardRef(function InlineEdit(\n {\n children,\n contextualLabel,\n editForm,\n multi = false,\n progress,\n onEdit,\n onCancel,\n onSubmit,\n testId,\n ...restProps\n }: PropsWithoutRef<InlineEditProps>,\n refProp: InlineEditProps['ref']\n) {\n const ref = useConsolidatedRef(refProp);\n const t = useI18n();\n const testIds = useTestIds(testId, getInlineEditTestIds);\n const editLabel = `${t('edit')} - ${contextualLabel}`;\n const [editButtonEl, setButtonEl] = useElement<HTMLButtonElement>();\n const [editableContent, setEditableContent] = useElement<HTMLDivElement>();\n\n const virtualTarget: VirtualElement = useMemo(() => {\n return {\n get contextElement() {\n return editButtonEl ?? undefined;\n },\n getBoundingClientRect() {\n const rect = editableContent?.getBoundingClientRect();\n const top = rect?.top ?? 0;\n const left = rect?.left ?? 0;\n\n return {\n width: 0,\n height: 0,\n top,\n bottom: top,\n left,\n right: left,\n x: left,\n y: top,\n toJSON() {\n return this;\n }\n };\n }\n };\n }, [editButtonEl, editableContent]);\n\n useLayoutEffect(() => {\n if (!ref.current || !editButtonEl) return;\n\n const ctnHeight = ref.current.getBoundingClientRect().height;\n const btnHeight = editButtonEl.getBoundingClientRect().height;\n\n // If the content is shorter than the button, vertically center the button.\n // Otherwise the button is aligned at the vertical start of the content by default.\n if (ctnHeight < btnHeight) {\n const offset = (btnHeight - ctnHeight) / 2;\n ref.current.style.setProperty('--button-offset', `${offset}px`);\n } else {\n ref.current.style.removeProperty('--button-offset');\n }\n }, [children, editButtonEl, editableContent]);\n\n return (\n <Flex\n data-testid={testIds.root}\n {...restProps}\n container={{ inline: true, alignItems: 'start', justify: 'between', gap: 0.5 }}\n as={StyledInlineEdit}\n onDoubleClick={onEdit}\n ref={ref}\n >\n <StyledContent ref={setEditableContent}>{children}</StyledContent>\n\n <StyledEditButton\n data-testid={testIds.button}\n ref={setButtonEl}\n icon\n compact\n variant='simple'\n onClick={onEdit}\n label={t('edit')}\n aria-label={editLabel}\n aria-haspopup='dialog'\n aria-hidden={!!editForm && !!editButtonEl ? true : undefined}\n >\n <Icon name='pencil' />\n </StyledEditButton>\n {editForm && editButtonEl && editableContent && (\n <StyledInlineEditDialog\n compact={!multi}\n arrow={false}\n data-testid={testIds.dialog}\n progress={progress}\n target={virtualTarget}\n placement='bottom-start'\n aria-label={editLabel}\n onCancel={onCancel}\n onSubmit={onSubmit}\n >\n {editForm}\n </StyledInlineEditDialog>\n )}\n </Flex>\n );\n});\n\nexport default InlineEdit;\n"]}
@@ -6,21 +6,37 @@ export declare const StyledInlineEditDialog: import("styled-components/dist/type
6
6
  onDismiss?: () => void;
7
7
  onCancel: import("../Dialog/Dialog.types").FormAction;
8
8
  onSubmit: import("../Dialog/Dialog.types").FormAction;
9
+ } & {
10
+ compact: true;
11
+ } & {
12
+ 'aria-label': string;
13
+ heading?: never;
14
+ additionalInfo?: never;
15
+ } & Omit<import("../..").Attributes<"div">, "compact" | "aria-label" | "onSubmit" | "onCancel" | "heading" | "onDismiss" | keyof import("../Dialog/Dialog.types").BaseDialogProps | "additionalInfo">, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
16
+ ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
17
+ }) | (Omit<Omit<import("../Dialog/Dialog.types").BaseDialogProps & {
18
+ onDismiss?: () => void;
19
+ onCancel: import("../Dialog/Dialog.types").FormAction;
20
+ onSubmit: import("../Dialog/Dialog.types").FormAction;
21
+ } & {
22
+ compact?: false | undefined;
9
23
  } & {
10
24
  heading: string;
11
25
  additionalInfo?: import("../AdditionalInfo").AdditionalInfoProps;
12
26
  'aria-label'?: never;
13
- } & Omit<import("../..").Attributes<"div">, "aria-label" | "onSubmit" | "onCancel" | "heading" | "onDismiss" | keyof import("../Dialog/Dialog.types").BaseDialogProps | "additionalInfo">, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
27
+ } & Omit<import("../..").Attributes<"div">, "compact" | "aria-label" | "onSubmit" | "onCancel" | "heading" | "onDismiss" | keyof import("../Dialog/Dialog.types").BaseDialogProps | "additionalInfo">, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
14
28
  ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
15
29
  }) | (Omit<Omit<import("../Dialog/Dialog.types").BaseDialogProps & {
16
30
  onDismiss?: () => void;
17
31
  onCancel: import("../Dialog/Dialog.types").FormAction;
18
32
  onSubmit: import("../Dialog/Dialog.types").FormAction;
19
33
  } & {
20
- heading?: never;
34
+ compact?: false | undefined;
35
+ } & {
21
36
  'aria-label': string;
37
+ heading?: never;
22
38
  additionalInfo?: never;
23
- } & Omit<import("../..").Attributes<"div">, "aria-label" | "onSubmit" | "onCancel" | "heading" | "onDismiss" | keyof import("../Dialog/Dialog.types").BaseDialogProps | "additionalInfo">, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
39
+ } & Omit<import("../..").Attributes<"div">, "compact" | "aria-label" | "onSubmit" | "onCancel" | "heading" | "onDismiss" | keyof import("../Dialog/Dialog.types").BaseDialogProps | "additionalInfo">, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
24
40
  ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
25
41
  }), import("styled-components/dist/types").BaseObject>> & string & Omit<import("react").ForwardRefExoticComponent<import("react").PropsWithoutRef<import("../Dialog").FormDialogProps> & import("react").RefAttributes<HTMLDivElement>>, keyof import("react").Component<any, {}, any>>;
26
42
  export declare const StyledInlineEdit: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
@@ -1 +1 @@
1
- {"version":3,"file":"InlineEdit.styles.d.ts","sourceRoot":"","sources":["../../../src/components/InlineEdit/InlineEdit.styles.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,aAAa,6NAEzB,CAAC;AAIF,eAAO,MAAM,gBAAgB;;2JAG5B,CAAC;AAIF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;uRAOjC,CAAC;AAIH,eAAO,MAAM,gBAAgB,6NAwB3B,CAAC"}
1
+ {"version":3,"file":"InlineEdit.styles.d.ts","sourceRoot":"","sources":["../../../src/components/InlineEdit/InlineEdit.styles.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,6NAEzB,CAAC;AAIF,eAAO,MAAM,gBAAgB;;2JAS3B,CAAC;AAIH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uRAQjC,CAAC;AAIH,eAAO,MAAM,gBAAgB,6NAmC3B,CAAC"}
@@ -1,47 +1,65 @@
1
1
  import styled, { css } from 'styled-components';
2
- import { mix } from 'polished';
3
2
  import { defaultThemeProp } from '../../theme';
4
3
  import Button from '../Button';
5
4
  import { FormDialog } from '../Dialog';
6
- import { StyledDialogContent } from '../Dialog/Dialog.styles';
7
- import { tryCatch } from '../../utils';
5
+ import { animations } from '../../styles';
8
6
  export const StyledContent = styled.div `
9
- margin-block-start: 0.25rem;
7
+ padding-inline-end: var(--inline-end-offset);
10
8
  `;
11
9
  StyledContent.defaultProps = defaultThemeProp;
12
- export const StyledEditButton = styled(Button) `
13
- opacity: 0;
14
- pointer-events: none;
15
- `;
10
+ export const StyledEditButton = styled(Button)(() => {
11
+ return css `
12
+ opacity: 0;
13
+ pointer-events: none;
14
+ position: absolute;
15
+ /* stylelint-disable-next-line unit-allowed-list */
16
+ inset-block-start: calc(var(--button-offset, 0px) * -1);
17
+ inset-inline-end: 0;
18
+ `;
19
+ });
16
20
  StyledEditButton.defaultProps = defaultThemeProp;
17
- export const StyledInlineEditDialog = styled(FormDialog)(({ theme }) => {
21
+ export const StyledInlineEditDialog = styled(FormDialog)(() => {
18
22
  return css `
19
- & > ${StyledDialogContent} {
20
- min-height: unset;
21
- padding-block-start: ${theme.base.spacing};
23
+ &[data-popper-placement] {
24
+ --scale-in-size: 0.9;
25
+ transform-origin: 0 0;
26
+ animation-name: ${animations.reveal}, ${animations.scaleIn};
22
27
  }
23
28
  `;
24
29
  });
25
30
  StyledInlineEditDialog.defaultProps = defaultThemeProp;
26
31
  export const StyledInlineEdit = styled.div(({ theme }) => {
27
- const hoverColor = tryCatch(() => mix(0.95, theme.base.palette['primary-background'], theme.base.palette.interactive));
32
+ // FIXME: Stylelint...
33
+ const br = `calc(${theme.base['border-radius']} * ${theme.components['form-control']['border-radius']})`;
28
34
  return css `
35
+ --inline-end-offset: calc(${theme.base['hit-area'].compact} + ${theme.base.spacing});
36
+ position: relative;
29
37
  width: 100%;
30
- border: solid 0.0625rem transparent;
31
- margin-block-start: -0.25rem;
32
38
 
33
- &:hover,
34
- &:has(${StyledEditButton}:focus) {
35
- background: ${hoverColor};
39
+ &::before {
40
+ display: none;
41
+ content: '';
42
+ position: absolute;
43
+ border: 0.125rem solid rgb(from currentColor r g b / 0.5);
44
+ inset-inline: calc(-0.5 * ${theme.base.spacing})
45
+ calc(var(--inline-end-offset) - ${theme.base.spacing} / 2);
46
+ inset-block: calc(-0.25 * ${theme.base.spacing});
47
+ border-radius: ${br};
48
+ }
36
49
 
50
+ &:hover,
51
+ &:has(:focus-within) {
37
52
  ${StyledEditButton}:not([aria-hidden]) {
38
53
  opacity: 1;
39
54
  pointer-events: auto;
40
55
  }
41
56
  }
42
57
 
43
- &:has(${StyledEditButton}[aria-hidden]) {
44
- background: ${hoverColor};
58
+ &:has(${StyledEditButton}:is(:hover, :focus)) {
59
+ &::before {
60
+ z-index: 0;
61
+ display: block;
62
+ }
45
63
  }
46
64
  `;
47
65
  });
@@ -1 +1 @@
1
- {"version":3,"file":"InlineEdit.styles.js","sourceRoot":"","sources":["../../../src/components/InlineEdit/InlineEdit.styles.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA;;CAEtC,CAAC;AAEF,aAAa,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;;;CAG7C,CAAC;AAEF,gBAAgB,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACrE,OAAO,GAAG,CAAA;UACF,mBAAmB;;6BAEA,KAAK,CAAC,IAAI,CAAC,OAAO;;GAE5C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,sBAAsB,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAEvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC/B,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CACpF,CAAC;IAEF,OAAO,GAAG,CAAA;;;;;;YAMA,gBAAgB;oBACR,UAAU;;QAEtB,gBAAgB;;;;;;YAMZ,gBAAgB;oBACR,UAAU;;GAE3B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,YAAY,GAAG,gBAAgB,CAAC","sourcesContent":["import styled, { css } from 'styled-components';\nimport { mix } from 'polished';\n\nimport { defaultThemeProp } from '../../theme';\nimport Button from '../Button';\nimport { FormDialog } from '../Dialog';\nimport { StyledDialogContent } from '../Dialog/Dialog.styles';\nimport { tryCatch } from '../../utils';\n\nexport const StyledContent = styled.div`\n margin-block-start: 0.25rem;\n`;\n\nStyledContent.defaultProps = defaultThemeProp;\n\nexport const StyledEditButton = styled(Button)`\n opacity: 0;\n pointer-events: none;\n`;\n\nStyledEditButton.defaultProps = defaultThemeProp;\n\nexport const StyledInlineEditDialog = styled(FormDialog)(({ theme }) => {\n return css`\n & > ${StyledDialogContent} {\n min-height: unset;\n padding-block-start: ${theme.base.spacing};\n }\n `;\n});\n\nStyledInlineEditDialog.defaultProps = defaultThemeProp;\n\nexport const StyledInlineEdit = styled.div(({ theme }) => {\n const hoverColor = tryCatch(() =>\n mix(0.95, theme.base.palette['primary-background'], theme.base.palette.interactive)\n );\n\n return css`\n width: 100%;\n border: solid 0.0625rem transparent;\n margin-block-start: -0.25rem;\n\n &:hover,\n &:has(${StyledEditButton}:focus) {\n background: ${hoverColor};\n\n ${StyledEditButton}:not([aria-hidden]) {\n opacity: 1;\n pointer-events: auto;\n }\n }\n\n &:has(${StyledEditButton}[aria-hidden]) {\n background: ${hoverColor};\n }\n `;\n});\n\nStyledInlineEdit.defaultProps = defaultThemeProp;\n"]}
1
+ {"version":3,"file":"InlineEdit.styles.js","sourceRoot":"","sources":["../../../src/components/InlineEdit/InlineEdit.styles.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA;;CAEtC,CAAC;AAEF,aAAa,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE;IAClD,OAAO,GAAG,CAAA;;;;;;;GAOT,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE;IAC5D,OAAO,GAAG,CAAA;;;;wBAIY,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO;;GAE7D,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,sBAAsB,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAEvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACvD,sBAAsB;IACtB,MAAM,EAAE,GAAG,QAAQ,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;IAEzG,OAAO,GAAG,CAAA;gCACoB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO;;;;;;;;;kCASpD,KAAK,CAAC,IAAI,CAAC,OAAO;0CACV,KAAK,CAAC,IAAI,CAAC,OAAO;kCAC1B,KAAK,CAAC,IAAI,CAAC,OAAO;uBAC7B,EAAE;;;;;QAKjB,gBAAgB;;;;;;YAMZ,gBAAgB;;;;;;GAMzB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,YAAY,GAAG,gBAAgB,CAAC","sourcesContent":["import styled, { css } from 'styled-components';\n\nimport { defaultThemeProp } from '../../theme';\nimport Button from '../Button';\nimport { FormDialog } from '../Dialog';\nimport { animations } from '../../styles';\n\nexport const StyledContent = styled.div`\n padding-inline-end: var(--inline-end-offset);\n`;\n\nStyledContent.defaultProps = defaultThemeProp;\n\nexport const StyledEditButton = styled(Button)(() => {\n return css`\n opacity: 0;\n pointer-events: none;\n position: absolute;\n /* stylelint-disable-next-line unit-allowed-list */\n inset-block-start: calc(var(--button-offset, 0px) * -1);\n inset-inline-end: 0;\n `;\n});\n\nStyledEditButton.defaultProps = defaultThemeProp;\n\nexport const StyledInlineEditDialog = styled(FormDialog)(() => {\n return css`\n &[data-popper-placement] {\n --scale-in-size: 0.9;\n transform-origin: 0 0;\n animation-name: ${animations.reveal}, ${animations.scaleIn};\n }\n `;\n});\n\nStyledInlineEditDialog.defaultProps = defaultThemeProp;\n\nexport const StyledInlineEdit = styled.div(({ theme }) => {\n // FIXME: Stylelint...\n const br = `calc(${theme.base['border-radius']} * ${theme.components['form-control']['border-radius']})`;\n\n return css`\n --inline-end-offset: calc(${theme.base['hit-area'].compact} + ${theme.base.spacing});\n position: relative;\n width: 100%;\n\n &::before {\n display: none;\n content: '';\n position: absolute;\n border: 0.125rem solid rgb(from currentColor r g b / 0.5);\n inset-inline: calc(-0.5 * ${theme.base.spacing})\n calc(var(--inline-end-offset) - ${theme.base.spacing} / 2);\n inset-block: calc(-0.25 * ${theme.base.spacing});\n border-radius: ${br};\n }\n\n &:hover,\n &:has(:focus-within) {\n ${StyledEditButton}:not([aria-hidden]) {\n opacity: 1;\n pointer-events: auto;\n }\n }\n\n &:has(${StyledEditButton}:is(:hover, :focus)) {\n &::before {\n z-index: 0;\n display: block;\n }\n }\n `;\n});\n\nStyledInlineEdit.defaultProps = defaultThemeProp;\n"]}
@@ -30,7 +30,12 @@ export type LinkProps = WithAttributes<'a', BaseProps & TestIdProp & AsProp & {
30
30
  /** Optional link behavior. When omitted, legacy Link behavior is preserved. */
31
31
  linkBehavior?: LinkBehavior;
32
32
  }>;
33
- type LinkBehavior = 'preview' | 'open' | 'openInTab';
33
+ declare const LINK_BEHAVIOR: {
34
+ readonly PREVIEW: "preview";
35
+ readonly OPEN: "open";
36
+ readonly OPEN_IN_TAB: "openInTab";
37
+ };
38
+ type LinkBehavior = (typeof LINK_BEHAVIOR)[keyof typeof LINK_BEHAVIOR];
34
39
  export declare const StyledLinkPopover: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
35
40
  preview: boolean;
36
41
  }>> & string;
@@ -45,7 +50,7 @@ export declare const StyledLink: import("styled-components/dist/types").IStyledC
45
50
  ref?: ((instance: HTMLAnchorElement | HTMLButtonElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLAnchorElement | HTMLButtonElement> | null | undefined;
46
51
  }, never>> & string & Omit<import("../..").ForwardRefForwardPropsComponent<ButtonProps>, keyof import("react").Component<any, {}, any>>;
47
52
  declare const _default: import("react").ForwardRefExoticComponent<Omit<LinkProps, "ref"> & import("react").RefAttributes<HTMLAnchorElement>> & {
48
- getTestIds: (testIdProp?: TestIdProp["testId"]) => import("../..").TestIdsRecord<readonly ["preview-popover", "preview", "new-tab"]>;
53
+ getTestIds: (testIdProp?: TestIdProp["testId"]) => import("../..").TestIdsRecord<readonly ["preview-popover", "preview", "new-tab", "open"]>;
49
54
  };
50
55
  export default _default;
51
56
  //# sourceMappingURL=Link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../../src/components/Link/Link.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAc,MAAM,EAAE,MAAM,aAAa,CAAC;AAyB7F,MAAM,MAAM,SAAS,GAAG,cAAc,CACpC,GAAG,EACH,SAAS,GACP,UAAU,GACV,MAAM,GAAG;IACP,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iFAAiF;IACjF,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CACJ,CAAC;AAEF,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAYrD,eAAO,MAAM,iBAAiB;aAAyB,OAAO;YAY7D,CAAC;AAIF,eAAO,MAAM,oBAAoB;;0KA0C/B,CAAC;AAIH,eAAO,MAAM,4BAA4B,6NAAe,CAAC;AAEzD,eAAO,MAAM,2BAA2B;;2BA2CtC,CAAC;AAIH,eAAO,MAAM,UAAU;;uIAQtB,CAAC;;;;AAwXF,wBAAiD"}
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../../src/components/Link/Link.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAc,MAAM,EAAE,MAAM,aAAa,CAAC;AAyB7F,MAAM,MAAM,SAAS,GAAG,cAAc,CACpC,GAAG,EACH,SAAS,GACP,UAAU,GACV,MAAM,GAAG;IACP,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iFAAiF;IACjF,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CACJ,CAAC;AAEF,QAAA,MAAM,aAAa;;;;CAIT,CAAC;AAEX,KAAK,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAYvE,eAAO,MAAM,iBAAiB;aAAyB,OAAO;YAY7D,CAAC;AAIF,eAAO,MAAM,oBAAoB;;0KA0C/B,CAAC;AAIH,eAAO,MAAM,4BAA4B,6NAAe,CAAC;AAEzD,eAAO,MAAM,2BAA2B;;2BA2CtC,CAAC;AAIH,eAAO,MAAM,UAAU;;uIAQtB,CAAC;;;;AA+ZF,wBAAiD"}
@@ -6,7 +6,7 @@ import Popover from '../Popover';
6
6
  import BareButton from '../Button/BareButton';
7
7
  import { defaultThemeProp } from '../../theme';
8
8
  import { useBreakpoint, useConsolidatedRef, useI18n, usePreviewContext, useUID, useModalContext, useOS, useTestIds } from '../../hooks';
9
- import { isCrossOrigin, tryCatch, withTestIds, disallowedURI } from '../../utils';
9
+ import { isCrossOrigin, tryCatch, withTestIds, disallowedURI, handleLinkClick } from '../../utils';
10
10
  import { calculateFontSize, readableColor } from '../../styles';
11
11
  import { Keyboard } from '../Badges';
12
12
  import { StyledKeyboard } from '../Badges/Keyboard';
@@ -17,7 +17,12 @@ import VisuallyHiddenText from '../VisuallyHiddenText';
17
17
  import HiddenText from '../HiddenText';
18
18
  import { useFullscreenContext } from '../Fullscreen';
19
19
  import { getLinkTestIds } from './Link.test-ids';
20
- const LINK_BEHAVIORS = ['preview', 'open', 'openInTab'];
20
+ const LINK_BEHAVIOR = {
21
+ PREVIEW: 'preview',
22
+ OPEN: 'open',
23
+ OPEN_IN_TAB: 'openInTab'
24
+ };
25
+ const LINK_BEHAVIORS = Object.values(LINK_BEHAVIOR);
21
26
  function isLinkBehavior(behavior) {
22
27
  return typeof behavior === 'string' && LINK_BEHAVIORS.some(item => item === behavior);
23
28
  }
@@ -148,6 +153,7 @@ const Link = forwardRef(function Link({ testId, href: hrefProp, variant = 'link'
148
153
  const [popoverHideDelay, setPopoverHideDelay] = useState('short');
149
154
  const [previewPopover, setPreviewPopover] = useState(false);
150
155
  const previewBtnRef = useRef(null);
156
+ const openBtnRef = useRef(null);
151
157
  const isSmallOrAbove = useBreakpoint('sm');
152
158
  const t = useI18n();
153
159
  const { macintosh } = useOS();
@@ -170,21 +176,36 @@ const Link = forwardRef(function Link({ testId, href: hrefProp, variant = 'link'
170
176
  x: virtualElementCoordsRef.current.x,
171
177
  y: virtualElementCoordsRef.current.y,
172
178
  toJSON() {
173
- return JSON.stringify(this);
179
+ return this;
174
180
  }
175
181
  };
176
182
  }
177
183
  });
178
184
  const previewable = showPreviewOpenInTabPopoverProp && !inModal && !inFullscreen;
179
- const normalizedLinkBehavior = isLinkBehavior(linkBehavior) ? linkBehavior : undefined;
185
+ let normalizedLinkBehavior = isLinkBehavior(linkBehavior) ? linkBehavior : undefined;
186
+ if (normalizedLinkBehavior === LINK_BEHAVIOR.PREVIEW && (inModal || inFullscreen)) {
187
+ // preview is hidden from users in fullscreen or modal contexts, so fallback to open
188
+ normalizedLinkBehavior = LINK_BEHAVIOR.OPEN;
189
+ }
180
190
  const hasLinkBehavior = normalizedLinkBehavior !== undefined;
181
- const target = (hasLinkBehavior && normalizedLinkBehavior === 'openInTab') || isCrossOrigin(href ?? '')
191
+ const target = (hasLinkBehavior && normalizedLinkBehavior === LINK_BEHAVIOR.OPEN_IN_TAB) ||
192
+ isCrossOrigin(href ?? '')
182
193
  ? '_blank'
183
194
  : targetProp;
184
- const defaultPreviewAlternates = ['preview', 'openInTab'];
195
+ const defaultPreviewAlternates = [
196
+ LINK_BEHAVIOR.PREVIEW,
197
+ LINK_BEHAVIOR.OPEN_IN_TAB
198
+ ];
185
199
  const previewActions = hasLinkBehavior && normalizedLinkBehavior
186
200
  ? getAlternateLinkBehaviors(normalizedLinkBehavior)
187
201
  : defaultPreviewAlternates;
202
+ const hasOpenAlternateAction = previewActions.some(behavior => behavior === LINK_BEHAVIOR.OPEN);
203
+ const ariaDescribedBy = [
204
+ previewable ? `${uid}-preview-instructions` : undefined,
205
+ previewable && isSmallOrAbove && hasOpenAlternateAction ? `${uid}-open-instructions` : undefined
206
+ ]
207
+ .filter(Boolean)
208
+ .join(' ');
188
209
  const showPopover = () => {
189
210
  if (isSmallOrAbove && !previewPopover) {
190
211
  setPopover(true);
@@ -211,35 +232,40 @@ const Link = forwardRef(function Link({ testId, href: hrefProp, variant = 'link'
211
232
  }
212
233
  };
213
234
  const getActionLabel = (behavior) => {
214
- if (behavior === 'preview') {
235
+ if (behavior === LINK_BEHAVIOR.PREVIEW) {
215
236
  return t('preview');
216
237
  }
217
- if (behavior === 'openInTab') {
238
+ if (behavior === LINK_BEHAVIOR.OPEN_IN_TAB) {
218
239
  return t('link_open_in_tab_text');
219
240
  }
220
241
  return t('link_open_text');
221
242
  };
222
243
  const renderPreviewPopoverAction = (behavior) => {
223
- if (behavior === 'preview') {
244
+ if (behavior === LINK_BEHAVIOR.PREVIEW) {
224
245
  return (_jsx(StyledLinkPreviewPopoverBtn, { "data-testid": testIds.preview, preview: true, type: 'button', ref: previewBtnRef, onClick: onPreviewClick, tabIndex: '-1', children: _jsxs(StyledLinkPreviewPopoverText, { children: [_jsx("span", { children: getActionLabel(behavior) }), _jsxs(Flex, { container: { inline: true, justify: 'end' }, children: [_jsx(Keyboard, { keyName: 'Alt' }), _jsx(Keyboard, { keyName: 'P' })] })] }) }));
225
246
  }
226
- if (behavior === 'openInTab') {
247
+ if (behavior === LINK_BEHAVIOR.OPEN_IN_TAB) {
227
248
  return (_jsx(StyledLinkPreviewPopoverBtn, { "data-testid": testIds.newTab, forwardedAs: 'a', href: href, target: '_blank', rel: 'noreferrer', tabIndex: '-1', children: _jsxs(StyledLinkPreviewPopoverText, { children: [_jsx("span", { children: getActionLabel(behavior) }), _jsxs(Flex, { container: { inline: true, justify: 'end' }, children: [_jsx(Keyboard, { keyName: 'CommandOrControl' }), _jsx(Keyboard, { keyName: 'Enter' })] })] }) }));
228
249
  }
229
- return (_jsx(StyledLinkPreviewPopoverBtn, { "data-testid": testIds.root, forwardedAs: 'a', href: href, tabIndex: '-1', children: _jsx(StyledLinkPreviewPopoverText, { children: _jsx("span", { children: getActionLabel(behavior) }) }) }));
250
+ return (_jsx(StyledLinkPreviewPopoverBtn, { "data-testid": testIds.open, forwardedAs: 'a', href: href, tabIndex: '-1', onClick: onClickProp, ref: openBtnRef, children: _jsxs(StyledLinkPreviewPopoverText, { children: [_jsx("span", { children: getActionLabel(behavior) }), _jsxs(Flex, { container: { inline: true, justify: 'end' }, children: [_jsx(Keyboard, { keyName: 'Alt' }), _jsx(Keyboard, { keyName: 'O' })] })] }) }));
230
251
  };
231
252
  const renderHoverPopoverAction = (behavior) => {
232
- if (behavior === 'preview') {
253
+ if (behavior === LINK_BEHAVIOR.PREVIEW) {
233
254
  return (_jsx(StyledLinkPopoverBtn, { "data-testid": testIds.preview, preview: true, type: 'button', ref: previewBtnRef, onClick: onPreviewClick, tabIndex: '-1', children: getActionLabel(behavior) }));
234
255
  }
235
- if (behavior === 'openInTab') {
256
+ if (behavior === LINK_BEHAVIOR.OPEN_IN_TAB) {
236
257
  return (_jsx(StyledLinkPopoverBtn, { "data-testid": testIds.newTab, forwardedAs: 'a', href: href, target: '_blank', rel: 'noreferrer', tabIndex: '-1', children: getActionLabel(behavior) }));
237
258
  }
238
- return (_jsx(StyledLinkPopoverBtn, { "data-testid": testIds.root, forwardedAs: 'a', href: href, tabIndex: '-1', children: getActionLabel(behavior) }));
259
+ return (_jsx(StyledLinkPopoverBtn, { "data-testid": testIds.open, forwardedAs: 'a', href: href, tabIndex: '-1', onClick: onClickProp, children: getActionLabel(behavior) }));
239
260
  };
240
261
  const onKeyUp = (e) => {
241
262
  if (e.getModifierState('Alt') && e.code === 'KeyP') {
242
263
  onPreviewClick();
264
+ return;
265
+ }
266
+ // Alt/Option+O opens only when Open is an alternate action and popover is visible.
267
+ if (hasOpenAlternateAction && e.getModifierState('Alt') && e.code === 'KeyO') {
268
+ openBtnRef.current?.click();
243
269
  }
244
270
  };
245
271
  useEffect(() => {
@@ -260,7 +286,7 @@ const Link = forwardRef(function Link({ testId, href: hrefProp, variant = 'link'
260
286
  document.removeEventListener('keydown', onKeyDown);
261
287
  };
262
288
  }, [popover, previewPopover]);
263
- return (_jsxs(_Fragment, { children: [_jsxs(StyledLink, { "data-testid": testIds.root, href: href, variant: variant, ref: linkRef, target: target, ...restProps, "aria-describedby": previewable ? `${uid}-preview-instructions` : undefined, onMouseEnter: showPreviewOpenInTabPopoverProp
289
+ return (_jsxs(_Fragment, { children: [_jsxs(StyledLink, { "data-testid": testIds.root, href: href, variant: variant, ref: linkRef, target: target, ...restProps, "aria-describedby": ariaDescribedBy || undefined, onMouseEnter: showPreviewOpenInTabPopoverProp
264
290
  ? (e) => {
265
291
  mousePositionRef.current = { x: e.clientX, y: e.clientY };
266
292
  showPopover();
@@ -277,9 +303,8 @@ const Link = forwardRef(function Link({ testId, href: hrefProp, variant = 'link'
277
303
  hidePreviewPopover();
278
304
  hidePopover();
279
305
  }, onClick: (e) => {
280
- if (hasLinkBehavior && normalizedLinkBehavior === 'preview') {
281
- e.preventDefault();
282
- onPreviewClick();
306
+ if (hasLinkBehavior && normalizedLinkBehavior === LINK_BEHAVIOR.PREVIEW) {
307
+ handleLinkClick(onPreviewClick)(e);
283
308
  return;
284
309
  }
285
310
  onClickProp?.(e);
@@ -302,10 +327,10 @@ const Link = forwardRef(function Link({ testId, href: hrefProp, variant = 'link'
302
327
  };
303
328
  }
304
329
  }, children: previewActions
305
- .filter(behavior => behavior !== 'preview' || previewable)
330
+ .filter(behavior => behavior !== LINK_BEHAVIOR.PREVIEW || previewable)
306
331
  .map(behavior => {
307
332
  return (_jsx(Fragment, { children: renderHoverPopoverAction(behavior) }, `hover-action-${behavior}`));
308
- }) }), previewable && (_jsx(HiddenText, { id: `${uid}-preview-instructions`, children: t('preview_link_instruction', [macintosh ? 'option' : 'alt']) }))] }));
333
+ }) }), previewable && (_jsx(HiddenText, { id: `${uid}-preview-instructions`, children: t('preview_link_instruction', [macintosh ? 'option' : 'alt']) })), previewable && isSmallOrAbove && hasOpenAlternateAction && (_jsx(HiddenText, { id: `${uid}-open-instructions`, children: t('open_link_instruction', [macintosh ? 'option' : 'alt']) }))] }));
309
334
  });
310
335
  export default withTestIds(Link, getLinkTestIds);
311
336
  //# sourceMappingURL=Link.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Link.js","sourceRoot":"","sources":["../../../src/components/Link/Link.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useState, useRef, useEffect, Fragment } from 'react';\nimport type {\n MouseEvent as ReactMouseEvent,\n PropsWithoutRef,\n KeyboardEvent as ReactKeyboardEvent\n} from 'react';\nimport styled, { css } from 'styled-components';\nimport type { VirtualElement } from '@popperjs/core';\n\nimport Button from '../Button';\nimport type { ButtonProps } from '../Button';\nimport Popover from '../Popover';\nimport type { PopoverProps } from '../Popover';\nimport BareButton from '../Button/BareButton';\nimport type { WithAttributes, BaseProps, TestIdProp, RefElement, AsProp } from '../../types';\nimport { defaultThemeProp } from '../../theme';\nimport {\n useBreakpoint,\n useConsolidatedRef,\n useI18n,\n usePreviewContext,\n useUID,\n useModalContext,\n useOS,\n useTestIds\n} from '../../hooks';\nimport { isCrossOrigin, tryCatch, withTestIds, disallowedURI } from '../../utils';\nimport { calculateFontSize, readableColor } from '../../styles';\nimport { Keyboard } from '../Badges';\nimport { StyledKeyboard } from '../Badges/Keyboard';\nimport Flex from '../Flex';\nimport Icon, { StyledIcon, registerIcon } from '../Icon';\nimport * as openIcon from '../Icon/icons/open.icon';\nimport VisuallyHiddenText from '../VisuallyHiddenText';\nimport HiddenText from '../HiddenText';\nimport { useFullscreenContext } from '../Fullscreen';\n\nimport { getLinkTestIds } from './Link.test-ids';\n\nexport type LinkProps = WithAttributes<\n 'a',\n BaseProps &\n TestIdProp &\n AsProp & {\n /** URL or DOM id to navigate to. */\n href: string;\n /**\n * Controls the styling of the Link.\n * @default 'link'\n */\n variant?: ButtonProps['variant'];\n /**\n * Hides new tab icon which appears for links with target=\"_blank\".\n * @default false\n */\n hideNewTabIcon?: boolean;\n /**\n * Set the Icon prop to `true` if you're using just an Icon in your Link. Make sure to pass an Icon as children if `true`.\n * @default false\n */\n icon?: ButtonProps['icon'];\n /**\n * Determines if the Link should render a popover when focused or hovered over.\n * @default false\n */\n previewable?: boolean;\n /** Callback function that is run when the preview popover is interacted with. */\n onPreview?: (e: { href: string }) => void;\n /** Optional link behavior. When omitted, legacy Link behavior is preserved. */\n linkBehavior?: LinkBehavior;\n }\n>;\n\ntype LinkBehavior = 'preview' | 'open' | 'openInTab';\n\nconst LINK_BEHAVIORS: LinkBehavior[] = ['preview', 'open', 'openInTab'];\n\nfunction isLinkBehavior(behavior: unknown): behavior is LinkBehavior {\n return typeof behavior === 'string' && LINK_BEHAVIORS.some(item => item === behavior);\n}\n\nfunction getAlternateLinkBehaviors(primaryBehavior: LinkBehavior): LinkBehavior[] {\n return LINK_BEHAVIORS.filter(behavior => behavior !== primaryBehavior);\n}\n\nexport const StyledLinkPopover = styled.div<{ preview: boolean }>(\n ({ theme, preview }) => css`\n background-color: ${theme.components.tooltip['background-color']};\n z-index: ${theme.base['z-index'].tooltip};\n --scale-in-size: 0;\n --animation-duration: ${theme.base.animation.speed};\n\n ${preview &&\n css`\n padding: calc(${theme.base.spacing} / 4);\n `}\n `\n);\n\nStyledLinkPopover.defaultProps = defaultThemeProp;\n\nexport const StyledLinkPopoverBtn = styled(BareButton)(({ theme }) => {\n const contrastColor = tryCatch(() => readableColor(theme.components.tooltip['background-color']));\n const fontSize = calculateFontSize(theme.base['font-size'], theme.base['font-scale']);\n\n return css`\n position: relative;\n display: inline-flex;\n align-items: center;\n z-index: 1;\n padding: 0 ${theme.base.spacing};\n min-height: 1.5rem;\n line-height: 1;\n color: ${contrastColor};\n font-size: ${fontSize.xs};\n text-decoration: none;\n\n /* FIXME: Button selector specificity... */\n & + & {\n margin: 0;\n }\n\n & + &::before {\n content: '';\n position: absolute;\n inset-inline-start: 0;\n inset-block: 0;\n width: 1px; /* stylelint-disable-line unit-allowed-list */\n background-color: ${contrastColor};\n opacity: ${theme.base.transparency['transparent-3']};\n }\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:focus-visible {\n box-shadow:\n inset 0 0 0 0.0625rem ${theme.base.palette.light},\n 0 0 0.125rem 0.0625rem ${theme.base.palette.interactive};\n }\n `;\n});\n\nStyledLinkPopoverBtn.defaultProps = defaultThemeProp;\n\nexport const StyledLinkPreviewPopoverText = styled.div``;\n\nexport const StyledLinkPreviewPopoverBtn = styled(StyledLinkPopoverBtn)(({ theme }) => {\n return css`\n padding: calc(${theme.base.spacing} / 2);\n\n & + & {\n padding-inline-start: calc(${theme.base.spacing} - ${theme.base.spacing} / 4);\n padding-inline-end: calc(${theme.base.spacing} / 4);\n }\n\n &:hover,\n &:active {\n text-decoration: none;\n ${StyledLinkPreviewPopoverText} span {\n text-decoration: underline;\n }\n ${StyledLinkPreviewPopoverText} ${StyledKeyboard} span {\n text-decoration: none;\n }\n }\n\n ${StyledLinkPreviewPopoverText} {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n ${StyledKeyboard} {\n color: ${theme.base.palette.light};\n background-color: ${theme.base.colors.gray.dark};\n border-color: ${theme.base.colors.gray.medium};\n inset-block-start: unset;\n margin-inline: calc(${theme.base.spacing} / 4);\n\n &:first-of-type {\n margin-inline-start: calc(${theme.base.spacing} / 2);\n }\n\n &:last-of-type {\n margin-inline-end: calc(${theme.base.spacing} / 2);\n }\n }\n `;\n});\n\nStyledLinkPreviewPopoverBtn.defaultProps = defaultThemeProp;\n\nexport const StyledLink = styled(Button)`\n &:has(> img) {\n display: inline-block;\n\n ${StyledIcon} {\n vertical-align: top;\n }\n }\n`;\n\nStyledLink.defaultProps = defaultThemeProp;\n\nregisterIcon(openIcon);\n\nconst Link = forwardRef<RefElement<LinkProps>, PropsWithoutRef<LinkProps>>(function Link(\n {\n testId,\n href: hrefProp,\n variant = 'link',\n icon = false,\n previewable: showPreviewOpenInTabPopoverProp = false,\n onPreview,\n linkBehavior,\n target: targetProp,\n onClick: onClickProp,\n hideNewTabIcon = false,\n children,\n ...restProps\n },\n ref\n) {\n const href = disallowedURI.test(hrefProp) ? undefined : hrefProp;\n\n const { initialized: inModal } = useModalContext();\n const fullscreen = useFullscreenContext();\n const inFullscreen = !!(fullscreen && fullscreen[0]);\n const { previewTriggerRef } = usePreviewContext();\n const uid = useUID();\n const linkRef = useConsolidatedRef(ref);\n const [popover, setPopover] = useState(false);\n const [popoverHideDelay, setPopoverHideDelay] = useState<PopoverProps['hideDelay']>('short');\n const [previewPopover, setPreviewPopover] = useState(false);\n const previewBtnRef = useRef<HTMLButtonElement>(null);\n const isSmallOrAbove = useBreakpoint('sm');\n const t = useI18n();\n const { macintosh } = useOS();\n const contextMenuOpened = useRef(false);\n const testIds = useTestIds(testId, getLinkTestIds);\n\n const mousePositionRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const virtualElementCoordsRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const virtualElementRef = useRef<VirtualElement>({\n get contextElement() {\n return linkRef.current ?? undefined;\n },\n getBoundingClientRect: () => {\n return {\n width: 0,\n height: 0,\n top: virtualElementCoordsRef.current.y,\n bottom: virtualElementCoordsRef.current.y,\n left: virtualElementCoordsRef.current.x,\n right: virtualElementCoordsRef.current.x,\n x: virtualElementCoordsRef.current.x,\n y: virtualElementCoordsRef.current.y,\n toJSON() {\n return JSON.stringify(this);\n }\n };\n }\n });\n\n const previewable = showPreviewOpenInTabPopoverProp && !inModal && !inFullscreen;\n\n const normalizedLinkBehavior = isLinkBehavior(linkBehavior) ? linkBehavior : undefined;\n const hasLinkBehavior = normalizedLinkBehavior !== undefined;\n const target =\n (hasLinkBehavior && normalizedLinkBehavior === 'openInTab') || isCrossOrigin(href ?? '')\n ? '_blank'\n : targetProp;\n\n const defaultPreviewAlternates: LinkBehavior[] = ['preview', 'openInTab'];\n const previewActions =\n hasLinkBehavior && normalizedLinkBehavior\n ? getAlternateLinkBehaviors(normalizedLinkBehavior)\n : defaultPreviewAlternates;\n\n const showPopover = () => {\n if (isSmallOrAbove && !previewPopover) {\n setPopover(true);\n }\n };\n\n const showPreviewPopover = () => {\n if (isSmallOrAbove && !popover && !contextMenuOpened.current) setPreviewPopover(true);\n };\n\n const hidePopover = () => {\n setPopover(false);\n };\n\n const hidePreviewPopover = () => {\n setPreviewPopover(false);\n };\n\n const onBlurLink = () => {\n contextMenuOpened.current = false;\n hidePreviewPopover();\n };\n\n const onPreviewClick = () => {\n previewTriggerRef.current = linkRef.current;\n if (href !== undefined) {\n onPreview?.({ href });\n }\n };\n\n const getActionLabel = (behavior: LinkBehavior) => {\n if (behavior === 'preview') {\n return t('preview');\n }\n\n if (behavior === 'openInTab') {\n return t('link_open_in_tab_text');\n }\n\n return t('link_open_text');\n };\n\n const renderPreviewPopoverAction = (behavior: LinkBehavior) => {\n if (behavior === 'preview') {\n return (\n <StyledLinkPreviewPopoverBtn\n data-testid={testIds.preview}\n preview\n type='button'\n ref={previewBtnRef}\n onClick={onPreviewClick}\n tabIndex='-1'\n >\n <StyledLinkPreviewPopoverText>\n <span>{getActionLabel(behavior)}</span>\n <Flex container={{ inline: true, justify: 'end' }}>\n <Keyboard keyName='Alt' />\n <Keyboard keyName='P' />\n </Flex>\n </StyledLinkPreviewPopoverText>\n </StyledLinkPreviewPopoverBtn>\n );\n }\n\n if (behavior === 'openInTab') {\n return (\n <StyledLinkPreviewPopoverBtn\n data-testid={testIds.newTab}\n forwardedAs='a'\n href={href}\n target='_blank'\n rel='noreferrer'\n tabIndex='-1'\n >\n <StyledLinkPreviewPopoverText>\n <span>{getActionLabel(behavior)}</span>\n <Flex container={{ inline: true, justify: 'end' }}>\n <Keyboard keyName='CommandOrControl' />\n <Keyboard keyName='Enter' />\n </Flex>\n </StyledLinkPreviewPopoverText>\n </StyledLinkPreviewPopoverBtn>\n );\n }\n\n return (\n <StyledLinkPreviewPopoverBtn\n data-testid={testIds.root}\n forwardedAs='a'\n href={href}\n tabIndex='-1'\n >\n <StyledLinkPreviewPopoverText>\n <span>{getActionLabel(behavior)}</span>\n </StyledLinkPreviewPopoverText>\n </StyledLinkPreviewPopoverBtn>\n );\n };\n\n const renderHoverPopoverAction = (behavior: LinkBehavior) => {\n if (behavior === 'preview') {\n return (\n <StyledLinkPopoverBtn\n data-testid={testIds.preview}\n preview\n type='button'\n ref={previewBtnRef}\n onClick={onPreviewClick}\n tabIndex='-1'\n >\n {getActionLabel(behavior)}\n </StyledLinkPopoverBtn>\n );\n }\n\n if (behavior === 'openInTab') {\n return (\n <StyledLinkPopoverBtn\n data-testid={testIds.newTab}\n forwardedAs='a'\n href={href}\n target='_blank'\n rel='noreferrer'\n tabIndex='-1'\n >\n {getActionLabel(behavior)}\n </StyledLinkPopoverBtn>\n );\n }\n\n return (\n <StyledLinkPopoverBtn data-testid={testIds.root} forwardedAs='a' href={href} tabIndex='-1'>\n {getActionLabel(behavior)}\n </StyledLinkPopoverBtn>\n );\n };\n\n const onKeyUp = (e: ReactKeyboardEvent) => {\n if (e.getModifierState('Alt') && e.code === 'KeyP') {\n onPreviewClick();\n }\n };\n\n useEffect(() => {\n if (popoverHideDelay === 'none' && !popover && !previewPopover) {\n setPopoverHideDelay('short');\n }\n }, [popoverHideDelay, popover, previewPopover]);\n\n useEffect(() => {\n const onKeyDown = ({ key }: KeyboardEvent) => {\n if (key === 'Escape' && (popover || previewPopover)) {\n setPopoverHideDelay('none');\n setPopover(false);\n setPreviewPopover(false);\n }\n };\n\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [popover, previewPopover]);\n\n return (\n <>\n <StyledLink\n data-testid={testIds.root}\n href={href}\n variant={variant}\n ref={linkRef}\n target={target}\n {...restProps}\n aria-describedby={previewable ? `${uid}-preview-instructions` : undefined}\n onMouseEnter={\n showPreviewOpenInTabPopoverProp\n ? (e: MouseEvent) => {\n mousePositionRef.current = { x: e.clientX, y: e.clientY };\n showPopover();\n }\n : undefined\n }\n onMouseLeave={hidePopover}\n onMouseMove={(e: MouseEvent) => {\n mousePositionRef.current = { x: e.clientX, y: e.clientY };\n }}\n onFocus={\n showPreviewOpenInTabPopoverProp\n ? () => {\n showPreviewPopover();\n }\n : undefined\n }\n onBlur={onBlurLink}\n onKeyUp={onKeyUp}\n onContextMenu={() => {\n contextMenuOpened.current = true;\n\n setPopoverHideDelay('none');\n hidePreviewPopover();\n hidePopover();\n }}\n onClick={(e: ReactMouseEvent<HTMLAnchorElement>) => {\n if (hasLinkBehavior && normalizedLinkBehavior === 'preview') {\n e.preventDefault();\n onPreviewClick();\n return;\n }\n\n onClickProp?.(e);\n }}\n >\n {children}\n {target === '_blank' && <VisuallyHiddenText>{t('opens_in_a_new_tab')}</VisuallyHiddenText>}\n {!icon && target === '_blank' && !hideNewTabIcon && <Icon name='open' />}\n </StyledLink>\n\n {previewable && (\n <Popover\n data-testid={testIds.previewPopover}\n show={previewPopover}\n placement='top'\n groupId='tooltip'\n showDelay='short'\n hideDelay={popoverHideDelay}\n target={linkRef.current}\n as={StyledLinkPopover}\n arrow\n preview\n portal\n onHide={hidePreviewPopover}\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n }}\n >\n {previewActions.map(behavior => {\n return (\n <Fragment key={`preview-action-${behavior}`}>\n {renderPreviewPopoverAction(behavior)}\n </Fragment>\n );\n })}\n </Popover>\n )}\n\n <Popover\n data-testid={testIds.previewPopover}\n show={popover}\n placement='top'\n groupId='tooltip'\n showDelay='short'\n hideDelay={popoverHideDelay}\n target={virtualElementRef.current}\n onMouseEnter={showPopover}\n onMouseLeave={hidePopover}\n as={StyledLinkPopover}\n arrow\n portal\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n }}\n onShow={() => {\n const clientRects = linkRef.current?.getClientRects() ?? [];\n const { x: mouseX, y: mouseY } = mousePositionRef.current;\n const containingRect = Array.from(clientRects).find(\n // Assumes the rects are returned in order of appearance (left to right, top down) and don't overlap\n rect => mouseY < rect.bottom && mouseX < rect.right\n );\n if (containingRect) {\n virtualElementCoordsRef.current = {\n x: mouseX,\n y: containingRect.top\n };\n }\n }}\n >\n {previewActions\n .filter(behavior => behavior !== 'preview' || previewable)\n .map(behavior => {\n return (\n <Fragment key={`hover-action-${behavior}`}>\n {renderHoverPopoverAction(behavior)}\n </Fragment>\n );\n })}\n </Popover>\n\n {previewable && (\n <HiddenText id={`${uid}-preview-instructions`}>\n {t('preview_link_instruction', [macintosh ? 'option' : 'alt'])}\n </HiddenText>\n )}\n </>\n );\n});\n\nexport default withTestIds(Link, getLinkTestIds);\n"]}
1
+ {"version":3,"file":"Link.js","sourceRoot":"","sources":["../../../src/components/Link/Link.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useState, useRef, useEffect, Fragment } from 'react';\nimport type {\n MouseEvent as ReactMouseEvent,\n PropsWithoutRef,\n KeyboardEvent as ReactKeyboardEvent\n} from 'react';\nimport styled, { css } from 'styled-components';\nimport type { VirtualElement } from '@popperjs/core';\n\nimport Button from '../Button';\nimport type { ButtonProps } from '../Button';\nimport Popover from '../Popover';\nimport type { PopoverProps } from '../Popover';\nimport BareButton from '../Button/BareButton';\nimport type { WithAttributes, BaseProps, TestIdProp, RefElement, AsProp } from '../../types';\nimport { defaultThemeProp } from '../../theme';\nimport {\n useBreakpoint,\n useConsolidatedRef,\n useI18n,\n usePreviewContext,\n useUID,\n useModalContext,\n useOS,\n useTestIds\n} from '../../hooks';\nimport { isCrossOrigin, tryCatch, withTestIds, disallowedURI, handleLinkClick } from '../../utils';\nimport { calculateFontSize, readableColor } from '../../styles';\nimport { Keyboard } from '../Badges';\nimport { StyledKeyboard } from '../Badges/Keyboard';\nimport Flex from '../Flex';\nimport Icon, { StyledIcon, registerIcon } from '../Icon';\nimport * as openIcon from '../Icon/icons/open.icon';\nimport VisuallyHiddenText from '../VisuallyHiddenText';\nimport HiddenText from '../HiddenText';\nimport { useFullscreenContext } from '../Fullscreen';\n\nimport { getLinkTestIds } from './Link.test-ids';\n\nexport type LinkProps = WithAttributes<\n 'a',\n BaseProps &\n TestIdProp &\n AsProp & {\n /** URL or DOM id to navigate to. */\n href: string;\n /**\n * Controls the styling of the Link.\n * @default 'link'\n */\n variant?: ButtonProps['variant'];\n /**\n * Hides new tab icon which appears for links with target=\"_blank\".\n * @default false\n */\n hideNewTabIcon?: boolean;\n /**\n * Set the Icon prop to `true` if you're using just an Icon in your Link. Make sure to pass an Icon as children if `true`.\n * @default false\n */\n icon?: ButtonProps['icon'];\n /**\n * Determines if the Link should render a popover when focused or hovered over.\n * @default false\n */\n previewable?: boolean;\n /** Callback function that is run when the preview popover is interacted with. */\n onPreview?: (e: { href: string }) => void;\n /** Optional link behavior. When omitted, legacy Link behavior is preserved. */\n linkBehavior?: LinkBehavior;\n }\n>;\n\nconst LINK_BEHAVIOR = {\n PREVIEW: 'preview',\n OPEN: 'open',\n OPEN_IN_TAB: 'openInTab'\n} as const;\n\ntype LinkBehavior = (typeof LINK_BEHAVIOR)[keyof typeof LINK_BEHAVIOR];\n\nconst LINK_BEHAVIORS: LinkBehavior[] = Object.values(LINK_BEHAVIOR);\n\nfunction isLinkBehavior(behavior: unknown): behavior is LinkBehavior {\n return typeof behavior === 'string' && LINK_BEHAVIORS.some(item => item === behavior);\n}\n\nfunction getAlternateLinkBehaviors(primaryBehavior: LinkBehavior): LinkBehavior[] {\n return LINK_BEHAVIORS.filter(behavior => behavior !== primaryBehavior);\n}\n\nexport const StyledLinkPopover = styled.div<{ preview: boolean }>(\n ({ theme, preview }) => css`\n background-color: ${theme.components.tooltip['background-color']};\n z-index: ${theme.base['z-index'].tooltip};\n --scale-in-size: 0;\n --animation-duration: ${theme.base.animation.speed};\n\n ${preview &&\n css`\n padding: calc(${theme.base.spacing} / 4);\n `}\n `\n);\n\nStyledLinkPopover.defaultProps = defaultThemeProp;\n\nexport const StyledLinkPopoverBtn = styled(BareButton)(({ theme }) => {\n const contrastColor = tryCatch(() => readableColor(theme.components.tooltip['background-color']));\n const fontSize = calculateFontSize(theme.base['font-size'], theme.base['font-scale']);\n\n return css`\n position: relative;\n display: inline-flex;\n align-items: center;\n z-index: 1;\n padding: 0 ${theme.base.spacing};\n min-height: 1.5rem;\n line-height: 1;\n color: ${contrastColor};\n font-size: ${fontSize.xs};\n text-decoration: none;\n\n /* FIXME: Button selector specificity... */\n & + & {\n margin: 0;\n }\n\n & + &::before {\n content: '';\n position: absolute;\n inset-inline-start: 0;\n inset-block: 0;\n width: 1px; /* stylelint-disable-line unit-allowed-list */\n background-color: ${contrastColor};\n opacity: ${theme.base.transparency['transparent-3']};\n }\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:focus-visible {\n box-shadow:\n inset 0 0 0 0.0625rem ${theme.base.palette.light},\n 0 0 0.125rem 0.0625rem ${theme.base.palette.interactive};\n }\n `;\n});\n\nStyledLinkPopoverBtn.defaultProps = defaultThemeProp;\n\nexport const StyledLinkPreviewPopoverText = styled.div``;\n\nexport const StyledLinkPreviewPopoverBtn = styled(StyledLinkPopoverBtn)(({ theme }) => {\n return css`\n padding: calc(${theme.base.spacing} / 2);\n\n & + & {\n padding-inline-start: calc(${theme.base.spacing} - ${theme.base.spacing} / 4);\n padding-inline-end: calc(${theme.base.spacing} / 4);\n }\n\n &:hover,\n &:active {\n text-decoration: none;\n ${StyledLinkPreviewPopoverText} span {\n text-decoration: underline;\n }\n ${StyledLinkPreviewPopoverText} ${StyledKeyboard} span {\n text-decoration: none;\n }\n }\n\n ${StyledLinkPreviewPopoverText} {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n ${StyledKeyboard} {\n color: ${theme.base.palette.light};\n background-color: ${theme.base.colors.gray.dark};\n border-color: ${theme.base.colors.gray.medium};\n inset-block-start: unset;\n margin-inline: calc(${theme.base.spacing} / 4);\n\n &:first-of-type {\n margin-inline-start: calc(${theme.base.spacing} / 2);\n }\n\n &:last-of-type {\n margin-inline-end: calc(${theme.base.spacing} / 2);\n }\n }\n `;\n});\n\nStyledLinkPreviewPopoverBtn.defaultProps = defaultThemeProp;\n\nexport const StyledLink = styled(Button)`\n &:has(> img) {\n display: inline-block;\n\n ${StyledIcon} {\n vertical-align: top;\n }\n }\n`;\n\nStyledLink.defaultProps = defaultThemeProp;\n\nregisterIcon(openIcon);\n\nconst Link = forwardRef<RefElement<LinkProps>, PropsWithoutRef<LinkProps>>(function Link(\n {\n testId,\n href: hrefProp,\n variant = 'link',\n icon = false,\n previewable: showPreviewOpenInTabPopoverProp = false,\n onPreview,\n linkBehavior,\n target: targetProp,\n onClick: onClickProp,\n hideNewTabIcon = false,\n children,\n ...restProps\n },\n ref\n) {\n const href = disallowedURI.test(hrefProp) ? undefined : hrefProp;\n\n const { initialized: inModal } = useModalContext();\n const fullscreen = useFullscreenContext();\n const inFullscreen = !!(fullscreen && fullscreen[0]);\n const { previewTriggerRef } = usePreviewContext();\n const uid = useUID();\n const linkRef = useConsolidatedRef(ref);\n const [popover, setPopover] = useState(false);\n const [popoverHideDelay, setPopoverHideDelay] = useState<PopoverProps['hideDelay']>('short');\n const [previewPopover, setPreviewPopover] = useState(false);\n const previewBtnRef = useRef<HTMLButtonElement>(null);\n const openBtnRef = useRef<HTMLElement>(null);\n const isSmallOrAbove = useBreakpoint('sm');\n const t = useI18n();\n const { macintosh } = useOS();\n const contextMenuOpened = useRef(false);\n const testIds = useTestIds(testId, getLinkTestIds);\n\n const mousePositionRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const virtualElementCoordsRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const virtualElementRef = useRef<VirtualElement>({\n get contextElement() {\n return linkRef.current ?? undefined;\n },\n getBoundingClientRect: () => {\n return {\n width: 0,\n height: 0,\n top: virtualElementCoordsRef.current.y,\n bottom: virtualElementCoordsRef.current.y,\n left: virtualElementCoordsRef.current.x,\n right: virtualElementCoordsRef.current.x,\n x: virtualElementCoordsRef.current.x,\n y: virtualElementCoordsRef.current.y,\n toJSON() {\n return this;\n }\n };\n }\n });\n\n const previewable = showPreviewOpenInTabPopoverProp && !inModal && !inFullscreen;\n\n let normalizedLinkBehavior = isLinkBehavior(linkBehavior) ? linkBehavior : undefined;\n\n if (normalizedLinkBehavior === LINK_BEHAVIOR.PREVIEW && (inModal || inFullscreen)) {\n // preview is hidden from users in fullscreen or modal contexts, so fallback to open\n normalizedLinkBehavior = LINK_BEHAVIOR.OPEN;\n }\n\n const hasLinkBehavior = normalizedLinkBehavior !== undefined;\n const target =\n (hasLinkBehavior && normalizedLinkBehavior === LINK_BEHAVIOR.OPEN_IN_TAB) ||\n isCrossOrigin(href ?? '')\n ? '_blank'\n : targetProp;\n\n const defaultPreviewAlternates: LinkBehavior[] = [\n LINK_BEHAVIOR.PREVIEW,\n LINK_BEHAVIOR.OPEN_IN_TAB\n ];\n const previewActions =\n hasLinkBehavior && normalizedLinkBehavior\n ? getAlternateLinkBehaviors(normalizedLinkBehavior)\n : defaultPreviewAlternates;\n const hasOpenAlternateAction = previewActions.some(behavior => behavior === LINK_BEHAVIOR.OPEN);\n const ariaDescribedBy = [\n previewable ? `${uid}-preview-instructions` : undefined,\n previewable && isSmallOrAbove && hasOpenAlternateAction ? `${uid}-open-instructions` : undefined\n ]\n .filter(Boolean)\n .join(' ');\n\n const showPopover = () => {\n if (isSmallOrAbove && !previewPopover) {\n setPopover(true);\n }\n };\n\n const showPreviewPopover = () => {\n if (isSmallOrAbove && !popover && !contextMenuOpened.current) setPreviewPopover(true);\n };\n\n const hidePopover = () => {\n setPopover(false);\n };\n\n const hidePreviewPopover = () => {\n setPreviewPopover(false);\n };\n\n const onBlurLink = () => {\n contextMenuOpened.current = false;\n hidePreviewPopover();\n };\n\n const onPreviewClick = () => {\n previewTriggerRef.current = linkRef.current;\n if (href !== undefined) {\n onPreview?.({ href });\n }\n };\n\n const getActionLabel = (behavior: LinkBehavior) => {\n if (behavior === LINK_BEHAVIOR.PREVIEW) {\n return t('preview');\n }\n\n if (behavior === LINK_BEHAVIOR.OPEN_IN_TAB) {\n return t('link_open_in_tab_text');\n }\n\n return t('link_open_text');\n };\n\n const renderPreviewPopoverAction = (behavior: LinkBehavior) => {\n if (behavior === LINK_BEHAVIOR.PREVIEW) {\n return (\n <StyledLinkPreviewPopoverBtn\n data-testid={testIds.preview}\n preview\n type='button'\n ref={previewBtnRef}\n onClick={onPreviewClick}\n tabIndex='-1'\n >\n <StyledLinkPreviewPopoverText>\n <span>{getActionLabel(behavior)}</span>\n <Flex container={{ inline: true, justify: 'end' }}>\n <Keyboard keyName='Alt' />\n <Keyboard keyName='P' />\n </Flex>\n </StyledLinkPreviewPopoverText>\n </StyledLinkPreviewPopoverBtn>\n );\n }\n\n if (behavior === LINK_BEHAVIOR.OPEN_IN_TAB) {\n return (\n <StyledLinkPreviewPopoverBtn\n data-testid={testIds.newTab}\n forwardedAs='a'\n href={href}\n target='_blank'\n rel='noreferrer'\n tabIndex='-1'\n >\n <StyledLinkPreviewPopoverText>\n <span>{getActionLabel(behavior)}</span>\n <Flex container={{ inline: true, justify: 'end' }}>\n <Keyboard keyName='CommandOrControl' />\n <Keyboard keyName='Enter' />\n </Flex>\n </StyledLinkPreviewPopoverText>\n </StyledLinkPreviewPopoverBtn>\n );\n }\n\n return (\n <StyledLinkPreviewPopoverBtn\n data-testid={testIds.open}\n forwardedAs='a'\n href={href}\n tabIndex='-1'\n onClick={onClickProp}\n ref={openBtnRef}\n >\n <StyledLinkPreviewPopoverText>\n <span>{getActionLabel(behavior)}</span>\n <Flex container={{ inline: true, justify: 'end' }}>\n <Keyboard keyName='Alt' />\n <Keyboard keyName='O' />\n </Flex>\n </StyledLinkPreviewPopoverText>\n </StyledLinkPreviewPopoverBtn>\n );\n };\n\n const renderHoverPopoverAction = (behavior: LinkBehavior) => {\n if (behavior === LINK_BEHAVIOR.PREVIEW) {\n return (\n <StyledLinkPopoverBtn\n data-testid={testIds.preview}\n preview\n type='button'\n ref={previewBtnRef}\n onClick={onPreviewClick}\n tabIndex='-1'\n >\n {getActionLabel(behavior)}\n </StyledLinkPopoverBtn>\n );\n }\n\n if (behavior === LINK_BEHAVIOR.OPEN_IN_TAB) {\n return (\n <StyledLinkPopoverBtn\n data-testid={testIds.newTab}\n forwardedAs='a'\n href={href}\n target='_blank'\n rel='noreferrer'\n tabIndex='-1'\n >\n {getActionLabel(behavior)}\n </StyledLinkPopoverBtn>\n );\n }\n\n return (\n <StyledLinkPopoverBtn\n data-testid={testIds.open}\n forwardedAs='a'\n href={href}\n tabIndex='-1'\n onClick={onClickProp}\n >\n {getActionLabel(behavior)}\n </StyledLinkPopoverBtn>\n );\n };\n\n const onKeyUp = (e: ReactKeyboardEvent) => {\n if (e.getModifierState('Alt') && e.code === 'KeyP') {\n onPreviewClick();\n return;\n }\n\n // Alt/Option+O opens only when Open is an alternate action and popover is visible.\n if (hasOpenAlternateAction && e.getModifierState('Alt') && e.code === 'KeyO') {\n openBtnRef.current?.click();\n }\n };\n\n useEffect(() => {\n if (popoverHideDelay === 'none' && !popover && !previewPopover) {\n setPopoverHideDelay('short');\n }\n }, [popoverHideDelay, popover, previewPopover]);\n\n useEffect(() => {\n const onKeyDown = ({ key }: KeyboardEvent) => {\n if (key === 'Escape' && (popover || previewPopover)) {\n setPopoverHideDelay('none');\n setPopover(false);\n setPreviewPopover(false);\n }\n };\n\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [popover, previewPopover]);\n\n return (\n <>\n <StyledLink\n data-testid={testIds.root}\n href={href}\n variant={variant}\n ref={linkRef}\n target={target}\n {...restProps}\n aria-describedby={ariaDescribedBy || undefined}\n onMouseEnter={\n showPreviewOpenInTabPopoverProp\n ? (e: MouseEvent) => {\n mousePositionRef.current = { x: e.clientX, y: e.clientY };\n showPopover();\n }\n : undefined\n }\n onMouseLeave={hidePopover}\n onMouseMove={(e: MouseEvent) => {\n mousePositionRef.current = { x: e.clientX, y: e.clientY };\n }}\n onFocus={\n showPreviewOpenInTabPopoverProp\n ? () => {\n showPreviewPopover();\n }\n : undefined\n }\n onBlur={onBlurLink}\n onKeyUp={onKeyUp}\n onContextMenu={() => {\n contextMenuOpened.current = true;\n\n setPopoverHideDelay('none');\n hidePreviewPopover();\n hidePopover();\n }}\n onClick={(e: ReactMouseEvent<HTMLAnchorElement>) => {\n if (hasLinkBehavior && normalizedLinkBehavior === LINK_BEHAVIOR.PREVIEW) {\n handleLinkClick(onPreviewClick)(e);\n return;\n }\n onClickProp?.(e);\n }}\n >\n {children}\n {target === '_blank' && <VisuallyHiddenText>{t('opens_in_a_new_tab')}</VisuallyHiddenText>}\n {!icon && target === '_blank' && !hideNewTabIcon && <Icon name='open' />}\n </StyledLink>\n\n {previewable && (\n <Popover\n data-testid={testIds.previewPopover}\n show={previewPopover}\n placement='top'\n groupId='tooltip'\n showDelay='short'\n hideDelay={popoverHideDelay}\n target={linkRef.current}\n as={StyledLinkPopover}\n arrow\n preview\n portal\n onHide={hidePreviewPopover}\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n }}\n >\n {previewActions.map(behavior => {\n return (\n <Fragment key={`preview-action-${behavior}`}>\n {renderPreviewPopoverAction(behavior)}\n </Fragment>\n );\n })}\n </Popover>\n )}\n\n <Popover\n data-testid={testIds.previewPopover}\n show={popover}\n placement='top'\n groupId='tooltip'\n showDelay='short'\n hideDelay={popoverHideDelay}\n target={virtualElementRef.current}\n onMouseEnter={showPopover}\n onMouseLeave={hidePopover}\n as={StyledLinkPopover}\n arrow\n portal\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n }}\n onShow={() => {\n const clientRects = linkRef.current?.getClientRects() ?? [];\n const { x: mouseX, y: mouseY } = mousePositionRef.current;\n const containingRect = Array.from(clientRects).find(\n // Assumes the rects are returned in order of appearance (left to right, top down) and don't overlap\n rect => mouseY < rect.bottom && mouseX < rect.right\n );\n if (containingRect) {\n virtualElementCoordsRef.current = {\n x: mouseX,\n y: containingRect.top\n };\n }\n }}\n >\n {previewActions\n .filter(behavior => behavior !== LINK_BEHAVIOR.PREVIEW || previewable)\n .map(behavior => {\n return (\n <Fragment key={`hover-action-${behavior}`}>\n {renderHoverPopoverAction(behavior)}\n </Fragment>\n );\n })}\n </Popover>\n\n {previewable && (\n <HiddenText id={`${uid}-preview-instructions`}>\n {t('preview_link_instruction', [macintosh ? 'option' : 'alt'])}\n </HiddenText>\n )}\n {previewable && isSmallOrAbove && hasOpenAlternateAction && (\n <HiddenText id={`${uid}-open-instructions`}>\n {t('open_link_instruction', [macintosh ? 'option' : 'alt'])}\n </HiddenText>\n )}\n </>\n );\n});\n\nexport default withTestIds(Link, getLinkTestIds);\n"]}