@fluentui-copilot/react-attachments 0.0.0-nightly-20250925-0407-633f78c5.1 → 0.0.0-nightly-20250930-0404-ced6fa3a.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.
package/CHANGELOG.json CHANGED
@@ -2,9 +2,9 @@
2
2
  "name": "@fluentui-copilot/react-attachments",
3
3
  "entries": [
4
4
  {
5
- "date": "Thu, 25 Sep 2025 04:15:06 GMT",
6
- "tag": "@fluentui-copilot/react-attachments_v0.0.0-nightly-20250925-0407-633f78c5.1",
7
- "version": "0.0.0-nightly-20250925-0407-633f78c5.1",
5
+ "date": "Tue, 30 Sep 2025 04:11:58 GMT",
6
+ "tag": "@fluentui-copilot/react-attachments_v0.0.0-nightly-20250930-0404-ced6fa3a.1",
7
+ "version": "0.0.0-nightly-20250930-0404-ced6fa3a.1",
8
8
  "comments": {
9
9
  "prerelease": [
10
10
  {
@@ -16,6 +16,21 @@
16
16
  ]
17
17
  }
18
18
  },
19
+ {
20
+ "date": "Mon, 29 Sep 2025 20:26:50 GMT",
21
+ "tag": "@fluentui-copilot/react-attachments_v0.13.6",
22
+ "version": "0.13.6",
23
+ "comments": {
24
+ "patch": [
25
+ {
26
+ "author": "tristan.watanabe@gmail.com",
27
+ "package": "@fluentui-copilot/react-attachments",
28
+ "commit": "eb866bbd84d778637cb17f869920ae47a3eeec50",
29
+ "comment": "fix: type issues after React 18 upgrade."
30
+ }
31
+ ]
32
+ }
33
+ },
19
34
  {
20
35
  "date": "Thu, 07 Aug 2025 18:08:38 GMT",
21
36
  "tag": "@fluentui-copilot/react-attachments_v0.13.4",
package/CHANGELOG.md CHANGED
@@ -1,18 +1,27 @@
1
1
  # Change Log - @fluentui-copilot/react-attachments
2
2
 
3
- This log was last generated on Thu, 25 Sep 2025 04:15:06 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 30 Sep 2025 04:11:58 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## [0.0.0-nightly-20250925-0407-633f78c5.1](https://github.com/microsoft/fluentai/tree/@fluentui-copilot/react-attachments_v0.0.0-nightly-20250925-0407-633f78c5.1)
7
+ ## [0.0.0-nightly-20250930-0404-ced6fa3a.1](https://github.com/microsoft/fluentai/tree/@fluentui-copilot/react-attachments_v0.0.0-nightly-20250930-0404-ced6fa3a.1)
8
8
 
9
- Thu, 25 Sep 2025 04:15:06 GMT
10
- [Compare changes](https://github.com/microsoft/fluentai/compare/@fluentui-copilot/react-attachments_v0.13.4..@fluentui-copilot/react-attachments_v0.0.0-nightly-20250925-0407-633f78c5.1)
9
+ Tue, 30 Sep 2025 04:11:58 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentai/compare/@fluentui-copilot/react-attachments_v0.13.6..@fluentui-copilot/react-attachments_v0.0.0-nightly-20250930-0404-ced6fa3a.1)
11
11
 
12
12
  ### Changes
13
13
 
14
14
  - Release nightly ([commit](https://github.com/microsoft/fluentai/commit/not available) by fluentui-internal@service.microsoft.com)
15
15
 
16
+ ## [0.13.6](https://github.com/microsoft/fluentai/tree/@fluentui-copilot/react-attachments_v0.13.6)
17
+
18
+ Mon, 29 Sep 2025 20:26:50 GMT
19
+ [Compare changes](https://github.com/microsoft/fluentai/compare/@fluentui-copilot/react-attachments_v0.13.4..@fluentui-copilot/react-attachments_v0.13.6)
20
+
21
+ ### Patches
22
+
23
+ - fix: type issues after React 18 upgrade. ([PR #3341](https://github.com/microsoft/fluentai/pull/3341) by tristan.watanabe@gmail.com)
24
+
16
25
  ## [0.13.4](https://github.com/microsoft/fluentai/tree/@fluentui-copilot/react-attachments_v0.13.4)
17
26
 
18
27
  Thu, 07 Aug 2025 18:08:38 GMT
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ import type { CopilotMode } from '@fluentui-copilot/react-provider';
8
8
  import type { DesignVersion } from '@fluentui-copilot/react-provider';
9
9
  import { FC } from 'react';
10
10
  import type { ForwardRefComponent } from '@fluentui/react-components';
11
+ import { JSX as JSX_2 } from 'react/jsx-runtime';
11
12
  import type { MenuContextValues } from '@fluentui/react-components';
12
13
  import type { MenuItem } from '@fluentui/react-components';
13
14
  import type { MenuList } from '@fluentui/react-components';
@@ -185,7 +186,7 @@ export declare type AttachmentOverflowMenuSlots = MenuSlots;
185
186
  */
186
187
  export declare type AttachmentOverflowMenuState = MenuState & {
187
188
  isOverflowing: boolean;
188
- overflowButtonRef?: React.RefObject<HTMLButtonElement>;
189
+ overflowButtonRef?: React.MutableRefObject<HTMLButtonElement | null>;
189
190
  overflowCount: number;
190
191
  };
191
192
 
@@ -251,17 +252,17 @@ export declare type AttachmentState = ComponentState<AttachmentSlots> & Required
251
252
  /**
252
253
  * Render the final JSX of AgentTag
253
254
  */
254
- export declare const renderAgentTag_unstable: (state: AgentTagState) => JSX.Element;
255
+ export declare const renderAgentTag_unstable: (state: AgentTagState) => JSX_2.Element;
255
256
 
256
257
  /**
257
258
  * Render the final JSX of Attachment
258
259
  */
259
- export declare const renderAttachment_unstable: (state: AttachmentState) => JSX.Element;
260
+ export declare const renderAttachment_unstable: (state: AttachmentState) => JSX_2.Element;
260
261
 
261
262
  /**
262
263
  * Render the final JSX of AttachmentList
263
264
  */
264
- export declare const renderAttachmentList_unstable: (state: AttachmentListState, contextValues: AttachmentListContextValues) => JSX.Element;
265
+ export declare const renderAttachmentList_unstable: (state: AttachmentListState, contextValues: AttachmentListContextValues) => JSX_2.Element;
265
266
 
266
267
  /**
267
268
  * Render the final JSX of AttachmentOverflowMenu
@@ -269,17 +270,17 @@ export declare const renderAttachmentList_unstable: (state: AttachmentListState,
269
270
  export declare const renderAttachmentOverflowMenu_unstable: (state: AttachmentOverflowMenuState, contextValues: {
270
271
  menuContextValues: MenuContextValues;
271
272
  attachmentOverflowMenuContextValues: AttachmentOverflowMenuContextValues;
272
- }) => JSX.Element | null;
273
+ }) => JSX_2.Element | null;
273
274
 
274
275
  /**
275
276
  * Render the final JSX of AttachmentOverflowMenuButton
276
277
  */
277
- export declare const renderAttachmentOverflowMenuButton_unstable: (state: AttachmentOverflowMenuButtonState) => JSX.Element | null;
278
+ export declare const renderAttachmentOverflowMenuButton_unstable: (state: AttachmentOverflowMenuButtonState) => JSX_2.Element | null;
278
279
 
279
280
  /**
280
281
  * Render the final JSX of AttachmentOverflowMenuItem
281
282
  */
282
- export declare const renderAttachmentOverflowMenuItem_unstable: (state: AttachmentOverflowMenuItemState) => JSX.Element | null;
283
+ export declare const renderAttachmentOverflowMenuItem_unstable: (state: AttachmentOverflowMenuItemState) => JSX_2.Element | null;
283
284
 
284
285
  /**
285
286
  * Create the state required to render AgentTag.
@@ -1 +1 @@
1
- {"version":3,"sources":["useAttachmentList.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n MenuList,\n MenuPopover,\n getIntrinsicElementProps,\n slot,\n useArrowNavigationGroup,\n useEventCallback,\n useFocusFinders,\n useMergedRefs,\n} from '@fluentui/react-components';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport { useOverflowMaxVisibleItems } from '@fluentui-copilot/react-utilities';\nimport { useOverflowStyles } from '../Attachment';\nimport { AttachmentOverflowMenuButton } from '../AttachmentOverflowMenuButton';\nimport { attachmentOverflowMenuButtonClassNames } from '../AttachmentOverflowMenuButton/useAttachmentOverflowMenuButtonStyles.styles';\nimport { AttachmentOverflowMenuItem } from '../AttachmentOverflowMenuItem';\nimport { useDesignVersion } from '@fluentui-copilot/react-provider';\nimport type { AttachmentListProps, AttachmentListState } from './AttachmentList.types';\nimport type { AttachmentProps } from '../Attachment/Attachment.types';\n\n/**\n * Create the state required to render AttachmentList.\n *\n * The returned state can be modified with hooks such as useAttachmentListStyles_unstable,\n * before being passed to renderAttachmentList_unstable.\n *\n * @param props - props from this instance of AttachmentList\n * @param ref - reference to root HTMLElement of AttachmentList\n */\nexport const useAttachmentList_unstable = (\n props: AttachmentListProps,\n ref: React.Ref<HTMLDivElement>,\n): AttachmentListState => {\n const { children, maxVisibleAttachments, onAttachmentDismiss, overflowMenuProps } = props;\n const innerRef = React.useRef<HTMLDivElement>(null);\n const [setTimeout] = useTimeout();\n const { targetDocument } = useFluent();\n\n const designVersion = useDesignVersion(props.designVersion);\n const { findNextFocusable, findPrevFocusable, findLastFocusable } = useFocusFinders();\n const handleAttachmentDismiss: AttachmentListState['onAttachmentDismiss'] = useEventCallback((e, data) => {\n if (!onAttachmentDismiss) {\n return;\n }\n\n onAttachmentDismiss(e, data);\n\n // set focus after attachment dismiss\n const activeElement = targetDocument?.activeElement;\n if (innerRef.current?.contains(activeElement as HTMLElement)) {\n // focus on next attachment only if the active element is within the current attachment list\n const next = findNextFocusable(activeElement as HTMLElement, { container: innerRef.current });\n if (next) {\n // focus on the overflow button if the next focusable element is the overflow button.\n // if overflow button is removed from the DOM, focus on the last focusable element in the attachment list.\n if (next.classList.contains(attachmentOverflowMenuButtonClassNames.root)) {\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n } else {\n next.focus();\n }\n } else {\n const prev = findPrevFocusable(activeElement?.parentElement as HTMLElement, { container: innerRef.current });\n prev?.focus();\n }\n } else {\n // Handles keyboard focus when attachment removed is in the overflow menu. Also handles focus when the overflow button is removed from the DOM.\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n }\n });\n\n const styles = useOverflowStyles();\n const resolvedChildren = useOverflowMaxVisibleItems({\n children,\n maxVisibleItems: maxVisibleAttachments,\n overflowClassName: styles.overflow,\n });\n\n const attachmentOverflowMenuItems = React.useMemo(() => {\n if (resolvedChildren && Array.isArray(resolvedChildren)) {\n return resolvedChildren\n .filter(child => React.isValidElement(child))\n .map(child => (child as React.ReactElement).props)\n .map((attachment: AttachmentProps) => {\n const dismissButton = slot.optional(attachment.dismissButton, { elementType: 'button' });\n return (\n <AttachmentOverflowMenuItem\n {...attachment}\n key={attachment.id}\n onClick={dismissButton?.onClick as AttachmentProps['onClick']}\n />\n );\n });\n }\n return [];\n }, [resolvedChildren]);\n\n const arrowNavigationProps = useArrowNavigationGroup({\n circular: true,\n axis: 'both',\n memorizeCurrent: true,\n });\n\n const shouldUseOverflow = maxVisibleAttachments !== undefined;\n\n return {\n designVersion,\n onAttachmentDismiss: handleAttachmentDismiss,\n shouldUseOverflow,\n numberOfAttachments: resolvedChildren.length,\n overflowMenuProps,\n components: {\n root: 'div',\n menuList: MenuList,\n menuPopover: MenuPopover,\n overflowMenuButton: 'span',\n },\n root: slot.always(\n getIntrinsicElementProps('div', {\n 'aria-label': 'Attachments',\n ref: useMergedRefs(ref, innerRef),\n role: 'toolbar',\n ...arrowNavigationProps,\n ...props,\n children: resolvedChildren,\n }),\n { elementType: 'div' },\n ),\n menuList: slot.optional(props.menuList, {\n defaultProps: { children: attachmentOverflowMenuItems },\n elementType: MenuList,\n renderByDefault: true,\n }),\n menuPopover: slot.optional(props.menuPopover, { elementType: MenuPopover, renderByDefault: true }),\n overflowMenuButton: slot.optional(props.overflowMenuButton, {\n defaultProps: { children: <AttachmentOverflowMenuButton /> },\n elementType: 'span',\n renderByDefault: true,\n }),\n };\n};\n"],"names":["React","MenuList","MenuPopover","getIntrinsicElementProps","slot","useArrowNavigationGroup","useEventCallback","useFocusFinders","useMergedRefs","useFluent_unstable","useFluent","useTimeout","useOverflowMaxVisibleItems","useOverflowStyles","AttachmentOverflowMenuButton","attachmentOverflowMenuButtonClassNames","AttachmentOverflowMenuItem","useDesignVersion","useAttachmentList_unstable","props","ref","children","maxVisibleAttachments","onAttachmentDismiss","overflowMenuProps","innerRef","useRef","setTimeout","targetDocument","designVersion","findNextFocusable","findPrevFocusable","findLastFocusable","handleAttachmentDismiss","e","data","activeElement","current","contains","next","container","classList","root","focus","prev","parentElement","styles","resolvedChildren","maxVisibleItems","overflowClassName","overflow","attachmentOverflowMenuItems","useMemo","Array","isArray","filter","child","isValidElement","map","attachment","dismissButton","optional","elementType","key","id","onClick","arrowNavigationProps","circular","axis","memorizeCurrent","shouldUseOverflow","undefined","numberOfAttachments","length","components","menuList","menuPopover","overflowMenuButton","always","role","defaultProps","renderByDefault"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SACEC,QAAQ,EACRC,WAAW,EACXC,wBAAwB,EACxBC,IAAI,EACJC,uBAAuB,EACvBC,gBAAgB,EAChBC,eAAe,EACfC,aAAa,QACR,6BAA6B;AACpC,SAASC,sBAAsBC,SAAS,QAAQ,kCAAkC;AAClF,SAASC,UAAU,QAAQ,4BAA4B;AACvD,SAASC,0BAA0B,QAAQ,oCAAoC;AAC/E,SAASC,iBAAiB,QAAQ,gBAAgB;AAClD,SAASC,4BAA4B,QAAQ,kCAAkC;AAC/E,SAASC,sCAAsC,QAAQ,+EAA+E;AACtI,SAASC,0BAA0B,QAAQ,gCAAgC;AAC3E,SAASC,gBAAgB,QAAQ,mCAAmC;AAIpE;;;;;;;;CAQC,GACD,OAAO,MAAMC,6BAA6B,CACxCC,OACAC;IAEA,MAAM,EAAEC,QAAQ,EAAEC,qBAAqB,EAAEC,mBAAmB,EAAEC,iBAAiB,EAAE,GAAGL;IACpF,MAAMM,WAAWzB,MAAM0B,MAAM,CAAiB;IAC9C,MAAM,CAACC,WAAW,GAAGhB;IACrB,MAAM,EAAEiB,cAAc,EAAE,GAAGlB;IAE3B,MAAMmB,gBAAgBZ,iBAAiBE,MAAMU,aAAa;IAC1D,MAAM,EAAEC,iBAAiB,EAAEC,iBAAiB,EAAEC,iBAAiB,EAAE,GAAGzB;IACpE,MAAM0B,0BAAsE3B,iBAAiB,CAAC4B,GAAGC;YAS3FV;QARJ,IAAI,CAACF,qBAAqB;YACxB;QACF;QAEAA,oBAAoBW,GAAGC;QAEvB,qCAAqC;QACrC,MAAMC,gBAAgBR,2BAAAA,qCAAAA,eAAgBQ,aAAa;QACnD,KAAIX,oBAAAA,SAASY,OAAO,cAAhBZ,wCAAAA,kBAAkBa,QAAQ,CAACF,gBAA+B;YAC5D,4FAA4F;YAC5F,MAAMG,OAAOT,kBAAkBM,eAA8B;gBAAEI,WAAWf,SAASY,OAAO;YAAC;YAC3F,IAAIE,MAAM;gBACR,qFAAqF;gBACrF,0GAA0G;gBAC1G,IAAIA,KAAKE,SAAS,CAACH,QAAQ,CAACvB,uCAAuC2B,IAAI,GAAG;oBACxEf,WAAW;4BACTK;yBAAAA,qBAAAA,kBAAkBP,SAASY,OAAO,eAAlCL,yCAAAA,mBAAoDW,KAAK;oBAC3D,GAAG;gBACL,OAAO;oBACLJ,KAAKI,KAAK;gBACZ;YACF,OAAO;gBACL,MAAMC,OAAOb,kBAAkBK,0BAAAA,oCAAAA,cAAeS,aAAa,EAAiB;oBAAEL,WAAWf,SAASY,OAAO;gBAAC;gBAC1GO,iBAAAA,2BAAAA,KAAMD,KAAK;YACb;QACF,OAAO;YACL,+IAA+I;YAC/IhB,WAAW;oBACTK;iBAAAA,qBAAAA,kBAAkBP,SAASY,OAAO,eAAlCL,yCAAAA,mBAAoDW,KAAK;YAC3D,GAAG;QACL;IACF;IAEA,MAAMG,SAASjC;IACf,MAAMkC,mBAAmBnC,2BAA2B;QAClDS;QACA2B,iBAAiB1B;QACjB2B,mBAAmBH,OAAOI,QAAQ;IACpC;IAEA,MAAMC,8BAA8BnD,MAAMoD,OAAO,CAAC;QAChD,IAAIL,oBAAoBM,MAAMC,OAAO,CAACP,mBAAmB;YACvD,OAAOA,iBACJQ,MAAM,CAACC,CAAAA,sBAASxD,MAAMyD,cAAc,CAACD,QACrCE,GAAG,CAACF,CAAAA,QAAS,AAACA,MAA6BrC,KAAK,EAChDuC,GAAG,CAAC,CAACC;gBACJ,MAAMC,gBAAgBxD,KAAKyD,QAAQ,CAACF,WAAWC,aAAa,EAAE;oBAAEE,aAAa;gBAAS;gBACtF,qBACE,oBAAC9C;oBACE,GAAG2C,UAAU;oBACdI,KAAKJ,WAAWK,EAAE;oBAClBC,OAAO,EAAEL,0BAAAA,oCAAAA,cAAeK,OAAO;;YAGrC;QACJ;QACA,OAAO,EAAE;IACX,GAAG;QAAClB;KAAiB;IAErB,MAAMmB,uBAAuB7D,wBAAwB;QACnD8D,UAAU;QACVC,MAAM;QACNC,iBAAiB;IACnB;IAEA,MAAMC,oBAAoBhD,0BAA0BiD;IAEpD,OAAO;QACL1C;QACAN,qBAAqBU;QACrBqC;QACAE,qBAAqBzB,iBAAiB0B,MAAM;QAC5CjD;QACAkD,YAAY;YACVhC,MAAM;YACNiC,UAAU1E;YACV2E,aAAa1E;YACb2E,oBAAoB;QACtB;QACAnC,MAAMtC,KAAK0E,MAAM,CACf3E,yBAAyB,OAAO;YAC9B,cAAc;YACdiB,KAAKZ,cAAcY,KAAKK;YACxBsD,MAAM;YACN,GAAGb,oBAAoB;YACvB,GAAG/C,KAAK;YACRE,UAAU0B;QACZ,IACA;YAAEe,aAAa;QAAM;QAEvBa,UAAUvE,KAAKyD,QAAQ,CAAC1C,MAAMwD,QAAQ,EAAE;YACtCK,cAAc;gBAAE3D,UAAU8B;YAA4B;YACtDW,aAAa7D;YACbgF,iBAAiB;QACnB;QACAL,aAAaxE,KAAKyD,QAAQ,CAAC1C,MAAMyD,WAAW,EAAE;YAAEd,aAAa5D;YAAa+E,iBAAiB;QAAK;QAChGJ,oBAAoBzE,KAAKyD,QAAQ,CAAC1C,MAAM0D,kBAAkB,EAAE;YAC1DG,cAAc;gBAAE3D,wBAAU,oBAACP;YAAgC;YAC3DgD,aAAa;YACbmB,iBAAiB;QACnB;IACF;AACF,EAAE"}
1
+ {"version":3,"sources":["useAttachmentList.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n MenuList,\n MenuPopover,\n getIntrinsicElementProps,\n slot,\n useArrowNavigationGroup,\n useEventCallback,\n useFocusFinders,\n useMergedRefs,\n} from '@fluentui/react-components';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport { useOverflowMaxVisibleItems } from '@fluentui-copilot/react-utilities';\nimport { useOverflowStyles } from '../Attachment';\nimport { AttachmentOverflowMenuButton } from '../AttachmentOverflowMenuButton';\nimport { attachmentOverflowMenuButtonClassNames } from '../AttachmentOverflowMenuButton/useAttachmentOverflowMenuButtonStyles.styles';\nimport { AttachmentOverflowMenuItem } from '../AttachmentOverflowMenuItem';\nimport { useDesignVersion } from '@fluentui-copilot/react-provider';\nimport type { AttachmentListProps, AttachmentListState } from './AttachmentList.types';\nimport type { AttachmentProps } from '../Attachment/Attachment.types';\n\n/**\n * Create the state required to render AttachmentList.\n *\n * The returned state can be modified with hooks such as useAttachmentListStyles_unstable,\n * before being passed to renderAttachmentList_unstable.\n *\n * @param props - props from this instance of AttachmentList\n * @param ref - reference to root HTMLElement of AttachmentList\n */\nexport const useAttachmentList_unstable = (\n props: AttachmentListProps,\n ref: React.Ref<HTMLDivElement>,\n): AttachmentListState => {\n const { children, maxVisibleAttachments, onAttachmentDismiss, overflowMenuProps } = props;\n const innerRef = React.useRef<HTMLDivElement>(null);\n const [setTimeout] = useTimeout();\n const { targetDocument } = useFluent();\n\n const designVersion = useDesignVersion(props.designVersion);\n const { findNextFocusable, findPrevFocusable, findLastFocusable } = useFocusFinders();\n const handleAttachmentDismiss: AttachmentListState['onAttachmentDismiss'] = useEventCallback((e, data) => {\n if (!onAttachmentDismiss) {\n return;\n }\n\n onAttachmentDismiss(e, data);\n\n // set focus after attachment dismiss\n const activeElement = targetDocument?.activeElement;\n if (innerRef.current?.contains(activeElement as HTMLElement)) {\n // focus on next attachment only if the active element is within the current attachment list\n const next = findNextFocusable(activeElement as HTMLElement, { container: innerRef.current });\n if (next) {\n // focus on the overflow button if the next focusable element is the overflow button.\n // if overflow button is removed from the DOM, focus on the last focusable element in the attachment list.\n if (next.classList.contains(attachmentOverflowMenuButtonClassNames.root)) {\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n } else {\n next.focus();\n }\n } else {\n const prev = findPrevFocusable(activeElement?.parentElement as HTMLElement, { container: innerRef.current });\n prev?.focus();\n }\n } else {\n // Handles keyboard focus when attachment removed is in the overflow menu. Also handles focus when the overflow button is removed from the DOM.\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n }\n });\n\n const styles = useOverflowStyles();\n const resolvedChildren = useOverflowMaxVisibleItems({\n children,\n maxVisibleItems: maxVisibleAttachments,\n overflowClassName: styles.overflow,\n });\n\n const attachmentOverflowMenuItems = React.useMemo(() => {\n if (resolvedChildren && Array.isArray(resolvedChildren)) {\n return resolvedChildren\n .filter(child => React.isValidElement(child))\n .map(child => (child as React.ReactElement<AttachmentProps>).props)\n .map(attachment => {\n const dismissButton = slot.optional(attachment.dismissButton, { elementType: 'button' });\n return (\n <AttachmentOverflowMenuItem\n {...attachment}\n key={attachment.id}\n onClick={dismissButton?.onClick as AttachmentProps['onClick']}\n />\n );\n });\n }\n return [];\n }, [resolvedChildren]);\n\n const arrowNavigationProps = useArrowNavigationGroup({\n circular: true,\n axis: 'both',\n memorizeCurrent: true,\n });\n\n const shouldUseOverflow = maxVisibleAttachments !== undefined;\n\n return {\n designVersion,\n onAttachmentDismiss: handleAttachmentDismiss,\n shouldUseOverflow,\n numberOfAttachments: resolvedChildren.length,\n overflowMenuProps,\n components: {\n root: 'div',\n menuList: MenuList,\n menuPopover: MenuPopover,\n overflowMenuButton: 'span',\n },\n root: slot.always(\n getIntrinsicElementProps('div', {\n 'aria-label': 'Attachments',\n ref: useMergedRefs(ref, innerRef),\n role: 'toolbar',\n ...arrowNavigationProps,\n ...props,\n children: resolvedChildren,\n }),\n { elementType: 'div' },\n ),\n menuList: slot.optional(props.menuList, {\n defaultProps: { children: attachmentOverflowMenuItems },\n elementType: MenuList,\n renderByDefault: true,\n }),\n menuPopover: slot.optional(props.menuPopover, { elementType: MenuPopover, renderByDefault: true }),\n overflowMenuButton: slot.optional(props.overflowMenuButton, {\n defaultProps: { children: <AttachmentOverflowMenuButton /> },\n elementType: 'span',\n renderByDefault: true,\n }),\n };\n};\n"],"names":["React","MenuList","MenuPopover","getIntrinsicElementProps","slot","useArrowNavigationGroup","useEventCallback","useFocusFinders","useMergedRefs","useFluent_unstable","useFluent","useTimeout","useOverflowMaxVisibleItems","useOverflowStyles","AttachmentOverflowMenuButton","attachmentOverflowMenuButtonClassNames","AttachmentOverflowMenuItem","useDesignVersion","useAttachmentList_unstable","props","ref","children","maxVisibleAttachments","onAttachmentDismiss","overflowMenuProps","innerRef","useRef","setTimeout","targetDocument","designVersion","findNextFocusable","findPrevFocusable","findLastFocusable","handleAttachmentDismiss","e","data","activeElement","current","contains","next","container","classList","root","focus","prev","parentElement","styles","resolvedChildren","maxVisibleItems","overflowClassName","overflow","attachmentOverflowMenuItems","useMemo","Array","isArray","filter","child","isValidElement","map","attachment","dismissButton","optional","elementType","key","id","onClick","arrowNavigationProps","circular","axis","memorizeCurrent","shouldUseOverflow","undefined","numberOfAttachments","length","components","menuList","menuPopover","overflowMenuButton","always","role","defaultProps","renderByDefault"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["AttachmentOverflowMenu.types.ts"],"sourcesContent":["import type { MenuProps, MenuSlots, MenuState } from '@fluentui/react-components';\nimport type { AttachmentOverflowMenuContextValue } from '../../contexts/attachmentOverflowMenuContext';\n\nexport type AttachmentOverflowMenuSlots = MenuSlots;\n\n/**\n * AttachmentOverflowMenu Props\n */\nexport type AttachmentOverflowMenuProps = MenuProps;\n\n/**\n * State used in rendering AttachmentOverflowMenu\n */\nexport type AttachmentOverflowMenuState = MenuState & {\n isOverflowing: boolean;\n overflowButtonRef?: React.RefObject<HTMLButtonElement>;\n overflowCount: number;\n};\n\nexport type AttachmentOverflowMenuContextValues = {\n attachmentOverflowMenu: AttachmentOverflowMenuContextValue;\n};\n"],"names":[],"rangeMappings":"","mappings":"AAmBA,WAEE"}
1
+ {"version":3,"sources":["AttachmentOverflowMenu.types.ts"],"sourcesContent":["import type { MenuProps, MenuSlots, MenuState } from '@fluentui/react-components';\nimport type { AttachmentOverflowMenuContextValue } from '../../contexts/attachmentOverflowMenuContext';\n\nexport type AttachmentOverflowMenuSlots = MenuSlots;\n\n/**\n * AttachmentOverflowMenu Props\n */\nexport type AttachmentOverflowMenuProps = MenuProps;\n\n/**\n * State used in rendering AttachmentOverflowMenu\n */\nexport type AttachmentOverflowMenuState = MenuState & {\n isOverflowing: boolean;\n overflowButtonRef?: React.MutableRefObject<HTMLButtonElement | null>;\n overflowCount: number;\n};\n\nexport type AttachmentOverflowMenuContextValues = {\n attachmentOverflowMenu: AttachmentOverflowMenuContextValue;\n};\n"],"names":[],"rangeMappings":"","mappings":"AAmBA,WAEE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["useAttachmentList.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n MenuList,\n MenuPopover,\n getIntrinsicElementProps,\n slot,\n useArrowNavigationGroup,\n useEventCallback,\n useFocusFinders,\n useMergedRefs,\n} from '@fluentui/react-components';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport { useOverflowMaxVisibleItems } from '@fluentui-copilot/react-utilities';\nimport { useOverflowStyles } from '../Attachment';\nimport { AttachmentOverflowMenuButton } from '../AttachmentOverflowMenuButton';\nimport { attachmentOverflowMenuButtonClassNames } from '../AttachmentOverflowMenuButton/useAttachmentOverflowMenuButtonStyles.styles';\nimport { AttachmentOverflowMenuItem } from '../AttachmentOverflowMenuItem';\nimport { useDesignVersion } from '@fluentui-copilot/react-provider';\nimport type { AttachmentListProps, AttachmentListState } from './AttachmentList.types';\nimport type { AttachmentProps } from '../Attachment/Attachment.types';\n\n/**\n * Create the state required to render AttachmentList.\n *\n * The returned state can be modified with hooks such as useAttachmentListStyles_unstable,\n * before being passed to renderAttachmentList_unstable.\n *\n * @param props - props from this instance of AttachmentList\n * @param ref - reference to root HTMLElement of AttachmentList\n */\nexport const useAttachmentList_unstable = (\n props: AttachmentListProps,\n ref: React.Ref<HTMLDivElement>,\n): AttachmentListState => {\n const { children, maxVisibleAttachments, onAttachmentDismiss, overflowMenuProps } = props;\n const innerRef = React.useRef<HTMLDivElement>(null);\n const [setTimeout] = useTimeout();\n const { targetDocument } = useFluent();\n\n const designVersion = useDesignVersion(props.designVersion);\n const { findNextFocusable, findPrevFocusable, findLastFocusable } = useFocusFinders();\n const handleAttachmentDismiss: AttachmentListState['onAttachmentDismiss'] = useEventCallback((e, data) => {\n if (!onAttachmentDismiss) {\n return;\n }\n\n onAttachmentDismiss(e, data);\n\n // set focus after attachment dismiss\n const activeElement = targetDocument?.activeElement;\n if (innerRef.current?.contains(activeElement as HTMLElement)) {\n // focus on next attachment only if the active element is within the current attachment list\n const next = findNextFocusable(activeElement as HTMLElement, { container: innerRef.current });\n if (next) {\n // focus on the overflow button if the next focusable element is the overflow button.\n // if overflow button is removed from the DOM, focus on the last focusable element in the attachment list.\n if (next.classList.contains(attachmentOverflowMenuButtonClassNames.root)) {\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n } else {\n next.focus();\n }\n } else {\n const prev = findPrevFocusable(activeElement?.parentElement as HTMLElement, { container: innerRef.current });\n prev?.focus();\n }\n } else {\n // Handles keyboard focus when attachment removed is in the overflow menu. Also handles focus when the overflow button is removed from the DOM.\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n }\n });\n\n const styles = useOverflowStyles();\n const resolvedChildren = useOverflowMaxVisibleItems({\n children,\n maxVisibleItems: maxVisibleAttachments,\n overflowClassName: styles.overflow,\n });\n\n const attachmentOverflowMenuItems = React.useMemo(() => {\n if (resolvedChildren && Array.isArray(resolvedChildren)) {\n return resolvedChildren\n .filter(child => React.isValidElement(child))\n .map(child => (child as React.ReactElement).props)\n .map((attachment: AttachmentProps) => {\n const dismissButton = slot.optional(attachment.dismissButton, { elementType: 'button' });\n return (\n <AttachmentOverflowMenuItem\n {...attachment}\n key={attachment.id}\n onClick={dismissButton?.onClick as AttachmentProps['onClick']}\n />\n );\n });\n }\n return [];\n }, [resolvedChildren]);\n\n const arrowNavigationProps = useArrowNavigationGroup({\n circular: true,\n axis: 'both',\n memorizeCurrent: true,\n });\n\n const shouldUseOverflow = maxVisibleAttachments !== undefined;\n\n return {\n designVersion,\n onAttachmentDismiss: handleAttachmentDismiss,\n shouldUseOverflow,\n numberOfAttachments: resolvedChildren.length,\n overflowMenuProps,\n components: {\n root: 'div',\n menuList: MenuList,\n menuPopover: MenuPopover,\n overflowMenuButton: 'span',\n },\n root: slot.always(\n getIntrinsicElementProps('div', {\n 'aria-label': 'Attachments',\n ref: useMergedRefs(ref, innerRef),\n role: 'toolbar',\n ...arrowNavigationProps,\n ...props,\n children: resolvedChildren,\n }),\n { elementType: 'div' },\n ),\n menuList: slot.optional(props.menuList, {\n defaultProps: { children: attachmentOverflowMenuItems },\n elementType: MenuList,\n renderByDefault: true,\n }),\n menuPopover: slot.optional(props.menuPopover, { elementType: MenuPopover, renderByDefault: true }),\n overflowMenuButton: slot.optional(props.overflowMenuButton, {\n defaultProps: { children: <AttachmentOverflowMenuButton /> },\n elementType: 'span',\n renderByDefault: true,\n }),\n };\n};\n"],"names":["useAttachmentList_unstable","props","ref","children","maxVisibleAttachments","onAttachmentDismiss","overflowMenuProps","innerRef","React","useRef","setTimeout","useTimeout","targetDocument","useFluent","designVersion","useDesignVersion","findNextFocusable","findPrevFocusable","findLastFocusable","useFocusFinders","handleAttachmentDismiss","useEventCallback","e","data","activeElement","current","contains","next","container","classList","attachmentOverflowMenuButtonClassNames","root","focus","prev","parentElement","styles","useOverflowStyles","resolvedChildren","useOverflowMaxVisibleItems","maxVisibleItems","overflowClassName","overflow","attachmentOverflowMenuItems","useMemo","Array","isArray","filter","child","isValidElement","map","attachment","dismissButton","slot","optional","elementType","createElement","AttachmentOverflowMenuItem","key","id","onClick","arrowNavigationProps","useArrowNavigationGroup","circular","axis","memorizeCurrent","shouldUseOverflow","undefined","numberOfAttachments","length","components","menuList","MenuList","menuPopover","MenuPopover","overflowMenuButton","always","getIntrinsicElementProps","useMergedRefs","role","defaultProps","renderByDefault","AttachmentOverflowMenuButton"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BA+BaA;;;eAAAA;;;;iEA/BU;iCAUhB;qCACyC;gCACrB;iCACgB;4BACT;8CACW;6DACU;4CACZ;+BACV;AAa1B,MAAMA,6BAA6B,CACxCC,OACAC;IAEA,MAAM,EAAEC,QAAQ,EAAEC,qBAAqB,EAAEC,mBAAmB,EAAEC,iBAAiB,EAAE,GAAGL;IACpF,MAAMM,WAAWC,OAAMC,MAAM,CAAiB;IAC9C,MAAM,CAACC,WAAW,GAAGC,IAAAA,0BAAAA;IACrB,MAAM,EAAEC,cAAc,EAAE,GAAGC,IAAAA,uCAAAA;IAE3B,MAAMC,gBAAgBC,IAAAA,+BAAAA,EAAiBd,MAAMa,aAAa;IAC1D,MAAM,EAAEE,iBAAiB,EAAEC,iBAAiB,EAAEC,iBAAiB,EAAE,GAAGC,IAAAA,gCAAAA;IACpE,MAAMC,0BAAsEC,IAAAA,iCAAAA,EAAiB,CAACC,GAAGC;YAS3FhB;QARJ,IAAI,CAACF,qBAAqB;YACxB;QACF;QAEAA,oBAAoBiB,GAAGC;QAEvB,qCAAqC;QACrC,MAAMC,gBAAgBZ,mBAAAA,QAAAA,mBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,eAAgBY,aAAa;QACnD,IAAA,AAAIjB,CAAAA,oBAAAA,SAASkB,OAAO,AAAPA,MAAO,QAAhBlB,sBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,kBAAkBmB,QAAQ,CAACF,gBAA+B;YAC5D,4FAA4F;YAC5F,MAAMG,OAAOX,kBAAkBQ,eAA8B;gBAAEI,WAAWrB,SAASkB,OAAO;YAAC;YAC3F,IAAIE,MAAM;gBACR,qFAAqF;gBACrF,0GAA0G;gBAC1G,IAAIA,KAAKE,SAAS,CAACH,QAAQ,CAACI,mFAAAA,CAAuCC,IAAI,GAAG;oBACxErB,WAAW;4BACTQ;wBAAAA,CAAAA,qBAAAA,kBAAkBX,SAASkB,OAAO,CAAA,MAAA,QAAlCP,uBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,mBAAoDc,KAAK;oBAC3D,GAAG;gBACL,OAAO;oBACLL,KAAKK,KAAK;gBACZ;YACF,OAAO;gBACL,MAAMC,OAAOhB,kBAAkBO,kBAAAA,QAAAA,kBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,cAAeU,aAAa,EAAiB;oBAAEN,WAAWrB,SAASkB,OAAO;gBAAC;gBAC1GQ,SAAAA,QAAAA,SAAAA,KAAAA,IAAAA,KAAAA,IAAAA,KAAMD,KAAK;YACb;QACF,OAAO;YACL,+IAA+I;YAC/ItB,WAAW;oBACTQ;gBAAAA,CAAAA,qBAAAA,kBAAkBX,SAASkB,OAAO,CAAA,MAAA,QAAlCP,uBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,mBAAoDc,KAAK;YAC3D,GAAG;QACL;IACF;IAEA,MAAMG,SAASC,IAAAA,6BAAAA;IACf,MAAMC,mBAAmBC,IAAAA,2CAAAA,EAA2B;QAClDnC;QACAoC,iBAAiBnC;QACjBoC,mBAAmBL,OAAOM,QAAQ;IACpC;IAEA,MAAMC,8BAA8BlC,OAAMmC,OAAO,CAAC;QAChD,IAAIN,oBAAoBO,MAAMC,OAAO,CAACR,mBAAmB;YACvD,OAAOA,iBACJS,MAAM,CAACC,CAAAA,QAAAA,WAAAA,GAASvC,OAAMwC,cAAc,CAACD,QACrCE,GAAG,CAACF,CAAAA,QAASA,MAA8B9C,KAAK,EAChDgD,GAAG,CAAC,CAACC;gBACJ,MAAMC,gBAAgBC,qBAAAA,CAAKC,QAAQ,CAACH,WAAWC,aAAa,EAAE;oBAAEG,aAAa;gBAAS;gBACtF,OAAA,WAAA,GACE9C,OAAA+C,aAAA,CAACC,sDAAAA,EAAAA;oBACE,GAAGN,UAAU;oBACdO,KAAKP,WAAWQ,EAAE;oBAClBC,SAASR,kBAAAA,QAAAA,kBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,cAAeQ,OAAO;;YAGrC;QACJ;QACA,OAAO,EAAE;IACX,GAAG;QAACtB;KAAiB;IAErB,MAAMuB,uBAAuBC,IAAAA,wCAAAA,EAAwB;QACnDC,UAAU;QACVC,MAAM;QACNC,iBAAiB;IACnB;IAEA,MAAMC,oBAAoB7D,0BAA0B8D;IAEpD,OAAO;QACLpD;QACAT,qBAAqBe;QACrB6C;QACAE,qBAAqB9B,iBAAiB+B,MAAM;QAC5C9D;QACA+D,YAAY;YACVtC,MAAM;YACNuC,UAAUC,yBAAAA;YACVC,aAAaC,4BAAAA;YACbC,oBAAoB;QACtB;QACA3C,MAAMqB,qBAAAA,CAAKuB,MAAM,CACfC,IAAAA,yCAAAA,EAAyB,OAAO;YAC9B,cAAc;YACd1E,KAAK2E,IAAAA,8BAAAA,EAAc3E,KAAKK;YACxBuE,MAAM;YACN,GAAGlB,oBAAoB;YACvB,GAAG3D,KAAK;YACRE,UAAUkC;QACZ,IACA;YAAEiB,aAAa;QAAM;QAEvBgB,UAAUlB,qBAAAA,CAAKC,QAAQ,CAACpD,MAAMqE,QAAQ,EAAE;YACtCS,cAAc;gBAAE5E,UAAUuC;YAA4B;YACtDY,aAAaiB,yBAAAA;YACbS,iBAAiB;QACnB;QACAR,aAAapB,qBAAAA,CAAKC,QAAQ,CAACpD,MAAMuE,WAAW,EAAE;YAAElB,aAAamB,4BAAAA;YAAaO,iBAAiB;QAAK;QAChGN,oBAAoBtB,qBAAAA,CAAKC,QAAQ,CAACpD,MAAMyE,kBAAkB,EAAE;YAC1DK,cAAc;gBAAE5E,UAAAA,WAAAA,GAAUK,OAAA+C,aAAA,CAAC0B,0DAAAA,EAAAA;YAAgC;YAC3D3B,aAAa;YACb0B,iBAAiB;QACnB;IACF;AACF"}
1
+ {"version":3,"sources":["useAttachmentList.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n MenuList,\n MenuPopover,\n getIntrinsicElementProps,\n slot,\n useArrowNavigationGroup,\n useEventCallback,\n useFocusFinders,\n useMergedRefs,\n} from '@fluentui/react-components';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport { useOverflowMaxVisibleItems } from '@fluentui-copilot/react-utilities';\nimport { useOverflowStyles } from '../Attachment';\nimport { AttachmentOverflowMenuButton } from '../AttachmentOverflowMenuButton';\nimport { attachmentOverflowMenuButtonClassNames } from '../AttachmentOverflowMenuButton/useAttachmentOverflowMenuButtonStyles.styles';\nimport { AttachmentOverflowMenuItem } from '../AttachmentOverflowMenuItem';\nimport { useDesignVersion } from '@fluentui-copilot/react-provider';\nimport type { AttachmentListProps, AttachmentListState } from './AttachmentList.types';\nimport type { AttachmentProps } from '../Attachment/Attachment.types';\n\n/**\n * Create the state required to render AttachmentList.\n *\n * The returned state can be modified with hooks such as useAttachmentListStyles_unstable,\n * before being passed to renderAttachmentList_unstable.\n *\n * @param props - props from this instance of AttachmentList\n * @param ref - reference to root HTMLElement of AttachmentList\n */\nexport const useAttachmentList_unstable = (\n props: AttachmentListProps,\n ref: React.Ref<HTMLDivElement>,\n): AttachmentListState => {\n const { children, maxVisibleAttachments, onAttachmentDismiss, overflowMenuProps } = props;\n const innerRef = React.useRef<HTMLDivElement>(null);\n const [setTimeout] = useTimeout();\n const { targetDocument } = useFluent();\n\n const designVersion = useDesignVersion(props.designVersion);\n const { findNextFocusable, findPrevFocusable, findLastFocusable } = useFocusFinders();\n const handleAttachmentDismiss: AttachmentListState['onAttachmentDismiss'] = useEventCallback((e, data) => {\n if (!onAttachmentDismiss) {\n return;\n }\n\n onAttachmentDismiss(e, data);\n\n // set focus after attachment dismiss\n const activeElement = targetDocument?.activeElement;\n if (innerRef.current?.contains(activeElement as HTMLElement)) {\n // focus on next attachment only if the active element is within the current attachment list\n const next = findNextFocusable(activeElement as HTMLElement, { container: innerRef.current });\n if (next) {\n // focus on the overflow button if the next focusable element is the overflow button.\n // if overflow button is removed from the DOM, focus on the last focusable element in the attachment list.\n if (next.classList.contains(attachmentOverflowMenuButtonClassNames.root)) {\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n } else {\n next.focus();\n }\n } else {\n const prev = findPrevFocusable(activeElement?.parentElement as HTMLElement, { container: innerRef.current });\n prev?.focus();\n }\n } else {\n // Handles keyboard focus when attachment removed is in the overflow menu. Also handles focus when the overflow button is removed from the DOM.\n setTimeout(() => {\n findLastFocusable(innerRef.current as HTMLElement)?.focus();\n }, 0);\n }\n });\n\n const styles = useOverflowStyles();\n const resolvedChildren = useOverflowMaxVisibleItems({\n children,\n maxVisibleItems: maxVisibleAttachments,\n overflowClassName: styles.overflow,\n });\n\n const attachmentOverflowMenuItems = React.useMemo(() => {\n if (resolvedChildren && Array.isArray(resolvedChildren)) {\n return resolvedChildren\n .filter(child => React.isValidElement(child))\n .map(child => (child as React.ReactElement<AttachmentProps>).props)\n .map(attachment => {\n const dismissButton = slot.optional(attachment.dismissButton, { elementType: 'button' });\n return (\n <AttachmentOverflowMenuItem\n {...attachment}\n key={attachment.id}\n onClick={dismissButton?.onClick as AttachmentProps['onClick']}\n />\n );\n });\n }\n return [];\n }, [resolvedChildren]);\n\n const arrowNavigationProps = useArrowNavigationGroup({\n circular: true,\n axis: 'both',\n memorizeCurrent: true,\n });\n\n const shouldUseOverflow = maxVisibleAttachments !== undefined;\n\n return {\n designVersion,\n onAttachmentDismiss: handleAttachmentDismiss,\n shouldUseOverflow,\n numberOfAttachments: resolvedChildren.length,\n overflowMenuProps,\n components: {\n root: 'div',\n menuList: MenuList,\n menuPopover: MenuPopover,\n overflowMenuButton: 'span',\n },\n root: slot.always(\n getIntrinsicElementProps('div', {\n 'aria-label': 'Attachments',\n ref: useMergedRefs(ref, innerRef),\n role: 'toolbar',\n ...arrowNavigationProps,\n ...props,\n children: resolvedChildren,\n }),\n { elementType: 'div' },\n ),\n menuList: slot.optional(props.menuList, {\n defaultProps: { children: attachmentOverflowMenuItems },\n elementType: MenuList,\n renderByDefault: true,\n }),\n menuPopover: slot.optional(props.menuPopover, { elementType: MenuPopover, renderByDefault: true }),\n overflowMenuButton: slot.optional(props.overflowMenuButton, {\n defaultProps: { children: <AttachmentOverflowMenuButton /> },\n elementType: 'span',\n renderByDefault: true,\n }),\n };\n};\n"],"names":["useAttachmentList_unstable","props","ref","children","maxVisibleAttachments","onAttachmentDismiss","overflowMenuProps","innerRef","React","useRef","setTimeout","useTimeout","targetDocument","useFluent","designVersion","useDesignVersion","findNextFocusable","findPrevFocusable","findLastFocusable","useFocusFinders","handleAttachmentDismiss","useEventCallback","e","data","activeElement","current","contains","next","container","classList","attachmentOverflowMenuButtonClassNames","root","focus","prev","parentElement","styles","useOverflowStyles","resolvedChildren","useOverflowMaxVisibleItems","maxVisibleItems","overflowClassName","overflow","attachmentOverflowMenuItems","useMemo","Array","isArray","filter","child","isValidElement","map","attachment","dismissButton","slot","optional","elementType","createElement","AttachmentOverflowMenuItem","key","id","onClick","arrowNavigationProps","useArrowNavigationGroup","circular","axis","memorizeCurrent","shouldUseOverflow","undefined","numberOfAttachments","length","components","menuList","MenuList","menuPopover","MenuPopover","overflowMenuButton","always","getIntrinsicElementProps","useMergedRefs","role","defaultProps","renderByDefault","AttachmentOverflowMenuButton"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["AttachmentOverflowMenu.types.ts"],"sourcesContent":["import type { MenuProps, MenuSlots, MenuState } from '@fluentui/react-components';\nimport type { AttachmentOverflowMenuContextValue } from '../../contexts/attachmentOverflowMenuContext';\n\nexport type AttachmentOverflowMenuSlots = MenuSlots;\n\n/**\n * AttachmentOverflowMenu Props\n */\nexport type AttachmentOverflowMenuProps = MenuProps;\n\n/**\n * State used in rendering AttachmentOverflowMenu\n */\nexport type AttachmentOverflowMenuState = MenuState & {\n isOverflowing: boolean;\n overflowButtonRef?: React.RefObject<HTMLButtonElement>;\n overflowCount: number;\n};\n\nexport type AttachmentOverflowMenuContextValues = {\n attachmentOverflowMenu: AttachmentOverflowMenuContextValue;\n};\n"],"names":[],"rangeMappings":"","mappings":""}
1
+ {"version":3,"sources":["AttachmentOverflowMenu.types.ts"],"sourcesContent":["import type { MenuProps, MenuSlots, MenuState } from '@fluentui/react-components';\nimport type { AttachmentOverflowMenuContextValue } from '../../contexts/attachmentOverflowMenuContext';\n\nexport type AttachmentOverflowMenuSlots = MenuSlots;\n\n/**\n * AttachmentOverflowMenu Props\n */\nexport type AttachmentOverflowMenuProps = MenuProps;\n\n/**\n * State used in rendering AttachmentOverflowMenu\n */\nexport type AttachmentOverflowMenuState = MenuState & {\n isOverflowing: boolean;\n overflowButtonRef?: React.MutableRefObject<HTMLButtonElement | null>;\n overflowCount: number;\n};\n\nexport type AttachmentOverflowMenuContextValues = {\n attachmentOverflowMenu: AttachmentOverflowMenuContextValue;\n};\n"],"names":[],"rangeMappings":"","mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui-copilot/react-attachments",
3
- "version": "0.0.0-nightly-20250925-0407-633f78c5.1",
3
+ "version": "0.0.0-nightly-20250930-0404-ced6fa3a.1",
4
4
  "description": "A set of components related to attaching files in Copilot experiences.",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",
@@ -12,19 +12,19 @@
12
12
  },
13
13
  "license": "MIT",
14
14
  "dependencies": {
15
- "@fluentui-copilot/react-provider": "0.0.0-nightly-20250925-0407-633f78c5.1",
16
- "@fluentui-copilot/react-utilities": "0.0.0-nightly-20250925-0407-633f78c5.1",
17
- "@fluentui-copilot/tokens": "0.0.0-nightly-20250925-0407-633f78c5.1",
15
+ "@fluentui-copilot/react-provider": "0.0.0-nightly-20250930-0404-ced6fa3a.1",
16
+ "@fluentui-copilot/react-utilities": "0.0.0-nightly-20250930-0404-ced6fa3a.1",
17
+ "@fluentui-copilot/tokens": "0.0.0-nightly-20250930-0404-ced6fa3a.1",
18
18
  "@swc/helpers": "^0.5.1"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "@fluentui/keyboard-keys": ">=9.0.8 <10.0.0",
22
- "@fluentui/react-components": ">=9.66.0 <10.0.0",
23
- "@fluentui/react-context-selector": ">=9.2.1 <10.0.0",
22
+ "@fluentui/react-components": ">=9.70.0 <10.0.0",
23
+ "@fluentui/react-context-selector": ">=9.2.7 <10.0.0",
24
24
  "@fluentui/react-icons": ">=2.0.303 <3.0.0",
25
- "@fluentui/react-jsx-runtime": ">=9.1.1 <10.0.0",
26
- "@fluentui/react-shared-contexts": ">=9.24.0 <10.0.0",
27
- "@fluentui/react-utilities": ">=9.21.1 <10.0.0",
25
+ "@fluentui/react-jsx-runtime": ">=9.2.0 <10.0.0",
26
+ "@fluentui/react-shared-contexts": ">=9.25.1 <10.0.0",
27
+ "@fluentui/react-utilities": ">=9.24.1 <10.0.0",
28
28
  "@types/react": ">=16.14.0 <19.0.0",
29
29
  "@types/react-dom": ">=16.9.8 <19.0.0",
30
30
  "react": ">=16.14.0 <19.0.0",