@fluentui-copilot/react-reference 0.0.0-nightly-20240313-0404-8abc883d.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 (174) hide show
  1. package/CHANGELOG.json +943 -0
  2. package/CHANGELOG.md +281 -0
  3. package/LICENSE +23 -0
  4. package/README.md +5 -0
  5. package/dist/index.d.ts +539 -0
  6. package/lib/Citation.js +2 -0
  7. package/lib/Citation.js.map +1 -0
  8. package/lib/Reference.js +2 -0
  9. package/lib/Reference.js.map +1 -0
  10. package/lib/ReferenceGroup.js +2 -0
  11. package/lib/ReferenceGroup.js.map +1 -0
  12. package/lib/ReferenceGroupToggle.js +2 -0
  13. package/lib/ReferenceGroupToggle.js.map +1 -0
  14. package/lib/ReferenceList.js +2 -0
  15. package/lib/ReferenceList.js.map +1 -0
  16. package/lib/components/Citation/Citation.js +14 -0
  17. package/lib/components/Citation/Citation.js.map +1 -0
  18. package/lib/components/Citation/Citation.types.js +2 -0
  19. package/lib/components/Citation/Citation.types.js.map +1 -0
  20. package/lib/components/Citation/index.js +6 -0
  21. package/lib/components/Citation/index.js.map +1 -0
  22. package/lib/components/Citation/renderCitation.js +29 -0
  23. package/lib/components/Citation/renderCitation.js.map +1 -0
  24. package/lib/components/Citation/useCitation.js +191 -0
  25. package/lib/components/Citation/useCitation.js.map +1 -0
  26. package/lib/components/Citation/useCitationStyles.js +44 -0
  27. package/lib/components/Citation/useCitationStyles.js.map +1 -0
  28. package/lib/components/Reference/Reference.js +14 -0
  29. package/lib/components/Reference/Reference.js.map +1 -0
  30. package/lib/components/Reference/Reference.types.js +2 -0
  31. package/lib/components/Reference/Reference.types.js.map +1 -0
  32. package/lib/components/Reference/index.js +6 -0
  33. package/lib/components/Reference/index.js.map +1 -0
  34. package/lib/components/Reference/renderReference.js +16 -0
  35. package/lib/components/Reference/renderReference.js.map +1 -0
  36. package/lib/components/Reference/useReference.js +197 -0
  37. package/lib/components/Reference/useReference.js.map +1 -0
  38. package/lib/components/Reference/useReferenceStyles.js +253 -0
  39. package/lib/components/Reference/useReferenceStyles.js.map +1 -0
  40. package/lib/components/ReferenceGroup/ReferenceGroup.js +19 -0
  41. package/lib/components/ReferenceGroup/ReferenceGroup.js.map +1 -0
  42. package/lib/components/ReferenceGroup/ReferenceGroup.types.js +2 -0
  43. package/lib/components/ReferenceGroup/ReferenceGroup.types.js.map +1 -0
  44. package/lib/components/ReferenceGroup/index.js +6 -0
  45. package/lib/components/ReferenceGroup/index.js.map +1 -0
  46. package/lib/components/ReferenceGroup/renderReferenceGroup.js +21 -0
  47. package/lib/components/ReferenceGroup/renderReferenceGroup.js.map +1 -0
  48. package/lib/components/ReferenceGroup/useReferenceGroup.js +104 -0
  49. package/lib/components/ReferenceGroup/useReferenceGroup.js.map +1 -0
  50. package/lib/components/ReferenceGroup/useReferenceGroupContextValues.js +10 -0
  51. package/lib/components/ReferenceGroup/useReferenceGroupContextValues.js.map +1 -0
  52. package/lib/components/ReferenceGroup/useReferenceGroupStyles.js +50 -0
  53. package/lib/components/ReferenceGroup/useReferenceGroupStyles.js.map +1 -0
  54. package/lib/components/ReferenceGroupToggle/ReferenceGroupToggle.js +12 -0
  55. package/lib/components/ReferenceGroupToggle/ReferenceGroupToggle.js.map +1 -0
  56. package/lib/components/ReferenceGroupToggle/ReferenceGroupToggle.types.js +2 -0
  57. package/lib/components/ReferenceGroupToggle/ReferenceGroupToggle.types.js.map +1 -0
  58. package/lib/components/ReferenceGroupToggle/index.js +6 -0
  59. package/lib/components/ReferenceGroupToggle/index.js.map +1 -0
  60. package/lib/components/ReferenceGroupToggle/renderReferenceGroupToggle.js +12 -0
  61. package/lib/components/ReferenceGroupToggle/renderReferenceGroupToggle.js.map +1 -0
  62. package/lib/components/ReferenceGroupToggle/useReferenceGroupToggle.js +40 -0
  63. package/lib/components/ReferenceGroupToggle/useReferenceGroupToggle.js.map +1 -0
  64. package/lib/components/ReferenceGroupToggle/useReferenceGroupToggleStyles.js +20 -0
  65. package/lib/components/ReferenceGroupToggle/useReferenceGroupToggleStyles.js.map +1 -0
  66. package/lib/components/ReferenceList/ReferenceList.js +14 -0
  67. package/lib/components/ReferenceList/ReferenceList.js.map +1 -0
  68. package/lib/components/ReferenceList/ReferenceList.types.js +2 -0
  69. package/lib/components/ReferenceList/ReferenceList.types.js.map +1 -0
  70. package/lib/components/ReferenceList/index.js +6 -0
  71. package/lib/components/ReferenceList/index.js.map +1 -0
  72. package/lib/components/ReferenceList/renderReferenceList.js +10 -0
  73. package/lib/components/ReferenceList/renderReferenceList.js.map +1 -0
  74. package/lib/components/ReferenceList/useReferenceList.js +30 -0
  75. package/lib/components/ReferenceList/useReferenceList.js.map +1 -0
  76. package/lib/components/ReferenceList/useReferenceListStyles.js +17 -0
  77. package/lib/components/ReferenceList/useReferenceListStyles.js.map +1 -0
  78. package/lib/context/ReferenceGroupContext.js +11 -0
  79. package/lib/context/ReferenceGroupContext.js.map +1 -0
  80. package/lib/hooks/index.js +4 -0
  81. package/lib/hooks/index.js.map +1 -0
  82. package/lib/hooks/useReferenceCitation.js +77 -0
  83. package/lib/hooks/useReferenceCitation.js.map +1 -0
  84. package/lib/hooks/useReferenceCitationPreview.js +128 -0
  85. package/lib/hooks/useReferenceCitationPreview.js.map +1 -0
  86. package/lib/hooks/useReferenceGroup.js +40 -0
  87. package/lib/hooks/useReferenceGroup.js.map +1 -0
  88. package/lib/index.js +7 -0
  89. package/lib/index.js.map +1 -0
  90. package/lib-commonjs/Citation.js +7 -0
  91. package/lib-commonjs/Citation.js.map +1 -0
  92. package/lib-commonjs/Reference.js +7 -0
  93. package/lib-commonjs/Reference.js.map +1 -0
  94. package/lib-commonjs/ReferenceGroup.js +7 -0
  95. package/lib-commonjs/ReferenceGroup.js.map +1 -0
  96. package/lib-commonjs/ReferenceGroupToggle.js +7 -0
  97. package/lib-commonjs/ReferenceGroupToggle.js.map +1 -0
  98. package/lib-commonjs/ReferenceList.js +7 -0
  99. package/lib-commonjs/ReferenceList.js.map +1 -0
  100. package/lib-commonjs/components/Citation/Citation.js +23 -0
  101. package/lib-commonjs/components/Citation/Citation.js.map +1 -0
  102. package/lib-commonjs/components/Citation/Citation.types.js +5 -0
  103. package/lib-commonjs/components/Citation/Citation.types.js.map +1 -0
  104. package/lib-commonjs/components/Citation/index.js +11 -0
  105. package/lib-commonjs/components/Citation/index.js.map +1 -0
  106. package/lib-commonjs/components/Citation/renderCitation.js +38 -0
  107. package/lib-commonjs/components/Citation/renderCitation.js.map +1 -0
  108. package/lib-commonjs/components/Citation/useCitation.js +185 -0
  109. package/lib-commonjs/components/Citation/useCitation.js.map +1 -0
  110. package/lib-commonjs/components/Citation/useCitationStyles.js +100 -0
  111. package/lib-commonjs/components/Citation/useCitationStyles.js.map +1 -0
  112. package/lib-commonjs/components/Reference/Reference.js +23 -0
  113. package/lib-commonjs/components/Reference/Reference.js.map +1 -0
  114. package/lib-commonjs/components/Reference/Reference.types.js +5 -0
  115. package/lib-commonjs/components/Reference/Reference.types.js.map +1 -0
  116. package/lib-commonjs/components/Reference/index.js +11 -0
  117. package/lib-commonjs/components/Reference/index.js.map +1 -0
  118. package/lib-commonjs/components/Reference/renderReference.js +40 -0
  119. package/lib-commonjs/components/Reference/renderReference.js.map +1 -0
  120. package/lib-commonjs/components/Reference/useReference.js +201 -0
  121. package/lib-commonjs/components/Reference/useReference.js.map +1 -0
  122. package/lib-commonjs/components/Reference/useReferenceStyles.js +454 -0
  123. package/lib-commonjs/components/Reference/useReferenceStyles.js.map +1 -0
  124. package/lib-commonjs/components/ReferenceGroup/ReferenceGroup.js +25 -0
  125. package/lib-commonjs/components/ReferenceGroup/ReferenceGroup.js.map +1 -0
  126. package/lib-commonjs/components/ReferenceGroup/ReferenceGroup.types.js +5 -0
  127. package/lib-commonjs/components/ReferenceGroup/ReferenceGroup.types.js.map +1 -0
  128. package/lib-commonjs/components/ReferenceGroup/index.js +11 -0
  129. package/lib-commonjs/components/ReferenceGroup/index.js.map +1 -0
  130. package/lib-commonjs/components/ReferenceGroup/renderReferenceGroup.js +33 -0
  131. package/lib-commonjs/components/ReferenceGroup/renderReferenceGroup.js.map +1 -0
  132. package/lib-commonjs/components/ReferenceGroup/useReferenceGroup.js +103 -0
  133. package/lib-commonjs/components/ReferenceGroup/useReferenceGroup.js.map +1 -0
  134. package/lib-commonjs/components/ReferenceGroup/useReferenceGroupContextValues.js +23 -0
  135. package/lib-commonjs/components/ReferenceGroup/useReferenceGroupContextValues.js.map +1 -0
  136. package/lib-commonjs/components/ReferenceGroup/useReferenceGroupStyles.js +75 -0
  137. package/lib-commonjs/components/ReferenceGroup/useReferenceGroupStyles.js.map +1 -0
  138. package/lib-commonjs/components/ReferenceGroupToggle/ReferenceGroupToggle.js +21 -0
  139. package/lib-commonjs/components/ReferenceGroupToggle/ReferenceGroupToggle.js.map +1 -0
  140. package/lib-commonjs/components/ReferenceGroupToggle/ReferenceGroupToggle.types.js +5 -0
  141. package/lib-commonjs/components/ReferenceGroupToggle/ReferenceGroupToggle.types.js.map +1 -0
  142. package/lib-commonjs/components/ReferenceGroupToggle/index.js +11 -0
  143. package/lib-commonjs/components/ReferenceGroupToggle/index.js.map +1 -0
  144. package/lib-commonjs/components/ReferenceGroupToggle/renderReferenceGroupToggle.js +21 -0
  145. package/lib-commonjs/components/ReferenceGroupToggle/renderReferenceGroupToggle.js.map +1 -0
  146. package/lib-commonjs/components/ReferenceGroupToggle/useReferenceGroupToggle.js +39 -0
  147. package/lib-commonjs/components/ReferenceGroupToggle/useReferenceGroupToggle.js.map +1 -0
  148. package/lib-commonjs/components/ReferenceGroupToggle/useReferenceGroupToggleStyles.js +39 -0
  149. package/lib-commonjs/components/ReferenceGroupToggle/useReferenceGroupToggleStyles.js.map +1 -0
  150. package/lib-commonjs/components/ReferenceList/ReferenceList.js +23 -0
  151. package/lib-commonjs/components/ReferenceList/ReferenceList.js.map +1 -0
  152. package/lib-commonjs/components/ReferenceList/ReferenceList.types.js +5 -0
  153. package/lib-commonjs/components/ReferenceList/ReferenceList.types.js.map +1 -0
  154. package/lib-commonjs/components/ReferenceList/index.js +11 -0
  155. package/lib-commonjs/components/ReferenceList/index.js.map +1 -0
  156. package/lib-commonjs/components/ReferenceList/renderReferenceList.js +16 -0
  157. package/lib-commonjs/components/ReferenceList/renderReferenceList.js.map +1 -0
  158. package/lib-commonjs/components/ReferenceList/useReferenceList.js +30 -0
  159. package/lib-commonjs/components/ReferenceList/useReferenceList.js.map +1 -0
  160. package/lib-commonjs/components/ReferenceList/useReferenceListStyles.js +36 -0
  161. package/lib-commonjs/components/ReferenceList/useReferenceListStyles.js.map +1 -0
  162. package/lib-commonjs/context/ReferenceGroupContext.js +29 -0
  163. package/lib-commonjs/context/ReferenceGroupContext.js.map +1 -0
  164. package/lib-commonjs/hooks/index.js +15 -0
  165. package/lib-commonjs/hooks/index.js.map +1 -0
  166. package/lib-commonjs/hooks/useReferenceCitation.js +78 -0
  167. package/lib-commonjs/hooks/useReferenceCitation.js.map +1 -0
  168. package/lib-commonjs/hooks/useReferenceCitationPreview.js +141 -0
  169. package/lib-commonjs/hooks/useReferenceCitationPreview.js.map +1 -0
  170. package/lib-commonjs/hooks/useReferenceGroup.js +49 -0
  171. package/lib-commonjs/hooks/useReferenceGroup.js.map +1 -0
  172. package/lib-commonjs/index.js +103 -0
  173. package/lib-commonjs/index.js.map +1 -0
  174. package/package.json +43 -0
@@ -0,0 +1,191 @@
1
+ import * as React from 'react';
2
+ import { getNativeElementProps, PopoverSurface, mergeCallbacks, slot, useFluent, useId, useIsomorphicLayoutEffect } from '@fluentui/react-components';
3
+ import { Enter, Escape } from '@fluentui/keyboard-keys';
4
+ import { useTimeout } from '@fluentui/react-utilities';
5
+ import { usePreviewContext_unstable } from '@fluentui-copilot/react-preview';
6
+ const POPOVER_MOUSE_HIDE_DELAY = 500;
7
+ const POPOVER_KEYBOARD_HIDE_DELAY = 0;
8
+ const getDelay = type => {
9
+ if (type === 'focus' || type === 'blur') {
10
+ return POPOVER_KEYBOARD_HIDE_DELAY;
11
+ }
12
+ return POPOVER_MOUSE_HIDE_DELAY;
13
+ };
14
+ /**
15
+ * Create the state required to render Citation.
16
+ *
17
+ * The returned state can be modified with hooks such as useCitationStyles_unstable,
18
+ * before being passed to renderCitation_unstable.
19
+ *
20
+ * @param props - props from this instance of Citation
21
+ * @param ref - reference to root HTMLElement of Citation
22
+ */
23
+ export const useCitation_unstable = (props, ref) => {
24
+ const {
25
+ popover,
26
+ popoverSurface,
27
+ referenceHref,
28
+ block = false,
29
+ ...otherProps
30
+ } = props;
31
+ const {
32
+ targetDocument
33
+ } = useFluent();
34
+ const [setTimeout, clearTimeout] = useTimeout();
35
+ const popoverId = useId('citation-popover-');
36
+ const [disableAutoFocus, setDisableAutoFocus] = React.useState(true);
37
+ const {
38
+ current: citationInternalState
39
+ } = React.useRef({
40
+ openByClick: false,
41
+ openByHoverOverCitation: false,
42
+ openByHoverOverPopover: false,
43
+ openByKeyboard: false
44
+ });
45
+ const isOpen = () => {
46
+ return citationInternalState.openByClick || citationInternalState.openByHoverOverCitation || citationInternalState.openByHoverOverPopover || citationInternalState.openByKeyboard;
47
+ };
48
+ const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);
49
+ const preventDefaultClose = React.useRef(false);
50
+ const handleCitationTargetEnter = e => {
51
+ citationInternalState.openByHoverOverCitation = true;
52
+ // We want to disable auto focus only if the popover is being opened by hovering over the citation
53
+ if (!citationInternalState.openByClick && !citationInternalState.openByKeyboard) {
54
+ setDisableAutoFocus(true);
55
+ }
56
+ setIsPopoverOpen(isOpen());
57
+ };
58
+ const handleCitationTargetLeave = e => {
59
+ citationInternalState.openByHoverOverCitation = false;
60
+ setTimeout(() => {
61
+ setIsPopoverOpen(isOpen());
62
+ }, getDelay(e.type));
63
+ };
64
+ const handleCitationClick = e => {
65
+ // Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the citation as we want to control that behavior.
66
+ preventDefaultClose.current = true;
67
+ // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via click.
68
+ setDisableAutoFocus(false);
69
+ // If openByKeyboard is true, then the popover was already opened via keyboard and we always want to close it.
70
+ citationInternalState.openByClick = citationInternalState.openByKeyboard ? false : !citationInternalState.openByClick;
71
+ citationInternalState.openByHoverOverCitation = false;
72
+ citationInternalState.openByHoverOverPopover = false;
73
+ citationInternalState.openByKeyboard = false;
74
+ setIsPopoverOpen(isOpen());
75
+ };
76
+ const handleCitationKeyDown = e => {
77
+ if (e.key === Enter) {
78
+ clearTimeout();
79
+ // Setting default prevented so the enter key does not trigger a click event or onPopoverOpenChange.
80
+ e.preventDefault();
81
+ // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.
82
+ setDisableAutoFocus(false);
83
+ // If openByClick is true, then the popover was already opened via click and we always want to close it.
84
+ citationInternalState.openByKeyboard = citationInternalState.openByClick ? false : !citationInternalState.openByKeyboard;
85
+ citationInternalState.openByClick = false;
86
+ citationInternalState.openByHoverOverCitation = false;
87
+ citationInternalState.openByHoverOverPopover = false;
88
+ setIsPopoverOpen(isOpen());
89
+ }
90
+ };
91
+ const handlePopoverTargetEnter = e => {
92
+ citationInternalState.openByHoverOverPopover = true;
93
+ setIsPopoverOpen(isOpen());
94
+ };
95
+ const handlePopoverTargetLeave = e => {
96
+ citationInternalState.openByHoverOverPopover = false;
97
+ setTimeout(() => {
98
+ setIsPopoverOpen(isOpen());
99
+ }, getDelay(e.type));
100
+ };
101
+ const onPopoverOpenChange = (e, data) => {
102
+ if (!data.open) {
103
+ // We set all open state to false if preventDefaultClose was not set to true
104
+ if (!preventDefaultClose.current) {
105
+ clearTimeout();
106
+ citationInternalState.openByClick = false;
107
+ citationInternalState.openByHoverOverCitation = false;
108
+ citationInternalState.openByHoverOverPopover = false;
109
+ citationInternalState.openByKeyboard = false;
110
+ // use isOpen if managing owned popover, otherwise use data.open
111
+ const open = popover ? isOpen() : data.open;
112
+ setIsPopoverOpen(open);
113
+ }
114
+ }
115
+ preventDefaultClose.current = false;
116
+ };
117
+ // hitting escape should close the popover if it was opened by hover
118
+ // this is necessary to attach to the document because focus is likely not within the citation or popover
119
+ useIsomorphicLayoutEffect(() => {
120
+ if (isPopoverOpen) {
121
+ const onDocumentKeyDown = e => {
122
+ const openedByHover = !citationInternalState.openByClick && !citationInternalState.openByKeyboard;
123
+ if (openedByHover && e.key === Escape) {
124
+ clearTimeout();
125
+ // We set state back to its default if the Escape key has been pressed
126
+ setDisableAutoFocus(true);
127
+ citationInternalState.openByClick = false;
128
+ citationInternalState.openByHoverOverCitation = false;
129
+ citationInternalState.openByHoverOverPopover = false;
130
+ citationInternalState.openByKeyboard = false;
131
+ setIsPopoverOpen(isOpen());
132
+ e.stopPropagation();
133
+ }
134
+ };
135
+ targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.addEventListener('keydown', onDocumentKeyDown, {
136
+ capture: true
137
+ });
138
+ return () => {
139
+ targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.removeEventListener('keydown', onDocumentKeyDown, {
140
+ capture: true
141
+ });
142
+ };
143
+ }
144
+ }, [targetDocument, isPopoverOpen]);
145
+ const isPopoverLocked = usePreviewContext_unstable(ctx => ctx.isPreviewLocked) && props['aria-expanded'] || citationInternalState.openByClick || citationInternalState.openByKeyboard;
146
+ const state = {
147
+ block,
148
+ disableAutoFocus,
149
+ isPopoverOpen,
150
+ isPopoverLocked,
151
+ onPopoverOpenChange,
152
+ components: {
153
+ root: 'a',
154
+ popover: 'div',
155
+ popoverSurface: PopoverSurface
156
+ },
157
+ root: slot.always(getNativeElementProps('a', {
158
+ ref,
159
+ href: referenceHref,
160
+ role: null,
161
+ 'aria-expanded': null,
162
+ ...otherProps
163
+ }), {
164
+ elementType: 'a'
165
+ }),
166
+ popover: slot.optional(popover, {
167
+ elementType: 'div'
168
+ }),
169
+ popoverSurface: slot.optional(popoverSurface, {
170
+ defaultProps: {
171
+ id: popoverId,
172
+ 'aria-labelledby': popoverId
173
+ },
174
+ elementType: PopoverSurface,
175
+ renderByDefault: true
176
+ })
177
+ };
178
+ // attach popover handling events only if a popover is present
179
+ if (state.popover) {
180
+ state.root.onMouseEnter = mergeCallbacks(state.root.onMouseEnter, handleCitationTargetEnter);
181
+ state.root.onMouseLeave = mergeCallbacks(state.root.onMouseLeave, handleCitationTargetLeave);
182
+ state.root.onBlur = mergeCallbacks(state.root.onBlur, handleCitationTargetLeave);
183
+ state.root.onClick = mergeCallbacks(state.root.onClick, handleCitationClick);
184
+ state.root.onKeyDown = mergeCallbacks(state.root.onKeyDown, handleCitationKeyDown);
185
+ state.popover.onMouseEnter = mergeCallbacks(state.popover.onMouseEnter, handlePopoverTargetEnter);
186
+ state.popover.onMouseLeave = mergeCallbacks(state.popover.onMouseLeave, handlePopoverTargetLeave);
187
+ state.popover.onFocus = mergeCallbacks(state.popover.onFocus, handlePopoverTargetEnter);
188
+ }
189
+ return state;
190
+ };
191
+ //# sourceMappingURL=useCitation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useCitation.ts"],"sourcesContent":["import * as React from 'react';\nimport {\n getNativeElementProps,\n PopoverSurface,\n mergeCallbacks,\n slot,\n useFluent,\n useId,\n useIsomorphicLayoutEffect,\n} from '@fluentui/react-components';\nimport { Enter, Escape } from '@fluentui/keyboard-keys';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport type { OnOpenChangeData, OpenPopoverEvents } from '@fluentui/react-components';\nimport type { CitationProps, CitationState } from './Citation.types';\nimport { usePreviewContext_unstable } from '@fluentui-copilot/react-preview';\n\ntype CitationInternalState = {\n openByClick: boolean;\n openByHoverOverCitation: boolean;\n openByHoverOverPopover: boolean;\n openByKeyboard: boolean;\n};\n\nconst POPOVER_MOUSE_HIDE_DELAY = 500;\nconst POPOVER_KEYBOARD_HIDE_DELAY = 0;\n\nconst getDelay = (type: string): number => {\n if (type === 'focus' || type === 'blur') {\n return POPOVER_KEYBOARD_HIDE_DELAY;\n }\n\n return POPOVER_MOUSE_HIDE_DELAY;\n};\n\ntype TargetEvent<T> = React.MouseEvent<T> | React.FocusEvent<T>;\n\n/**\n * Create the state required to render Citation.\n *\n * The returned state can be modified with hooks such as useCitationStyles_unstable,\n * before being passed to renderCitation_unstable.\n *\n * @param props - props from this instance of Citation\n * @param ref - reference to root HTMLElement of Citation\n */\nexport const useCitation_unstable = (props: CitationProps, ref: React.Ref<HTMLElement>): CitationState => {\n const { popover, popoverSurface, referenceHref, block = false, ...otherProps } = props;\n\n const { targetDocument } = useFluent();\n const [setTimeout, clearTimeout] = useTimeout();\n const popoverId = useId('citation-popover-');\n\n const [disableAutoFocus, setDisableAutoFocus] = React.useState(true);\n\n const { current: citationInternalState } = React.useRef<CitationInternalState>({\n openByClick: false,\n openByHoverOverCitation: false,\n openByHoverOverPopover: false,\n openByKeyboard: false,\n });\n\n const isOpen = () => {\n return (\n citationInternalState.openByClick ||\n citationInternalState.openByHoverOverCitation ||\n citationInternalState.openByHoverOverPopover ||\n citationInternalState.openByKeyboard\n );\n };\n\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);\n const preventDefaultClose = React.useRef(false);\n\n const handleCitationTargetEnter = (e: TargetEvent<HTMLSpanElement>): void => {\n citationInternalState.openByHoverOverCitation = true;\n\n // We want to disable auto focus only if the popover is being opened by hovering over the citation\n if (!citationInternalState.openByClick && !citationInternalState.openByKeyboard) {\n setDisableAutoFocus(true);\n }\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleCitationTargetLeave = (e: TargetEvent<HTMLSpanElement>): void => {\n citationInternalState.openByHoverOverCitation = false;\n setTimeout(() => {\n setIsPopoverOpen(isOpen());\n }, getDelay(e.type));\n };\n\n const handleCitationClick = (e: TargetEvent<HTMLSpanElement>): void => {\n // Setting preventDefaultClose so that onPopoverOpenChange does not apply its logic when click is on the citation as we want to control that behavior.\n preventDefaultClose.current = true;\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via click.\n setDisableAutoFocus(false);\n\n // If openByKeyboard is true, then the popover was already opened via keyboard and we always want to close it.\n citationInternalState.openByClick = citationInternalState.openByKeyboard\n ? false\n : !citationInternalState.openByClick;\n citationInternalState.openByHoverOverCitation = false;\n citationInternalState.openByHoverOverPopover = false;\n citationInternalState.openByKeyboard = false;\n\n setIsPopoverOpen(isOpen());\n };\n\n const handleCitationKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>): void => {\n if (e.key === Enter) {\n clearTimeout();\n\n // Setting default prevented so the enter key does not trigger a click event or onPopoverOpenChange.\n e.preventDefault();\n\n // We set disableAutoFocus to false so that interactive elements within popover can be focused when it opens via keyboard.\n setDisableAutoFocus(false);\n\n // If openByClick is true, then the popover was already opened via click and we always want to close it.\n citationInternalState.openByKeyboard = citationInternalState.openByClick\n ? false\n : !citationInternalState.openByKeyboard;\n citationInternalState.openByClick = false;\n citationInternalState.openByHoverOverCitation = false;\n citationInternalState.openByHoverOverPopover = false;\n\n setIsPopoverOpen(isOpen());\n }\n };\n\n const handlePopoverTargetEnter = (e: TargetEvent<HTMLDivElement>): void => {\n citationInternalState.openByHoverOverPopover = true;\n setIsPopoverOpen(isOpen());\n };\n\n const handlePopoverTargetLeave = (e: TargetEvent<HTMLDivElement>): void => {\n citationInternalState.openByHoverOverPopover = false;\n setTimeout(() => {\n setIsPopoverOpen(isOpen());\n }, getDelay(e.type));\n };\n\n const onPopoverOpenChange = (e: OpenPopoverEvents, data: OnOpenChangeData): void => {\n if (!data.open) {\n // We set all open state to false if preventDefaultClose was not set to true\n if (!preventDefaultClose.current) {\n clearTimeout();\n citationInternalState.openByClick = false;\n citationInternalState.openByHoverOverCitation = false;\n citationInternalState.openByHoverOverPopover = false;\n citationInternalState.openByKeyboard = false;\n\n // use isOpen if managing owned popover, otherwise use data.open\n const open = popover ? isOpen() : data.open;\n setIsPopoverOpen(open);\n }\n }\n\n preventDefaultClose.current = false;\n };\n\n // hitting escape should close the popover if it was opened by hover\n // this is necessary to attach to the document because focus is likely not within the citation or popover\n useIsomorphicLayoutEffect(() => {\n if (isPopoverOpen) {\n const onDocumentKeyDown = (e: KeyboardEvent) => {\n const openedByHover = !citationInternalState.openByClick && !citationInternalState.openByKeyboard;\n if (openedByHover && e.key === Escape) {\n clearTimeout();\n\n // We set state back to its default if the Escape key has been pressed\n setDisableAutoFocus(true);\n citationInternalState.openByClick = false;\n citationInternalState.openByHoverOverCitation = false;\n citationInternalState.openByHoverOverPopover = false;\n citationInternalState.openByKeyboard = false;\n\n setIsPopoverOpen(isOpen());\n\n e.stopPropagation();\n }\n };\n\n targetDocument?.addEventListener('keydown', onDocumentKeyDown, { capture: true });\n\n return () => {\n targetDocument?.removeEventListener('keydown', onDocumentKeyDown, { capture: true });\n };\n }\n }, [targetDocument, isPopoverOpen]);\n\n const isPopoverLocked =\n (usePreviewContext_unstable(ctx => ctx.isPreviewLocked) && (props['aria-expanded'] as boolean)) ||\n citationInternalState.openByClick ||\n citationInternalState.openByKeyboard;\n\n const state: CitationState = {\n block,\n disableAutoFocus,\n isPopoverOpen,\n isPopoverLocked,\n onPopoverOpenChange,\n components: {\n root: 'a',\n popover: 'div',\n popoverSurface: PopoverSurface,\n },\n root: slot.always(\n getNativeElementProps('a', {\n ref,\n href: referenceHref,\n role: null,\n 'aria-expanded': null,\n ...otherProps,\n }),\n { elementType: 'a' },\n ),\n popover: slot.optional(popover, { elementType: 'div' }),\n popoverSurface: slot.optional(popoverSurface, {\n defaultProps: {\n id: popoverId,\n 'aria-labelledby': popoverId,\n },\n elementType: PopoverSurface,\n renderByDefault: true,\n }),\n };\n\n // attach popover handling events only if a popover is present\n\n if (state.popover) {\n state.root.onMouseEnter = mergeCallbacks(state.root.onMouseEnter, handleCitationTargetEnter);\n state.root.onMouseLeave = mergeCallbacks(state.root.onMouseLeave, handleCitationTargetLeave);\n state.root.onBlur = mergeCallbacks(state.root.onBlur, handleCitationTargetLeave);\n state.root.onClick = mergeCallbacks(state.root.onClick, handleCitationClick);\n state.root.onKeyDown = mergeCallbacks(state.root.onKeyDown, handleCitationKeyDown);\n state.popover.onMouseEnter = mergeCallbacks(state.popover.onMouseEnter, handlePopoverTargetEnter);\n state.popover.onMouseLeave = mergeCallbacks(state.popover.onMouseLeave, handlePopoverTargetLeave);\n state.popover.onFocus = mergeCallbacks(state.popover.onFocus, handlePopoverTargetEnter);\n }\n\n return state;\n};\n"],"names":["React","getNativeElementProps","PopoverSurface","mergeCallbacks","slot","useFluent","useId","useIsomorphicLayoutEffect","Enter","Escape","useTimeout","usePreviewContext_unstable","POPOVER_MOUSE_HIDE_DELAY","POPOVER_KEYBOARD_HIDE_DELAY","getDelay","type","useCitation_unstable","props","ref","popover","popoverSurface","referenceHref","block","otherProps","targetDocument","setTimeout","clearTimeout","popoverId","disableAutoFocus","setDisableAutoFocus","useState","current","citationInternalState","useRef","openByClick","openByHoverOverCitation","openByHoverOverPopover","openByKeyboard","isOpen","isPopoverOpen","setIsPopoverOpen","preventDefaultClose","handleCitationTargetEnter","e","handleCitationTargetLeave","handleCitationClick","handleCitationKeyDown","key","preventDefault","handlePopoverTargetEnter","handlePopoverTargetLeave","onPopoverOpenChange","data","open","onDocumentKeyDown","openedByHover","stopPropagation","addEventListener","capture","removeEventListener","isPopoverLocked","ctx","isPreviewLocked","state","components","root","always","href","role","elementType","optional","defaultProps","id","renderByDefault","onMouseEnter","onMouseLeave","onBlur","onClick","onKeyDown","onFocus"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { __resetStyles, __styles, mergeClasses, shorthands, tokens, typographyStyles } from '@fluentui/react-components';
2
+ export const citationClassNames = {
3
+ root: 'fai-Citation',
4
+ popover: 'fai-Citation__popover',
5
+ popoverSurface: 'fai-Citation__popoverSurface'
6
+ };
7
+ const useCitationBaseClassName = __resetStyles("rad2akz", "r1hx2d32", [".rad2akz{display:inline-flex;justify-content:center;box-sizing:border-box;align-items:center;font-family:var(--fontFamilyBase);font-size:var(--fontSizeBase100);font-weight:var(--fontWeightSemibold);line-height:var(--lineHeightBase100);color:var(--colorNeutralForeground2);border:var(--strokeWidthThin) solid var(--colorNeutralStroke2);min-width:14px;height:14px;vertical-align:calc((var(--lineHeightBase100) - var(--fontSizeBase100)) / 2);border-radius:var(--borderRadiusMedium);text-decoration:none;margin-left:var(--spacingHorizontalXXS);margin-right:var(--spacingHorizontalXXS);}", ".rad2akz:hover{cursor:pointer;color:var(--colorBrandForeground2Hover);border-color:var(--colorBrandStroke2Hover);background-color:var(--colorBrandBackground2Hover);}", ".rad2akz:hover:active{cursor:pointer;color:var(--colorBrandForeground2Pressed);border-color:var(--colorBrandStroke2Pressed);background-color:var(--colorBrandBackground2Pressed);}", ".r1hx2d32{display:inline-flex;justify-content:center;box-sizing:border-box;align-items:center;font-family:var(--fontFamilyBase);font-size:var(--fontSizeBase100);font-weight:var(--fontWeightSemibold);line-height:var(--lineHeightBase100);color:var(--colorNeutralForeground2);border:var(--strokeWidthThin) solid var(--colorNeutralStroke2);min-width:14px;height:14px;vertical-align:calc((var(--lineHeightBase100) - var(--fontSizeBase100)) / 2);border-radius:var(--borderRadiusMedium);text-decoration:none;margin-right:var(--spacingHorizontalXXS);margin-left:var(--spacingHorizontalXXS);}", ".r1hx2d32:hover{cursor:pointer;color:var(--colorBrandForeground2Hover);border-color:var(--colorBrandStroke2Hover);background-color:var(--colorBrandBackground2Hover);}", ".r1hx2d32:hover:active{cursor:pointer;color:var(--colorBrandForeground2Pressed);border-color:var(--colorBrandStroke2Pressed);background-color:var(--colorBrandBackground2Pressed);}"]);
8
+ const useCitationRootStyles = __styles({
9
+ isBlock: {
10
+ mc9l5x: "f22iagw",
11
+ Frg6f3: ["f1tyq0we", "f11qmguv"],
12
+ t21cq0: ["f11qmguv", "f1tyq0we"]
13
+ },
14
+ isPopoverLocked: {
15
+ sj55zd: "fkjhhq2",
16
+ g2u3we: "f1nbqb3e",
17
+ h3c5rm: ["fah3j9v", "f56crja"],
18
+ B9xav0g: "fef4ti1",
19
+ zhjwy3: ["f56crja", "fah3j9v"],
20
+ De3pzq: "f16xkysk",
21
+ Bi91k9c: "fbszb7v",
22
+ Bgoe8wy: "ftxwbyd",
23
+ Bwzppfd: ["f1p7dilp", "f15x2k42"],
24
+ oetu4i: "fegdlwn",
25
+ gg5e9n: ["f15x2k42", "f1p7dilp"],
26
+ Jwef8y: "f121v1wq"
27
+ }
28
+ }, {
29
+ d: [".f22iagw{display:flex;}", ".f1tyq0we{margin-left:0;}", ".f11qmguv{margin-right:0;}", ".fkjhhq2{color:var(--colorBrandForeground2Pressed);}", ".f1nbqb3e{border-top-color:var(--colorBrandStroke2Pressed);}", ".fah3j9v{border-right-color:var(--colorBrandStroke2Pressed);}", ".f56crja{border-left-color:var(--colorBrandStroke2Pressed);}", ".fef4ti1{border-bottom-color:var(--colorBrandStroke2Pressed);}", ".f16xkysk{background-color:var(--colorBrandBackground2);}"],
30
+ h: [".fbszb7v:hover{color:var(--colorBrandForeground2Pressed);}", ".ftxwbyd:hover{border-top-color:var(--colorBrandStroke2Pressed);}", ".f1p7dilp:hover{border-right-color:var(--colorBrandStroke2Pressed);}", ".f15x2k42:hover{border-left-color:var(--colorBrandStroke2Pressed);}", ".fegdlwn:hover{border-bottom-color:var(--colorBrandStroke2Pressed);}", ".f121v1wq:hover{background-color:var(--colorBrandBackground2);}"]
31
+ });
32
+ /**
33
+ * Apply styling to the Citation slots based on the state
34
+ */
35
+ export const useCitationStyles_unstable = state => {
36
+ const rootBaseClassName = useCitationBaseClassName();
37
+ const rootStyles = useCitationRootStyles();
38
+ state.root.className = mergeClasses(citationClassNames.root, state.isPopoverLocked && rootStyles.isPopoverLocked, state.block && rootStyles.isBlock, rootBaseClassName, state.root.className);
39
+ if (state.popover) {
40
+ state.popover.className = mergeClasses(citationClassNames.popover, state.popover.className);
41
+ }
42
+ return state;
43
+ };
44
+ //# sourceMappingURL=useCitationStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useCitationStyles.ts"],"sourcesContent":["import {\n makeResetStyles,\n makeStyles,\n mergeClasses,\n shorthands,\n tokens,\n typographyStyles,\n} from '@fluentui/react-components';\nimport type { CitationSlots, CitationState } from './Citation.types';\nimport type { SlotClassNames } from '@fluentui/react-components';\n\nexport const citationClassNames: SlotClassNames<CitationSlots> = {\n root: 'fai-Citation',\n popover: 'fai-Citation__popover',\n popoverSurface: 'fai-Citation__popoverSurface',\n};\n\nconst useCitationBaseClassName = makeResetStyles({\n display: 'inline-flex',\n justifyContent: 'center',\n boxSizing: 'border-box',\n alignItems: 'center',\n ...typographyStyles.caption2Strong,\n\n color: tokens.colorNeutralForeground2,\n border: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke2}`,\n\n minWidth: '14px',\n height: '14px',\n verticalAlign: `calc((${typographyStyles.caption2Strong.lineHeight} - ${typographyStyles.caption2Strong.fontSize}) / 2)`,\n\n borderRadius: tokens.borderRadiusMedium,\n\n textDecoration: 'none',\n\n marginLeft: tokens.spacingHorizontalXXS,\n marginRight: tokens.spacingHorizontalXXS,\n\n ':hover': {\n cursor: 'pointer',\n color: tokens.colorBrandForeground2Hover,\n borderColor: tokens.colorBrandStroke2Hover,\n backgroundColor: tokens.colorBrandBackground2Hover,\n },\n\n ':hover:active': {\n cursor: 'pointer',\n color: tokens.colorBrandForeground2Pressed,\n borderColor: tokens.colorBrandStroke2Pressed,\n backgroundColor: tokens.colorBrandBackground2Pressed,\n },\n});\n\nconst useCitationRootStyles = makeStyles({\n isBlock: {\n display: 'flex',\n marginLeft: 0,\n marginRight: 0,\n },\n isPopoverLocked: {\n color: tokens.colorBrandForeground2Pressed,\n ...shorthands.borderColor(tokens.colorBrandStroke2Pressed),\n backgroundColor: tokens.colorBrandBackground2,\n ':hover': {\n color: tokens.colorBrandForeground2Pressed,\n ...shorthands.borderColor(tokens.colorBrandStroke2Pressed),\n backgroundColor: tokens.colorBrandBackground2,\n },\n },\n});\n\n/**\n * Apply styling to the Citation slots based on the state\n */\nexport const useCitationStyles_unstable = (state: CitationState): CitationState => {\n const rootBaseClassName = useCitationBaseClassName();\n const rootStyles = useCitationRootStyles();\n state.root.className = mergeClasses(\n citationClassNames.root,\n state.isPopoverLocked && rootStyles.isPopoverLocked,\n state.block && rootStyles.isBlock,\n rootBaseClassName,\n state.root.className,\n );\n if (state.popover) {\n state.popover.className = mergeClasses(citationClassNames.popover, state.popover.className);\n }\n\n return state;\n};\n"],"names":["makeResetStyles","makeStyles","mergeClasses","shorthands","tokens","typographyStyles","citationClassNames","root","popover","popoverSurface","useCitationBaseClassName","display","justifyContent","boxSizing","alignItems","caption2Strong","color","colorNeutralForeground2","border","strokeWidthThin","colorNeutralStroke2","minWidth","height","verticalAlign","lineHeight","fontSize","borderRadius","borderRadiusMedium","textDecoration","marginLeft","spacingHorizontalXXS","marginRight","cursor","colorBrandForeground2Hover","borderColor","colorBrandStroke2Hover","backgroundColor","colorBrandBackground2Hover","colorBrandForeground2Pressed","colorBrandStroke2Pressed","colorBrandBackground2Pressed","useCitationRootStyles","isBlock","isPopoverLocked","colorBrandBackground2","useCitationStyles_unstable","state","rootBaseClassName","rootStyles","className","block"],"mappings":"AAAA,SACEA,eAAe,EACfC,UAAU,EACVC,YAAY,EACZC,UAAU,EACVC,MAAM,EACNC,gBAAgB,QACX,6BAA6B;AAIpC,OAAO,MAAMC,qBAAoD;IAC/DC,MAAM;IACNC,SAAS;IACTC,gBAAgB;AAClB,EAAE;AAEF,MAAMC,2BAA2BV,gBAAgB;IAC/CW,SAAS;IACTC,gBAAgB;IAChBC,WAAW;IACXC,YAAY;IACZ,GAAGT,iBAAiBU,cAAc;IAElCC,OAAOZ,OAAOa,uBAAuB;IACrCC,QAAQ,CAAC,EAAEd,OAAOe,eAAe,CAAC,OAAO,EAAEf,OAAOgB,mBAAmB,CAAC,CAAC;IAEvEC,UAAU;IACVC,QAAQ;IACRC,eAAe,CAAC,MAAM,EAAElB,iBAAiBU,cAAc,CAACS,UAAU,CAAC,GAAG,EAAEnB,iBAAiBU,cAAc,CAACU,QAAQ,CAAC,MAAM,CAAC;IAExHC,cAActB,OAAOuB,kBAAkB;IAEvCC,gBAAgB;IAEhBC,YAAYzB,OAAO0B,oBAAoB;IACvCC,aAAa3B,OAAO0B,oBAAoB;IAExC,UAAU;QACRE,QAAQ;QACRhB,OAAOZ,OAAO6B,0BAA0B;QACxCC,aAAa9B,OAAO+B,sBAAsB;QAC1CC,iBAAiBhC,OAAOiC,0BAA0B;IACpD;IAEA,iBAAiB;QACfL,QAAQ;QACRhB,OAAOZ,OAAOkC,4BAA4B;QAC1CJ,aAAa9B,OAAOmC,wBAAwB;QAC5CH,iBAAiBhC,OAAOoC,4BAA4B;IACtD;AACF;AAEA,MAAMC,wBAAwBxC,WAAW;IACvCyC,SAAS;QACP/B,SAAS;QACTkB,YAAY;QACZE,aAAa;IACf;IACAY,iBAAiB;QACf3B,OAAOZ,OAAOkC,4BAA4B;QAC1C,GAAGnC,WAAW+B,WAAW,CAAC9B,OAAOmC,wBAAwB,CAAC;QAC1DH,iBAAiBhC,OAAOwC,qBAAqB;QAC7C,UAAU;YACR5B,OAAOZ,OAAOkC,4BAA4B;YAC1C,GAAGnC,WAAW+B,WAAW,CAAC9B,OAAOmC,wBAAwB,CAAC;YAC1DH,iBAAiBhC,OAAOwC,qBAAqB;QAC/C;IACF;AACF;AAEA;;CAEC,GACD,OAAO,MAAMC,6BAA6B,CAACC;IACzC,MAAMC,oBAAoBrC;IAC1B,MAAMsC,aAAaP;IACnBK,MAAMvC,IAAI,CAAC0C,SAAS,GAAG/C,aACrBI,mBAAmBC,IAAI,EACvBuC,MAAMH,eAAe,IAAIK,WAAWL,eAAe,EACnDG,MAAMI,KAAK,IAAIF,WAAWN,OAAO,EACjCK,mBACAD,MAAMvC,IAAI,CAAC0C,SAAS;IAEtB,IAAIH,MAAMtC,OAAO,EAAE;QACjBsC,MAAMtC,OAAO,CAACyC,SAAS,GAAG/C,aAAaI,mBAAmBE,OAAO,EAAEsC,MAAMtC,OAAO,CAACyC,SAAS;IAC5F;IAEA,OAAOH;AACT,EAAE"}
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import { useReference_unstable } from './useReference';
3
+ import { renderReference_unstable } from './renderReference';
4
+ import { useReferenceStyles_unstable } from './useReferenceStyles';
5
+ import { useCustomStyleHook } from '@fluentui-copilot/react-provider';
6
+ // Reference component - TODO: add more docs
7
+ export const Reference = /*#__PURE__*/React.forwardRef((props, ref) => {
8
+ const state = useReference_unstable(props, ref);
9
+ useReferenceStyles_unstable(state);
10
+ useCustomStyleHook('useReferenceStyles')(state);
11
+ return renderReference_unstable(state);
12
+ });
13
+ Reference.displayName = 'Reference';
14
+ //# sourceMappingURL=Reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["Reference.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useReference_unstable } from './useReference';\nimport { renderReference_unstable } from './renderReference';\nimport { useReferenceStyles_unstable } from './useReferenceStyles';\nimport type { ReferenceProps } from './Reference.types';\nimport type { ForwardRefComponent } from '@fluentui/react-components';\nimport { useCustomStyleHook } from '@fluentui-copilot/react-provider';\n\n// Reference component - TODO: add more docs\nexport const Reference: ForwardRefComponent<ReferenceProps> = React.forwardRef((props, ref) => {\n const state = useReference_unstable(props, ref);\n\n useReferenceStyles_unstable(state);\n useCustomStyleHook('useReferenceStyles')(state);\n\n return renderReference_unstable(state);\n});\n\nReference.displayName = 'Reference';\n"],"names":["React","useReference_unstable","renderReference_unstable","useReferenceStyles_unstable","useCustomStyleHook","Reference","forwardRef","props","ref","state","displayName"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,qBAAqB,QAAQ,iBAAiB;AACvD,SAASC,wBAAwB,QAAQ,oBAAoB;AAC7D,SAASC,2BAA2B,QAAQ,uBAAuB;AAGnE,SAASC,kBAAkB,QAAQ,mCAAmC;AAEtE,4CAA4C;AAC5C,OAAO,MAAMC,0BAAiDL,MAAMM,UAAU,CAAC,CAACC,OAAOC;IACrF,MAAMC,QAAQR,sBAAsBM,OAAOC;IAE3CL,4BAA4BM;IAC5BL,mBAAmB,sBAAsBK;IAEzC,OAAOP,yBAAyBO;AAClC,GAAG;AAEHJ,UAAUK,WAAW,GAAG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Reference.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["Reference.types.ts"],"sourcesContent":["import type { CopilotMode } from '@fluentui-copilot/react-provider';\nimport type { Button, ComponentProps, ComponentState, Slot } from '@fluentui/react-components';\n\nexport type ReferenceSlots = {\n /**\n * The root slot.\n */\n root: NonNullable<Slot<'div'>>;\n\n /**\n * Citation slot. Displays a `Citation`. Set the `null` to hide the citation.\n */\n citation: Slot<'div'>;\n\n /**\n * Media slot. Used to display Avatars, Icons, etc.\n */\n media: Slot<'div'>;\n\n /**\n * Actions slot.\n */\n actions: Slot<'div'>;\n\n /**\n * Label slot. Primary description of the reference.\n */\n label: NonNullable<Slot<'div'>>;\n\n /**\n * Sensitivity slot. Used to display a `SensitivityLabel`.\n */\n sensitivity: Slot<'span'>;\n\n /**\n * @deprecated Use `sensitivity` instead.\n * Sensitivity label slot. Displays a label indicating how sensitive the information displayed in the reference is.\n */\n sensitivityLabel: Slot<'span'>;\n\n /**\n * Metadata slot. Container for `primaryText`, `secondaryText`, `tertiaryText` and `icon`.\n */\n metadata: NonNullable<Slot<'div'>>;\n\n /**\n * Primary text slot. First displayed metadata text.\n */\n primaryText: Slot<'span'>;\n\n /**\n * Secondary text slot. Second displayed metadata text.\n */\n secondaryText: Slot<'span'>;\n\n /**\n * Tertiary text slot. Third displayed metadata text.\n */\n tertiaryText: Slot<'span'>;\n\n /**\n * Icon slot. Icon displayed in metadata area.\n */\n icon: Slot<'span'>;\n\n /**\n * Content slot.\n */\n content: NonNullable<Slot<'div'>>;\n\n /**\n * Details button slot. Used to expand/collapse the reference.\n */\n detailsButton: Slot<typeof Button>;\n};\n\n/**\n * Reference Props\n */\nexport type ReferenceProps = ComponentProps<Partial<ReferenceSlots>> &\n CopilotMode & {\n /**\n * Numeric index associated with `Citation`.\n */\n index: number;\n\n /**\n * HREF back to the `Citation` this `Reference` is associated with.\n */\n citationHref?: string;\n\n /**\n * Unique ID associated with this `Reference`.\n */\n referenceId?: string;\n\n /**\n * Text snippet from the reference source.\n */\n excerpt?: string;\n\n layout?: 'inline' | 'popover';\n };\n\n/**\n * State used in rendering Reference\n */\nexport type ReferenceState = ComponentState<ReferenceSlots> &\n Required<Pick<ReferenceProps, 'mode' | 'layout' | 'index'>> & {\n /**\n * State used to renderer the `Reference` in an expanded state.\n */\n isExpanded: boolean;\n };\n"],"names":[],"mappings":"AAAA,WAiHI"}
@@ -0,0 +1,6 @@
1
+ export * from './Reference';
2
+ export * from './Reference.types';
3
+ export * from './renderReference';
4
+ export * from './useReference';
5
+ export * from './useReferenceStyles';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"sourcesContent":["export * from './Reference';\nexport * from './Reference.types';\nexport * from './renderReference';\nexport * from './useReference';\nexport * from './useReferenceStyles';\n"],"names":[],"mappings":"AAAA,cAAc,cAAc;AAC5B,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,iBAAiB;AAC/B,cAAc,uBAAuB"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@fluentui/react-jsx-runtime/jsx-runtime";
2
+ import { assertSlots } from '@fluentui/react-components';
3
+ /**
4
+ * Render the final JSX of Reference
5
+ */
6
+ export const renderReference_unstable = state => {
7
+ assertSlots(state);
8
+ return /*#__PURE__*/_jsxs(state.root, {
9
+ children: [state.citation && /*#__PURE__*/_jsx(state.citation, {}), state.media && /*#__PURE__*/_jsx(state.media, {}), /*#__PURE__*/_jsx(state.label, {}), state.actions && /*#__PURE__*/_jsxs(state.actions, {
10
+ children: [state.actions.children, state.detailsButton && /*#__PURE__*/_jsx(state.detailsButton, {})]
11
+ }), state.sensitivityLabel && /*#__PURE__*/_jsx(state.sensitivityLabel, {}), state.sensitivity && /*#__PURE__*/_jsx(state.sensitivity, {}), /*#__PURE__*/_jsxs(state.metadata, {
12
+ children: [state.primaryText && /*#__PURE__*/_jsx(state.primaryText, {}), state.secondaryText && /*#__PURE__*/_jsx(state.secondaryText, {}), state.tertiaryText && /*#__PURE__*/_jsx(state.tertiaryText, {}), state.icon && /*#__PURE__*/_jsx(state.icon, {}), state.metadata.children]
13
+ }), /*#__PURE__*/_jsx(state.content, {})]
14
+ });
15
+ };
16
+ //# sourceMappingURL=renderReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["renderReference.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\n\nimport { assertSlots } from '@fluentui/react-components';\n\nimport type { ReferenceState, ReferenceSlots } from './Reference.types';\n\n/**\n * Render the final JSX of Reference\n */\nexport const renderReference_unstable = (state: ReferenceState) => {\n assertSlots<ReferenceSlots>(state);\n\n return (\n <state.root>\n {state.citation && <state.citation />}\n {state.media && <state.media />}\n <state.label />\n {state.actions && (\n <state.actions>\n {state.actions.children}\n {state.detailsButton && <state.detailsButton />}\n </state.actions>\n )}\n {state.sensitivityLabel && <state.sensitivityLabel />}\n {state.sensitivity && <state.sensitivity />}\n <state.metadata>\n {state.primaryText && <state.primaryText />}\n {state.secondaryText && <state.secondaryText />}\n {state.tertiaryText && <state.tertiaryText />}\n {state.icon && <state.icon />}\n {state.metadata.children}\n </state.metadata>\n <state.content />\n </state.root>\n );\n};\n"],"names":["assertSlots","renderReference_unstable","state","root","citation","media","label","actions","children","detailsButton","sensitivityLabel","sensitivity","metadata","primaryText","secondaryText","tertiaryText","icon","content"],"mappings":"AAAA,0BAA0B,GAC1B,iDAAiD;AAEjD,SAASA,WAAW,QAAQ,6BAA6B;AAIzD;;CAEC,GACD,OAAO,MAAMC,2BAA2B,CAACC;IACvCF,YAA4BE;IAE5B,qBACE,MAACA,MAAMC,IAAI;;YACRD,MAAME,QAAQ,kBAAI,KAACF,MAAME,QAAQ;YACjCF,MAAMG,KAAK,kBAAI,KAACH,MAAMG,KAAK;0BAC5B,KAACH,MAAMI,KAAK;YACXJ,MAAMK,OAAO,kBACZ,MAACL,MAAMK,OAAO;;oBACXL,MAAMK,OAAO,CAACC,QAAQ;oBACtBN,MAAMO,aAAa,kBAAI,KAACP,MAAMO,aAAa;;;YAG/CP,MAAMQ,gBAAgB,kBAAI,KAACR,MAAMQ,gBAAgB;YACjDR,MAAMS,WAAW,kBAAI,KAACT,MAAMS,WAAW;0BACxC,MAACT,MAAMU,QAAQ;;oBACZV,MAAMW,WAAW,kBAAI,KAACX,MAAMW,WAAW;oBACvCX,MAAMY,aAAa,kBAAI,KAACZ,MAAMY,aAAa;oBAC3CZ,MAAMa,YAAY,kBAAI,KAACb,MAAMa,YAAY;oBACzCb,MAAMc,IAAI,kBAAI,KAACd,MAAMc,IAAI;oBACzBd,MAAMU,QAAQ,CAACJ,QAAQ;;;0BAE1B,KAACN,MAAMe,OAAO;;;AAGpB,EAAE"}
@@ -0,0 +1,197 @@
1
+ import * as React from 'react';
2
+ import { Button, Caption1, getNativeElementProps, mergeCallbacks, mergeClasses, slot, useId, usePopoverContext_unstable as usePopoverContext } from '@fluentui/react-components';
3
+ import { ChevronDown24Regular, ChevronUp24Regular, ChevronDown16Regular, ChevronUp16Regular } from '@fluentui/react-icons';
4
+ import { referenceExtraClassNames } from './useReferenceStyles';
5
+ import { Citation } from '../Citation';
6
+ import { useReferenceGroupSetOpen } from '../../context/ReferenceGroupContext';
7
+ import { useCopilotMode } from '@fluentui-copilot/react-provider';
8
+ /**
9
+ * Create the state required to render Reference.
10
+ *
11
+ * The returned state can be modified with hooks such as useReferenceStyles_unstable,
12
+ * before being passed to renderReference_unstable.
13
+ *
14
+ * @param props - props from this instance of Reference
15
+ * @param ref - reference to root HTMLElement of Reference
16
+ */
17
+ export const useReference_unstable = (props, ref) => {
18
+ const {
19
+ index,
20
+ referenceId,
21
+ citationHref,
22
+ excerpt,
23
+ layout = 'inline'
24
+ } = props;
25
+ const mode = useCopilotMode(props.mode);
26
+ const labelId = useId();
27
+ const mediaId = useId();
28
+ const [isExpanded, setIsExpanded] = React.useState(layout === 'popover' ? true : false);
29
+ const setPopoverOpen = usePopoverContext(context => context.setOpen);
30
+ const onExpandClick = _e => {
31
+ setIsExpanded(!isExpanded);
32
+ };
33
+ const label = slot.always(props.label, {
34
+ defaultProps: {
35
+ id: labelId
36
+ },
37
+ elementType: 'div'
38
+ });
39
+ const media = slot.optional(props.media, {
40
+ defaultProps: {
41
+ id: mediaId
42
+ },
43
+ elementType: 'div'
44
+ });
45
+ if (media && /*#__PURE__*/React.isValidElement(media.children)) {
46
+ media.children = /*#__PURE__*/React.cloneElement(media.children, {
47
+ className: mergeClasses(media.children.props.className, referenceExtraClassNames.mediaChild)
48
+ });
49
+ }
50
+ if (media === null || media === void 0 ? void 0 : media.id) {
51
+ var _label_ariadescribedby;
52
+ var _label_ariadescribedby_concat;
53
+ label['aria-describedby'] = (_label_ariadescribedby_concat = (_label_ariadescribedby = label['aria-describedby']) === null || _label_ariadescribedby === void 0 ? void 0 : _label_ariadescribedby.concat(media.id)) !== null && _label_ariadescribedby_concat !== void 0 ? _label_ariadescribedby_concat : media.id;
54
+ }
55
+ const ariaLabelledByProp = props['aria-labelledby'];
56
+ const groupSemantics = React.useMemo(() => {
57
+ return layout === 'inline' ? {
58
+ role: 'group',
59
+ 'aria-labelledby': `${ariaLabelledByProp !== null && ariaLabelledByProp !== void 0 ? ariaLabelledByProp : ''} ${label.id}`,
60
+ tabIndex: -1
61
+ } : {};
62
+ }, [layout, ariaLabelledByProp, label.id]);
63
+ // Within a popup, a citation should function as a close button
64
+ const citationProps = React.useMemo(() => {
65
+ const onPopoverCloseClick = e => {
66
+ setPopoverOpen(e, false);
67
+ // don't navigate
68
+ e.preventDefault();
69
+ };
70
+ return layout === 'popover' ? {
71
+ referenceHref: '#',
72
+ tabIndex: -1,
73
+ 'aria-label': `Reference ${index}, close`,
74
+ onClick: onPopoverCloseClick
75
+ } : {
76
+ referenceHref: citationHref
77
+ };
78
+ }, [layout, citationHref, index, setPopoverOpen]);
79
+ const state = {
80
+ isExpanded,
81
+ mode: layout === 'popover' ? 'sidecar' : mode,
82
+ layout,
83
+ index,
84
+ components: {
85
+ root: 'div',
86
+ citation: 'div',
87
+ media: 'div',
88
+ actions: 'div',
89
+ label: 'div',
90
+ sensitivity: 'span',
91
+ sensitivityLabel: 'span',
92
+ metadata: 'div',
93
+ content: 'div',
94
+ primaryText: 'span',
95
+ secondaryText: 'span',
96
+ tertiaryText: 'span',
97
+ icon: 'span',
98
+ detailsButton: Button
99
+ },
100
+ root: slot.always(getNativeElementProps('div', {
101
+ ref,
102
+ id: referenceId,
103
+ ...groupSemantics,
104
+ ...props
105
+ }), {
106
+ elementType: 'div'
107
+ }),
108
+ citation: slot.optional(props.citation, {
109
+ defaultProps: {
110
+ children: /*#__PURE__*/React.createElement(Citation, {
111
+ block: true,
112
+ referenceId: referenceId,
113
+ ...citationProps
114
+ }, index)
115
+ },
116
+ renderByDefault: true,
117
+ elementType: 'div'
118
+ }),
119
+ media,
120
+ actions: slot.optional(layout === 'inline' ? props.actions : null, {
121
+ renderByDefault: true,
122
+ elementType: 'div'
123
+ }),
124
+ label,
125
+ sensitivity: slot.optional(props.sensitivity, {
126
+ elementType: 'span'
127
+ }),
128
+ sensitivityLabel: slot.optional(props.sensitivityLabel, {
129
+ elementType: 'span'
130
+ }),
131
+ metadata: slot.always(props.metadata, {
132
+ elementType: 'div'
133
+ }),
134
+ primaryText: slot.optional(props.primaryText, {
135
+ defaultProps: {
136
+ hidden: !isExpanded
137
+ },
138
+ elementType: 'span'
139
+ }),
140
+ secondaryText: slot.optional(props.secondaryText, {
141
+ defaultProps: {
142
+ hidden: !isExpanded
143
+ },
144
+ elementType: 'span'
145
+ }),
146
+ tertiaryText: slot.optional(props.tertiaryText, {
147
+ defaultProps: {
148
+ hidden: !isExpanded
149
+ },
150
+ elementType: 'span'
151
+ }),
152
+ icon: slot.optional(props.icon, {
153
+ elementType: 'span'
154
+ }),
155
+ content: slot.always(props.content, {
156
+ defaultProps: {
157
+ children: excerpt && /*#__PURE__*/React.createElement(Caption1, null, excerpt)
158
+ },
159
+ elementType: 'div'
160
+ }),
161
+ detailsButton: slot.optional(layout === 'inline' ? props.detailsButton : null, {
162
+ defaultProps: {
163
+ appearance: 'transparent',
164
+ 'aria-expanded': isExpanded,
165
+ 'aria-label': 'show details',
166
+ size: mode === 'sidecar' ? 'small' : 'medium',
167
+ icon: {
168
+ children: getIcon(isExpanded, mode)
169
+ }
170
+ },
171
+ renderByDefault: true,
172
+ elementType: Button
173
+ })
174
+ };
175
+ if (state.detailsButton) {
176
+ const onClick = state.detailsButton.onClick;
177
+ state.detailsButton.onClick = mergeCallbacks(onClick, onExpandClick);
178
+ }
179
+ const referenceGroupSetOpen = useReferenceGroupSetOpen();
180
+ const onTargettedByCitation = e => {
181
+ var _e_relatedTarget;
182
+ const relatedTargetHash = (_e_relatedTarget = e.relatedTarget) === null || _e_relatedTarget === void 0 ? void 0 : _e_relatedTarget.hash;
183
+ if (relatedTargetHash && relatedTargetHash.substring(1) === referenceId) {
184
+ referenceGroupSetOpen();
185
+ setIsExpanded(true);
186
+ }
187
+ };
188
+ state.root.onFocus = mergeCallbacks(state.root.onFocus, onTargettedByCitation);
189
+ return state;
190
+ };
191
+ const getIcon = (isExpanded, mode) => {
192
+ if (mode === 'sidecar') {
193
+ return !isExpanded ? /*#__PURE__*/React.createElement(ChevronDown16Regular, null) : /*#__PURE__*/React.createElement(ChevronUp16Regular, null);
194
+ }
195
+ return !isExpanded ? /*#__PURE__*/React.createElement(ChevronDown24Regular, null) : /*#__PURE__*/React.createElement(ChevronUp24Regular, null);
196
+ };
197
+ //# sourceMappingURL=useReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useReference.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Button,\n Caption1,\n getNativeElementProps,\n mergeCallbacks,\n mergeClasses,\n slot,\n useId,\n usePopoverContext_unstable as usePopoverContext,\n} from '@fluentui/react-components';\nimport {\n ChevronDown24Regular,\n ChevronUp24Regular,\n ChevronDown16Regular,\n ChevronUp16Regular,\n} from '@fluentui/react-icons';\nimport { referenceExtraClassNames } from './useReferenceStyles';\nimport { Citation } from '../Citation';\nimport type { ReferenceProps, ReferenceState } from './Reference.types';\nimport { useReferenceGroupSetOpen } from '../../context/ReferenceGroupContext';\nimport { useCopilotMode } from '@fluentui-copilot/react-provider';\n\n/**\n * Create the state required to render Reference.\n *\n * The returned state can be modified with hooks such as useReferenceStyles_unstable,\n * before being passed to renderReference_unstable.\n *\n * @param props - props from this instance of Reference\n * @param ref - reference to root HTMLElement of Reference\n */\nexport const useReference_unstable = (props: ReferenceProps, ref: React.Ref<HTMLElement>): ReferenceState => {\n const { index, referenceId, citationHref, excerpt, layout = 'inline' } = props;\n\n const mode = useCopilotMode(props.mode);\n\n const labelId = useId();\n const mediaId = useId();\n const [isExpanded, setIsExpanded] = React.useState(layout === 'popover' ? true : false);\n\n const setPopoverOpen = usePopoverContext(context => context.setOpen);\n\n const onExpandClick: React.MouseEventHandler<HTMLButtonElement> = _e => {\n setIsExpanded(!isExpanded);\n };\n\n const label = slot.always(props.label, {\n defaultProps: { id: labelId },\n elementType: 'div',\n });\n const media = slot.optional(props.media, { defaultProps: { id: mediaId }, elementType: 'div' });\n if (media && React.isValidElement<HTMLElement>(media.children)) {\n media.children = React.cloneElement(media.children, {\n className: mergeClasses(media.children.props.className, referenceExtraClassNames.mediaChild),\n });\n }\n\n if (media?.id) {\n label['aria-describedby'] = label['aria-describedby']?.concat(media.id) ?? media.id;\n }\n\n const ariaLabelledByProp = props['aria-labelledby'];\n const groupSemantics = React.useMemo(() => {\n return layout === 'inline'\n ? {\n role: 'group',\n 'aria-labelledby': `${ariaLabelledByProp ?? ''} ${label.id}`,\n tabIndex: -1,\n }\n : {};\n }, [layout, ariaLabelledByProp, label.id]);\n\n // Within a popup, a citation should function as a close button\n const citationProps = React.useMemo(() => {\n const onPopoverCloseClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n setPopoverOpen(e, false);\n\n // don't navigate\n e.preventDefault();\n };\n\n return layout === 'popover'\n ? {\n referenceHref: '#',\n tabIndex: -1,\n 'aria-label': `Reference ${index}, close`,\n onClick: onPopoverCloseClick,\n }\n : {\n referenceHref: citationHref,\n };\n }, [layout, citationHref, index, setPopoverOpen]);\n\n const state: ReferenceState = {\n isExpanded,\n mode: layout === 'popover' ? 'sidecar' : mode,\n layout,\n index,\n components: {\n root: 'div',\n citation: 'div',\n media: 'div',\n actions: 'div',\n label: 'div',\n sensitivity: 'span',\n sensitivityLabel: 'span',\n metadata: 'div',\n content: 'div',\n primaryText: 'span',\n secondaryText: 'span',\n tertiaryText: 'span',\n icon: 'span',\n detailsButton: Button,\n },\n root: slot.always(\n getNativeElementProps('div', {\n ref,\n id: referenceId,\n ...groupSemantics,\n ...props,\n }),\n { elementType: 'div' },\n ),\n citation: slot.optional(props.citation, {\n defaultProps: {\n children: (\n <Citation block referenceId={referenceId} {...citationProps}>\n {index}\n </Citation>\n ),\n },\n renderByDefault: true,\n elementType: 'div',\n }),\n media,\n actions: slot.optional(layout === 'inline' ? props.actions : null, {\n renderByDefault: true,\n elementType: 'div',\n }),\n label,\n sensitivity: slot.optional(props.sensitivity, { elementType: 'span' }),\n sensitivityLabel: slot.optional(props.sensitivityLabel, { elementType: 'span' }),\n metadata: slot.always(props.metadata, { elementType: 'div' }),\n primaryText: slot.optional(props.primaryText, {\n defaultProps: {\n hidden: !isExpanded,\n },\n elementType: 'span',\n }),\n secondaryText: slot.optional(props.secondaryText, {\n defaultProps: {\n hidden: !isExpanded,\n },\n elementType: 'span',\n }),\n tertiaryText: slot.optional(props.tertiaryText, {\n defaultProps: {\n hidden: !isExpanded,\n },\n elementType: 'span',\n }),\n icon: slot.optional(props.icon, { elementType: 'span' }),\n content: slot.always(props.content, {\n defaultProps: {\n children: excerpt && <Caption1>{excerpt}</Caption1>,\n },\n elementType: 'div',\n }),\n detailsButton: slot.optional(layout === 'inline' ? props.detailsButton : null, {\n defaultProps: {\n appearance: 'transparent',\n 'aria-expanded': isExpanded,\n 'aria-label': 'show details',\n size: mode === 'sidecar' ? 'small' : 'medium',\n icon: {\n children: getIcon(isExpanded, mode),\n },\n },\n renderByDefault: true,\n elementType: Button,\n }),\n };\n\n if (state.detailsButton) {\n const onClick = state.detailsButton.onClick as React.MouseEventHandler<HTMLButtonElement>;\n state.detailsButton.onClick = mergeCallbacks(onClick, onExpandClick);\n }\n\n const referenceGroupSetOpen = useReferenceGroupSetOpen();\n const onTargettedByCitation = (e: React.FocusEvent<HTMLElement>) => {\n const relatedTargetHash: string | undefined = (e.relatedTarget as HTMLAnchorElement)?.hash;\n if (relatedTargetHash && relatedTargetHash.substring(1) === referenceId) {\n referenceGroupSetOpen();\n setIsExpanded(true);\n }\n };\n state.root.onFocus = mergeCallbacks(state.root.onFocus, onTargettedByCitation);\n\n return state;\n};\n\nconst getIcon = (isExpanded: boolean, mode: ReferenceProps['mode']): JSX.Element => {\n if (mode === 'sidecar') {\n return !isExpanded ? <ChevronDown16Regular /> : <ChevronUp16Regular />;\n }\n\n return !isExpanded ? <ChevronDown24Regular /> : <ChevronUp24Regular />;\n};\n"],"names":["React","Button","Caption1","getNativeElementProps","mergeCallbacks","mergeClasses","slot","useId","usePopoverContext_unstable","usePopoverContext","ChevronDown24Regular","ChevronUp24Regular","ChevronDown16Regular","ChevronUp16Regular","referenceExtraClassNames","Citation","useReferenceGroupSetOpen","useCopilotMode","useReference_unstable","props","ref","index","referenceId","citationHref","excerpt","layout","mode","labelId","mediaId","isExpanded","setIsExpanded","useState","setPopoverOpen","context","setOpen","onExpandClick","_e","label","always","defaultProps","id","elementType","media","optional","isValidElement","children","cloneElement","className","mediaChild","concat","ariaLabelledByProp","groupSemantics","useMemo","role","tabIndex","citationProps","onPopoverCloseClick","e","preventDefault","referenceHref","onClick","state","components","root","citation","actions","sensitivity","sensitivityLabel","metadata","content","primaryText","secondaryText","tertiaryText","icon","detailsButton","block","renderByDefault","hidden","appearance","size","getIcon","referenceGroupSetOpen","onTargettedByCitation","relatedTargetHash","relatedTarget","hash","substring","onFocus"],"mappings":"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"}