@linktr.ee/messaging-react 2.2.3 → 2.3.0-rc-1779427772

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 (33) hide show
  1. package/dist/{Card-BRub_HpW.js → Card-B7yHs01-.js} +16 -16
  2. package/dist/{Card-BRub_HpW.js.map → Card-B7yHs01-.js.map} +1 -1
  3. package/dist/{Card-CyszwESe.cjs → Card-BkWwtS0b.cjs} +2 -2
  4. package/dist/{Card-CyszwESe.cjs.map → Card-BkWwtS0b.cjs.map} +1 -1
  5. package/dist/{Card-DWH_vCQD.cjs → Card-BlzGsGam.cjs} +2 -2
  6. package/dist/{Card-DWH_vCQD.cjs.map → Card-BlzGsGam.cjs.map} +1 -1
  7. package/dist/{Card-imQIyJzJ.cjs → Card-DApWNv5V.cjs} +2 -2
  8. package/dist/{Card-imQIyJzJ.cjs.map → Card-DApWNv5V.cjs.map} +1 -1
  9. package/dist/{Card-DOws_Rs6.js → Card-DKp7ijLV.js} +6 -6
  10. package/dist/{Card-DOws_Rs6.js.map → Card-DKp7ijLV.js.map} +1 -1
  11. package/dist/{Card-Ccy5fPho.js → Card-Djm6JjNo.js} +19 -19
  12. package/dist/{Card-Ccy5fPho.js.map → Card-Djm6JjNo.js.map} +1 -1
  13. package/dist/{LockedThumbnail-D512VE6T.cjs → LockedThumbnail-BjF6khtg.cjs} +2 -2
  14. package/dist/{LockedThumbnail-D512VE6T.cjs.map → LockedThumbnail-BjF6khtg.cjs.map} +1 -1
  15. package/dist/{LockedThumbnail-C9eocsRT.js → LockedThumbnail-pm6jo2B4.js} +8 -8
  16. package/dist/{LockedThumbnail-C9eocsRT.js.map → LockedThumbnail-pm6jo2B4.js.map} +1 -1
  17. package/dist/assets/index.css +1 -1
  18. package/dist/index-7sLuX6s4.cjs +18 -0
  19. package/dist/index-7sLuX6s4.cjs.map +1 -0
  20. package/dist/index-Co-LV7yc.js +8220 -0
  21. package/dist/index-Co-LV7yc.js.map +1 -0
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.js +1 -1
  24. package/package.json +1 -1
  25. package/src/components/ChannelView.tsx +8 -2
  26. package/src/components/CustomMessage/CustomMessage.stories.tsx +140 -0
  27. package/src/components/CustomMessage/CustomMessageActions.tsx +35 -0
  28. package/src/components/CustomMessage/index.tsx +20 -15
  29. package/src/styles.css +84 -19
  30. package/dist/index-IlgylJT2.cjs +0 -2
  31. package/dist/index-IlgylJT2.cjs.map +0 -1
  32. package/dist/index-uxWUZe1M.js +0 -4790
  33. package/dist/index-uxWUZe1M.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Co-LV7yc.js","sources":["../src/providers/MessagingProvider.tsx","../src/hooks/useMessaging.ts","../src/hooks/useRestorePendingMessages.ts","../src/components/ChannelList/ChannelListContext.tsx","../src/hooks/useChannelStar.ts","../src/utils/formatRelativeTime.ts","../src/utils/getMessageDisplayText.ts","../src/utils/resolveParticipantDisplayName.ts","../src/components/Avatar/getAvatarEmoji.ts","../src/components/Avatar/index.tsx","../src/components/CustomMessage/MessageTag.tsx","../src/components/ChannelList/CustomChannelPreview.tsx","../src/components/ChannelList/index.tsx","../src/components/ActionButton/index.tsx","../src/components/IconButton/index.tsx","../src/components/CloseButton/index.tsx","../src/components/ChannelInfoDialog/index.tsx","../src/components/CustomDateSeparator/index.tsx","../src/hooks/useMessageVote.ts","../src/components/LockedAttachment/index.tsx","../src/components/AttachmentCard/utils/mimeType.ts","../src/components/AttachmentCard/utils/icons.ts","../src/components/AttachmentCard/MediaPlayer.tsx","../src/components/AttachmentCard/Thumbnail.tsx","../src/components/AttachmentCard/index.tsx","../src/components/MediaMessage/index.tsx","../src/components/LockedAttachment/types.ts","../src/components/CustomMessage/context.tsx","../src/components/CustomMessage/MessageVoteButtons.tsx","../src/components/CustomMessage/index.tsx","../../../node_modules/clsx/dist/clsx.mjs","../../../node_modules/stream-chat-react/dist/context/ChannelStateContext.js","../../../node_modules/stream-chat-react/dist/context/ChatContext.js","../../../node_modules/stream-chat-react/dist/context/ComponentContext.js","../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../../../node_modules/use-sync-external-store/shim/index.js","../../../node_modules/stream-chat-react/dist/store/hooks/useStateStore.js","../../../node_modules/stream-chat-react/dist/components/Dialog/hooks/useDialog.js","../../../node_modules/stream-chat-react/dist/components/Portal/Portal.js","../../../node_modules/stream-chat-react/dist/components/Dialog/DialogPortal.js","../../../node_modules/stream-chat-react/dist/context/DialogManagerContext.js","../../../node_modules/stream-chat-react/dist/context/MessageContext.js","../../../node_modules/dayjs/dayjs.min.js","../../../node_modules/dayjs/plugin/calendar.js","../../../node_modules/dayjs/plugin/localizedFormat.js","../../../node_modules/stream-chat-react/dist/i18n/utils.js","../../../node_modules/stream-chat-react/dist/context/TranslationContext.js","../../../node_modules/stream-chat-react/dist/components/Threads/ThreadContext.js","../../../node_modules/stream-chat-react/dist/components/Threads/icons.js","../../../node_modules/stream-chat-react/dist/utils/getWholeChar.js","../../../node_modules/stream-chat-react/dist/components/Avatar/Avatar.js","../../../node_modules/stream-chat-react/dist/components/Message/utils.js","../../../node_modules/stream-chat-react/dist/components/Message/hooks/useUserRole.js","../../../node_modules/stream-chat-react/dist/components/Message/hooks/useMessageReminder.js","../../../node_modules/react-aria/dist/private/utils/domHelpers.mjs","../../../node_modules/react-stately/dist/private/flags/flags.mjs","../../../node_modules/react-aria/dist/private/utils/shadowdom/DOMFunctions.mjs","../../../node_modules/react-aria/dist/private/utils/shadowdom/ShadowTreeWalker.mjs","../../../node_modules/react-aria/dist/private/utils/focusWithoutScrolling.mjs","../../../node_modules/react-aria/dist/private/utils/isElementVisible.mjs","../../../node_modules/react-aria/dist/private/utils/isFocusable.mjs","../../../node_modules/react-aria/dist/private/utils/useLayoutEffect.mjs","../../../node_modules/react-aria/dist/private/interactions/utils.mjs","../../../node_modules/react-aria/dist/private/utils/platform.mjs","../../../node_modules/react-aria/dist/private/utils/isVirtualEvent.mjs","../../../node_modules/react-aria/dist/private/utils/openLink.mjs","../../../node_modules/react-aria/dist/private/interactions/useFocusVisible.mjs","../../../node_modules/react-aria/dist/private/utils/runAfterTransition.mjs","../../../node_modules/react-aria/dist/private/interactions/focusSafely.mjs","../../../node_modules/react-aria/dist/private/focus/FocusScope.mjs","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../../../node_modules/stream-chat-react/node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs","../../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../../../node_modules/stream-chat-react/node_modules/@floating-ui/react/dist/floating-ui.react.mjs","../../../node_modules/stream-chat-react/dist/components/Dialog/hooks/usePopoverPosition.js","../../../node_modules/stream-chat-react/dist/components/Dialog/DialogAnchor.js","../../../node_modules/stream-chat-react/dist/components/Dialog/ButtonWithSubmenu.js","../../../node_modules/stream-chat-react/dist/components/MessageActions/RemindMeSubmenu.js","../../../node_modules/stream-chat-react/dist/components/Message/icons.js","../../../node_modules/stream-chat-react/dist/components/MessageActions/MessageActions.js","../../../node_modules/stream-chat-react/dist/components/Reactions/utils/utils.js","../../../node_modules/stream-chat-react/dist/components/Reactions/SpriteImage.js","../../../node_modules/stream-chat-react/dist/components/Reactions/StreamEmoji.js","../../../node_modules/stream-chat-react/dist/components/Reactions/reactionOptions.js","../../../node_modules/stream-chat-react/dist/components/Reactions/ReactionSelector.js","../../../node_modules/stream-chat-react/dist/components/Reactions/ReactionSelectorWithButton.js","../../../node_modules/stream-chat-react/dist/components/Thread/LegacyThreadContext.js","../../../node_modules/stream-chat-react/dist/components/MessageInput/hooks/useMessageComposer.js","../../../node_modules/stream-chat-react/dist/experimental/MessageActions/hooks/useBaseMessageActionSetFilter.js","../../../node_modules/stream-chat-react/dist/experimental/MessageActions/hooks/useSplitMessageActionSet.js","../../../node_modules/stream-chat-react/dist/experimental/MessageActions/defaults.js","../../../node_modules/stream-chat-react/dist/experimental/MessageActions/MessageActions.js","../src/components/CustomMessage/CustomMessageActions.tsx","../src/components/CustomLinkPreviewList/index.tsx","../src/components/CustomMessageInput/index.tsx","../src/components/CustomSystemMessage/index.tsx","../src/components/CustomTypingIndicator/DmAgentContext.ts","../src/components/CustomTypingIndicator/index.tsx","../src/components/MessagingShell/ChannelEmptyState.tsx","../src/components/Loading/index.tsx","../src/components/MessagingShell/LoadingState.tsx","../src/components/ChannelView.tsx","../src/components/MessagingShell/EmptyState.tsx","../src/components/MessagingShell/ErrorState.tsx","../src/components/MessagingShell/index.tsx","../src/components/LinkAttachment/components/_shared/normalizeExternalHref.ts","../src/components/LinkAttachment/components/_shared/CardCta.tsx","../src/components/LinkAttachment/components/_shared/CardBody.tsx","../src/components/LinkAttachment/components/_shared/CardShell.tsx","../src/components/LinkAttachment/components/_shared/CardThumbnail.tsx","../src/components/LinkAttachment/components/Composer/Card.tsx","../src/components/LinkAttachment/components/Received/Card.tsx","../src/components/LinkAttachment/components/Sent/Card.tsx","../src/components/LinkAttachment/index.tsx","../src/components/MessageAttachment/_shared/Bubble.tsx","../src/components/MessageAttachment/_shared/DismissButton.tsx","../src/components/MessageAttachment/types.ts","../src/components/MessageAttachment/Audio/index.tsx","../src/components/MessageAttachment/_shared/fileMeta.ts","../src/components/MessageAttachment/_shared/CompactDocumentRow.tsx","../src/components/MessageAttachment/_shared/triggerDownload.ts","../src/components/MessageAttachment/File/index.tsx","../src/components/MessageAttachment/_shared/DownloadAction.tsx","../src/components/MessageAttachment/_shared/ViewerShell.tsx","../src/components/MessageAttachment/_shared/ImageViewer.tsx","../src/components/MessageAttachment/_shared/MediaStackGrid.tsx","../src/components/MessageAttachment/_shared/useViewer.ts","../src/components/MessageAttachment/Image/index.tsx","../src/components/MessageAttachment/_shared/PdfViewer.tsx","../src/components/MessageAttachment/Pdf/index.tsx","../src/components/MessageAttachment/_shared/VideoViewer.tsx","../src/components/MessageAttachment/Video/index.tsx","../src/components/MessageAttachment/index.tsx","../src/components/FaqList/FaqListItem.tsx","../src/components/FaqList/index.tsx"],"sourcesContent":["import { StreamChatService } from '@linktr.ee/messaging-core'\nimport React, {\n createContext,\n useContext,\n useEffect,\n useState,\n useRef,\n useCallback,\n} from 'react'\nimport type { StreamChat } from 'stream-chat'\nimport { Chat } from 'stream-chat-react'\n\nimport type { MessagingProviderProps, MessagingCapabilities } from '../types'\n\n/**\n * Context value for messaging state and service\n */\nexport interface MessagingContextValue {\n service: StreamChatService | null\n client: StreamChat | null // Stream Chat client\n isConnected: boolean\n isLoading: boolean\n error: string | null\n capabilities: MessagingCapabilities\n refreshConnection: () => Promise<void>\n debug: boolean\n}\n\nconst MessagingContext = createContext<MessagingContextValue>({\n service: null,\n client: null,\n isConnected: false,\n isLoading: false,\n error: null,\n capabilities: {},\n refreshConnection: async () => {},\n debug: false,\n})\n\n/**\n * Hook to access messaging context\n */\nexport const useMessagingContext = () => useContext(MessagingContext)\n\n/**\n * Provider component that wraps messaging-core with React state management\n */\nexport const MessagingProvider: React.FC<MessagingProviderProps> = ({\n children,\n user,\n serviceConfig,\n apiKey,\n capabilities = {},\n debug = false,\n}) => {\n // Create debug logger that respects the debug prop\n const debugLog = useCallback(\n (message: string, ...args: unknown[]) => {\n if (debug) {\n console.log(`🔥 [MessagingProvider] ${message}`, ...args)\n }\n },\n [debug]\n )\n\n debugLog('🔄 RENDER START', {\n userId: user?.id,\n apiKey: apiKey?.substring(0, 8) + '...',\n serviceConfig: !!serviceConfig,\n capabilities: Object.keys(capabilities),\n })\n\n const [service, setService] = useState<StreamChatService | null>(null)\n const [client, setClient] = useState<StreamChat | null>(null)\n const [isConnected, setIsConnected] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Prevent multiple concurrent connection attempts\n const connectingRef = useRef(false)\n\n // Track renders and prop changes\n const prevPropsRef = useRef({\n userId: user?.id,\n apiKey,\n serviceConfig,\n capabilities,\n })\n const renderCountRef = useRef(0)\n renderCountRef.current++\n\n debugLog('📊 RENDER INFO', {\n renderCount: renderCountRef.current,\n currentProps: { userId: user?.id, apiKey: apiKey?.substring(0, 8) + '...' },\n propChanges: {\n userChanged: prevPropsRef.current.userId !== user?.id,\n apiKeyChanged: prevPropsRef.current.apiKey !== apiKey,\n serviceConfigChanged:\n prevPropsRef.current.serviceConfig !== serviceConfig,\n capabilitiesChanged: prevPropsRef.current.capabilities !== capabilities,\n },\n })\n\n prevPropsRef.current = {\n userId: user?.id,\n apiKey,\n serviceConfig,\n capabilities,\n }\n\n // Initialize service when config changes\n useEffect(() => {\n const currentRender = renderCountRef.current\n debugLog('🔧 SERVICE INIT EFFECT TRIGGERED', {\n renderCount: currentRender,\n apiKey: !!apiKey,\n serviceConfig: !!serviceConfig,\n dependencies: {\n apiKey: apiKey?.substring(0, 8) + '...',\n serviceConfigRef: serviceConfig,\n serviceConfigStable:\n prevPropsRef.current.serviceConfig === serviceConfig,\n apiKeyStable: prevPropsRef.current.apiKey === apiKey,\n },\n })\n\n if (!apiKey || !serviceConfig) {\n debugLog('⚠️ SERVICE INIT SKIPPED', {\n renderCount: currentRender,\n reason: 'Missing apiKey or serviceConfig',\n })\n return\n }\n\n debugLog('🚀 CREATING NEW SERVICE', {\n renderCount: currentRender,\n apiKey: apiKey?.substring(0, 8) + '...',\n serviceConfigChanged:\n prevPropsRef.current.serviceConfig !== serviceConfig,\n })\n\n const newService = new StreamChatService({\n ...serviceConfig,\n apiKey,\n debug,\n })\n\n setService(newService)\n debugLog('✅ SERVICE SET', {\n renderCount: currentRender,\n serviceInstance: !!newService,\n })\n\n return () => {\n debugLog('🧹 SERVICE CLEANUP', {\n renderCount: currentRender,\n reason: 'Effect cleanup',\n })\n newService.disconnectUser().catch(console.error)\n }\n }, [apiKey, serviceConfig, debug, debugLog]) // Use serviceConfig object directly, not individual properties\n\n // Track if we've already connected this user with this service to prevent duplicate connections\n const connectedUserRef = useRef<{\n serviceId: StreamChatService\n userId: string\n } | null>(null)\n\n // Connect user when service and user are available\n useEffect(() => {\n debugLog('🔗 USER CONNECTION EFFECT TRIGGERED', {\n hasService: !!service,\n hasUser: !!user,\n userId: user?.id,\n isConnecting: connectingRef.current,\n isConnected: isConnected,\n dependencies: { service: !!service, userId: user?.id },\n })\n\n if (!service || !user) {\n debugLog('⚠️ USER CONNECTION SKIPPED', 'Missing service or user')\n return\n }\n\n if (connectingRef.current) {\n debugLog('⚠️ USER CONNECTION SKIPPED', 'Already connecting')\n return\n }\n\n // Check if we've already connected this exact user with this exact service instance\n if (\n connectedUserRef.current?.serviceId === service &&\n connectedUserRef.current?.userId === user.id\n ) {\n debugLog(\n '⚠️ USER CONNECTION SKIPPED',\n 'Already connected this user with this service'\n )\n return\n }\n\n const connectUser = async () => {\n debugLog('🚀 STARTING USER CONNECTION', { userId: user.id })\n connectingRef.current = true\n setIsLoading(true)\n setError(null)\n\n try {\n debugLog('📞 CALLING SERVICE.CONNECTUSER', { userId: user.id })\n const streamClient = await service.connectUser(user)\n setClient(streamClient)\n setIsConnected(true)\n connectedUserRef.current = { serviceId: service, userId: user.id } // Mark as connected\n debugLog('✅ USER CONNECTION SUCCESS', {\n userId: user.id,\n clientId: streamClient.userID,\n })\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Connection failed'\n setError(errorMessage)\n debugLog('❌ USER CONNECTION ERROR', {\n userId: user.id,\n error: errorMessage,\n })\n } finally {\n setIsLoading(false)\n connectingRef.current = false\n debugLog('🔄 USER CONNECTION FINISHED', {\n userId: user.id,\n isConnected,\n })\n }\n }\n\n connectUser()\n }, [service, user, debugLog, isConnected]) // Remove isConnected to prevent circular dependency\n\n // Disconnect when user is removed (cleanup effect)\n useEffect(() => {\n debugLog('🔌 CLEANUP EFFECT REGISTERED', {\n hasService: !!service,\n isConnected,\n })\n return () => {\n if (service && isConnected) {\n debugLog(\n '🧹 CLEANUP EFFECT TRIGGERED',\n 'Cleaning up connection on unmount'\n )\n connectedUserRef.current = null // Reset connection tracking\n service.disconnectUser().catch(console.error)\n } else {\n debugLog('🔇 CLEANUP EFFECT SKIPPED', {\n hasService: !!service,\n isConnected,\n })\n }\n }\n }, [service, isConnected, debugLog])\n\n const refreshConnection = useCallback(async () => {\n debugLog('🔄 REFRESH CONNECTION CALLED', {\n hasService: !!service,\n hasUser: !!user,\n })\n\n if (!service || !user) {\n debugLog('⚠️ REFRESH CONNECTION SKIPPED', 'Missing service or user')\n return\n }\n\n debugLog('🚀 STARTING CONNECTION REFRESH', { userId: user.id })\n setIsLoading(true)\n try {\n debugLog('🔌 DISCONNECTING FOR REFRESH')\n await service.disconnectUser()\n debugLog('📞 RECONNECTING FOR REFRESH')\n const streamClient = await service.connectUser(user)\n setClient(streamClient)\n setIsConnected(true)\n setError(null)\n debugLog('✅ CONNECTION REFRESH SUCCESS', { userId: user.id })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Refresh failed'\n setError(errorMessage)\n debugLog('❌ CONNECTION REFRESH ERROR', {\n userId: user.id,\n error: errorMessage,\n })\n } finally {\n setIsLoading(false)\n debugLog('🔄 CONNECTION REFRESH FINISHED', { userId: user.id })\n }\n }, [service, user, debugLog])\n\n // Memoize context value to prevent unnecessary re-renders\n const contextValue: MessagingContextValue = React.useMemo(() => {\n debugLog('💫 CONTEXT VALUE MEMOIZATION', {\n hasService: !!service,\n hasClient: !!client,\n isConnected,\n isLoading,\n hasError: !!error,\n capabilitiesKeys: Object.keys(capabilities),\n })\n\n return {\n service,\n client,\n isConnected,\n isLoading,\n error,\n capabilities,\n refreshConnection,\n debug,\n }\n }, [\n service,\n client,\n isConnected,\n isLoading,\n error,\n capabilities,\n refreshConnection,\n debug,\n debugLog,\n ])\n\n debugLog('🔄 RENDER END', {\n renderCount: renderCountRef.current,\n willRenderChat: !!(client && isConnected),\n contextValueReady: !!contextValue,\n })\n\n return (\n <MessagingContext.Provider value={contextValue}>\n {client && isConnected ? (\n <Chat\n client={client}\n customClasses={{\n channelList:\n 'str-chat__channel-list str-chat__channel-list-react bg-transparent lg:border-r-2 border-r-0 border-[#0000000A]',\n }}\n >\n {children}\n </Chat>\n ) : (\n children\n )}\n </MessagingContext.Provider>\n )\n}\n","import { useMessagingContext } from '../providers/MessagingProvider';\nimport type { MessagingContextValue } from '../providers/MessagingProvider';\n\n/**\n * Hook to access messaging service and state\n */\nexport const useMessaging = (): MessagingContextValue => {\n return useMessagingContext();\n};\n","import type { Channel } from 'stream-chat'\n\n/**\n * Restores pending messages into the channel's visible message list so they\n * appear as if they were already sent.\n *\n * Stream's pending-messages feature removes messages from the channel view\n * once client state is lost (e.g. page refresh). This function works around\n * that limitation by reading `channel.state.pending_messages` and\n * re-inserting them via `channel.state.addMessageSorted`.\n */\nexport function restorePendingMessages(channel: Channel) {\n const pendingMessages = channel.state.pending_messages\n if (!pendingMessages?.length) return\n\n for (const pending of pendingMessages) {\n channel.state.addMessageSorted(pending.message)\n }\n}\n","import React from 'react'\nimport type { Channel, LocalMessage } from 'stream-chat'\n\ntype ChannelListContextValue = {\n selectedChannel?: Channel | null\n onChannelSelect: (channel: Channel) => void\n debug: boolean\n renderMessagePreview?: (\n message: LocalMessage | undefined,\n defaultPreview?: string\n ) => React.ReactNode\n viewerLanguage?: string\n}\n\nconst ChannelListContext = React.createContext<ChannelListContextValue>({\n selectedChannel: undefined,\n onChannelSelect: () => {},\n debug: false,\n renderMessagePreview: undefined,\n viewerLanguage: undefined,\n})\n\nexport const ChannelListProvider = ChannelListContext.Provider\n\nexport const useChannelListContext = () => React.useContext(ChannelListContext)\n","import { useEffect, useState } from 'react'\nimport { Channel, Event } from 'stream-chat'\n\nexport const useChannelStar = (channel?: Channel) => {\n const [isChannelStarred, setIsChannelStarred] = useState(\n !!channel?.state?.membership?.pinned_at\n )\n\n useEffect(() => {\n if (!channel) {\n setIsChannelStarred(false)\n return\n }\n\n setIsChannelStarred(!!channel.state.membership?.pinned_at)\n\n const handleMemberUpdate = (event: Event) => {\n setIsChannelStarred(\n event?.member ? !!event.member.pinned_at : !!channel.state.membership?.pinned_at\n )\n }\n\n channel.on('member.updated', handleMemberUpdate)\n\n return () => {\n channel.off('member.updated', handleMemberUpdate)\n }\n }, [channel])\n\n return isChannelStarred\n}\n","/**\n * Get the number of days between two dates (calendar days in UTC, not 24-hour periods)\n * Uses UTC to ensure consistent day calculations globally since messages are stored in UTC\n */\nconst getDaysDifference = (date1: Date, date2: Date): number => {\n const d1 = new Date(\n Date.UTC(date1.getUTCFullYear(), date1.getUTCMonth(), date1.getUTCDate())\n )\n const d2 = new Date(\n Date.UTC(date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate())\n )\n const diffTime = d2.getTime() - d1.getTime()\n return Math.floor(diffTime / (1000 * 60 * 60 * 24))\n}\n\n/**\n * Format a date - shows time for today, relative time for older messages\n * (e.g., \"Just now\", \"2:08 PM\" for today, \"Yesterday\" for yesterday, \"2d\" for 2 days ago)\n */\nexport const formatRelativeTime = (date: Date): string => {\n const now = new Date()\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000)\n\n // Less than 1 minute\n if (diffInSeconds < 60) {\n return 'Just now'\n }\n\n // Check if it's today (same calendar day)\n const daysDiff = getDaysDifference(date, now)\n\n // If today, show time in 12-hour format (e.g., \"8:40 PM\")\n if (daysDiff === 0) {\n return date.toLocaleTimeString([], {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n })\n }\n\n // Yesterday\n if (daysDiff === 1) {\n return 'Yesterday'\n }\n\n // Less than 7 days - show days\n if (daysDiff < 7) {\n return `${daysDiff}d`\n }\n\n // Less than 4 weeks - show weeks\n if (daysDiff < 28) {\n const weeks = Math.floor(daysDiff / 7)\n return `${weeks}w`\n }\n\n // More than 4 weeks - show date as MM/DD/YY\n return date.toLocaleDateString('en-US', {\n month: 'numeric',\n day: 'numeric',\n year: '2-digit',\n })\n}\n","import type { LocalMessage } from 'stream-chat'\n\ntype MessageWithI18n = Pick<LocalMessage, 'text'> & {\n i18n?: Record<string, string> | null\n}\n\nexport function normalizeLanguageCode(language?: string): string | undefined {\n const normalized = language?.trim().toLowerCase().split(/[-_]/)[0]\n return normalized || undefined\n}\n\nexport function getMessageDisplayText({\n message,\n viewerLanguage,\n}: {\n message?: MessageWithI18n | null\n viewerLanguage?: string\n}): string | undefined {\n const fallbackText = message?.text\n const normalizedLanguage = normalizeLanguageCode(viewerLanguage)\n\n if (!normalizedLanguage) {\n return fallbackText\n }\n\n return message?.i18n?.[`${normalizedLanguage}_text`] ?? fallbackText\n}\n","const UUID_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\nexport type ParticipantDisplayUser = {\n id?: string\n name?: string | null\n username?: string | null\n}\n\nexport function isUuidLike(value: string): boolean {\n return UUID_REGEX.test(value.trim())\n}\n\nfunction isUsableDisplayValue(\n value: string | null | undefined,\n userId?: string\n): value is string {\n const trimmed = value?.trim()\n if (!trimmed) return false\n if (userId && trimmed === userId) return false\n return !isUuidLike(trimmed)\n}\n\n/**\n * Resolves a human-readable participant label from Stream user fields.\n * Never falls back to user.id. UUID-like names are treated as missing.\n */\nexport function resolveParticipantDisplayName(\n user?: ParticipantDisplayUser | null\n): string {\n if (isUsableDisplayValue(user?.name, user?.id)) {\n return user.name.trim()\n }\n\n if (isUsableDisplayValue(user?.username, user?.id)) {\n return user.username.trim()\n }\n\n return 'Unknown member'\n}\n","/**\n * Generate a fruit emoji based on a string id\n * Returns a consistent fruit emoji for the same id\n */\nconst EMOJIS = [\n '🍎', // Apple\n '🍌', // Banana\n '🍇', // Grape\n '🍊', // Orange\n '🍓', // Strawberry\n '🥥', // Coconut\n '🍒', // Cherry\n '🥭', // Mango\n '🍉', // Watermelon\n '🍋', // Lemon\n '🥝', // Kiwi\n '🫒', // Olive\n '🍈', // Melon\n]\n\n/**\n * Simple hash function to convert string to number\n */\nfunction hashString(str: string): number {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash // Convert to 32-bit integer\n }\n return Math.abs(hash)\n}\n\n/**\n * Get a fruit emoji based on an id string\n * @param id - The string id to generate emoji from\n * @returns A fruit emoji string\n */\nexport function getAvatarEmoji(id: string): string {\n const hash = hashString(id)\n const index = hash % EMOJIS.length\n return EMOJIS[index]\n}\n\n","import { StarIcon } from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React from 'react'\n\nimport { getAvatarEmoji } from './getAvatarEmoji'\n\nexport interface AvatarProps {\n id: string\n name: string\n image?: string\n size?: number\n className?: string\n starred?: boolean\n shape?: 'squircle' | 'circle'\n dmAgentEnabled?: boolean\n}\n\n/**\n * Avatar component that displays a user image or colored initial fallback\n */\nexport const Avatar = ({\n id,\n image,\n size = 40,\n className,\n starred = false,\n shape = 'squircle',\n dmAgentEnabled = false,\n}: AvatarProps) => {\n const emoji = getAvatarEmoji(id)\n\n const getFontSizeClass = () => {\n if (size < 32) return 'text-xs'\n if (size < 56) return 'text-sm'\n if (size < 120) return 'text-lg'\n return 'text-4xl'\n }\n\n const fontSizeClass = getFontSizeClass()\n // Match design treatment: 2px AI border at 40px avatar size.\n const aiBorderWidth = size >= 40 ? 2 : 1\n\n const borderStyle =\n shape === 'circle'\n ? { borderRadius: '50%' }\n : {\n borderRadius: '33%',\n cornerShape: 'superellipse(1.3)',\n }\n\n const avatarInner = (\n <div className=\"h-full w-full overflow-hidden\" style={borderStyle}>\n {image ? (\n <img\n src={image}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div\n aria-hidden=\"true\"\n className={classNames(\n 'avatar-fallback flex h-full w-full items-center justify-center bg-[#E6E5E3] font-semibold select-none transition-colors',\n fontSizeClass\n )}\n >\n {emoji}\n </div>\n )}\n </div>\n )\n\n return (\n <div\n className={classNames(\n 'relative flex-shrink-0 !bg-transparent',\n className\n )}\n style={{\n '--str-chat__avatar-size': `${size}px`,\n width: `${size}px`,\n height: `${size}px`,\n } as React.CSSProperties}\n >\n {starred && (\n <div\n aria-hidden=\"true\"\n className=\"absolute -left-1.5 -top-1.5 z-10 flex size-5 items-center justify-center rounded-full bg-white shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]\"\n >\n <StarIcon className=\"size-3 text-yellow-600\" weight=\"duotone\" />\n </div>\n )}\n <div\n data-testid=\"avatar-ring\"\n className={classNames(\n 'h-full w-full',\n 'bg-transparent'\n )}\n style={{\n ...borderStyle,\n ...(dmAgentEnabled && {\n borderWidth: `${aiBorderWidth}px`,\n borderStyle: 'solid',\n borderColor: 'var(--AI-Gradient, #7F22FE)',\n boxShadow: 'inset 0 1px 2px 0 rgba(255, 255, 255, 0.5)',\n }),\n }}\n >\n {avatarInner}\n </div>\n </div>\n )\n}\n","import { GiftIcon } from '@phosphor-icons/react'\nimport { LocalMessage } from 'stream-chat'\n\ninterface MessageTagProps {\n message: LocalMessage\n /** When true, renders as a standalone bubble instead of a small tag */\n standalone?: boolean\n /** When true, renders sender-side chatbot variants */\n isMyMessage?: boolean\n /** Whether the message includes an attachment */\n hasAttachment?: boolean\n}\n\nconst SparkleIcon = ({ size = 15 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 15 15\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M12.003 9a.985.985 0 0 1-.652.934l-3.223 1.191-1.188 3.226a.995.995 0 0 1-1.867 0l-1.195-3.226L.65 9.937a.995.995 0 0 1 0-1.867l3.227-1.195 1.187-3.226a.995.995 0 0 1 1.868 0l1.195 3.226 3.226 1.187a.99.99 0 0 1 .649.938m3-5.83a.52.52 0 0 1-.344.492l-1.702.63-.627 1.703a.525.525 0 0 1-.986 0l-.63-1.704-1.704-.627a.525.525 0 0 1 0-.986l1.703-.63.627-1.704a.526.526 0 0 1 .986 0l.631 1.703 1.704.627a.52.52 0 0 1 .342.495\"\n fill=\"currentColor\"\n fillOpacity={0.55}\n />\n </svg>\n)\n\n/** Check if a message is a tip based on metadata */\nexport const isTipMessage = (message: LocalMessage): boolean => {\n return message.metadata?.custom_type === 'MESSAGE_TIP'\n}\n\n/** Check if a message is a paid message based on metadata */\nexport const isPaidMessage = (message: LocalMessage): boolean => {\n return message.metadata?.custom_type === 'MESSAGE_PAID'\n}\n\n/** Check if a message is a chatbot message based on metadata */\nexport const isChatbotMessage = (message: LocalMessage): boolean => {\n return message.metadata?.custom_type === 'MESSAGE_CHATBOT'\n}\n\n/** Check if a message is a locked attachment */\nexport const isAttachmentMessage = (message: LocalMessage): boolean => {\n return message.metadata?.custom_type === 'MESSAGE_ATTACHMENT'\n}\n\n/** Check if a message has a tip/paid tag (both render the same) */\nexport const isTipOrPaidMessage = (message: LocalMessage): boolean => {\n return isTipMessage(message) || isPaidMessage(message)\n}\n\n/** Check if a message is a tip/paid-only message (no text) */\nexport const isTipOnlyMessage = (message: LocalMessage): boolean => {\n return isTipOrPaidMessage(message) && !message.text?.trim()\n}\n\nexport const MessageTag = ({\n message,\n standalone = false,\n isMyMessage = false,\n hasAttachment = false,\n}: MessageTagProps) => {\n const isTipOrPaid = isTipOrPaidMessage(message)\n const isChatbot = isChatbotMessage(message)\n\n if (!isTipOrPaid && !isChatbot) {\n return null\n }\n\n if (isTipOrPaid) {\n const amountText = message.metadata?.amount_text\n if (!amountText) return null\n\n const className = standalone\n ? 'message-tip-standalone'\n : 'message-tag message-tag--tip'\n\n const label = standalone\n ? `${amountText} tip`\n : `Delivered with ${amountText} tip`\n\n return (\n <div className={className}>\n <GiftIcon size={standalone ? 14 : 12} />\n <span>{label}</span>\n </div>\n )\n }\n\n const isSenderAttachmentVariant = isMyMessage && hasAttachment\n const chatbotLabel = isSenderAttachmentVariant\n ? 'Sent with AI'\n : 'Sent with DM Agent'\n\n const chatbotClassName = [\n 'message-chatbot-indicator',\n isMyMessage\n ? 'message-chatbot-indicator--sender'\n : 'message-chatbot-indicator--receiver',\n isSenderAttachmentVariant\n ? 'message-chatbot-indicator--attachment'\n : 'message-chatbot-indicator--text',\n ].join(' ')\n\n const label = (\n <span className=\"message-chatbot-indicator__label\">{chatbotLabel}</span>\n )\n const icon = (\n <span className=\"message-chatbot-indicator__icon\">\n <SparkleIcon size={isSenderAttachmentVariant ? 12 : 15} />\n </span>\n )\n\n // Chatbot indicator variant\n return (\n <div className={chatbotClassName} data-testid=\"message-chatbot-indicator\">\n {isMyMessage && !isSenderAttachmentVariant ? (\n <>\n {label}\n {icon}\n </>\n ) : (\n <>\n {icon}\n {label}\n </>\n )}\n </div>\n )\n}\n","import classNames from 'classnames'\nimport React from 'react'\nimport { ChannelPreviewUIComponentProps } from 'stream-chat-react'\n\nimport { useChannelStar } from '../../hooks/useChannelStar'\nimport { formatRelativeTime } from '../../utils/formatRelativeTime'\nimport { getMessageDisplayText } from '../../utils/getMessageDisplayText'\nimport { resolveParticipantDisplayName } from '../../utils/resolveParticipantDisplayName'\nimport { Avatar } from '../Avatar'\nimport { isChatbotMessage } from '../CustomMessage/MessageTag'\n\nimport { useChannelListContext } from './ChannelListContext'\n\n/**\n * Custom channel preview that handles selection\n */\nconst CustomChannelPreview = React.memo<ChannelPreviewUIComponentProps>(\n ({ channel, unread }) => {\n const {\n selectedChannel,\n onChannelSelect,\n debug,\n renderMessagePreview,\n viewerLanguage,\n } = useChannelListContext()\n\n const isSelected = selectedChannel?.id === channel?.id\n\n const handleClick = () => {\n if (channel) {\n onChannelSelect(channel)\n }\n }\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const isActivationKey = event.key === 'Enter' || event.key === ' '\n const isRepeatedKeydown = event.repeat\n\n if (!isActivationKey || isRepeatedKeydown) return\n\n event.preventDefault()\n handleClick()\n }\n\n // Get participant info\n const members = Object.values(channel?.state?.members || {})\n const participant = members.find(\n (member) => member.user?.id && member.user.id !== channel?._client?.userID\n )\n const participantName = resolveParticipantDisplayName(participant?.user)\n const participantImage = participant?.user?.image\n\n // Get last non-system message for preview\n const lastMessage = (() => {\n const messages = channel?.state?.messages\n if (!messages?.length) return undefined\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].type !== 'system') return messages[i]\n }\n return undefined\n })()\n\n const getLastMessageText = () => {\n const displayText = getMessageDisplayText({\n message: lastMessage,\n viewerLanguage,\n })\n if (displayText) return displayText\n\n const isTip = lastMessage?.metadata?.custom_type === 'MESSAGE_TIP'\n if (isTip) return '💵 Sent a tip'\n\n const attachment = lastMessage?.attachments?.[0]\n if (attachment) {\n // Link previews - show the actual URL\n if (attachment.og_scrape_url) return attachment.og_scrape_url\n\n // Type-based detection\n if (attachment.type === 'image') return '📷 Sent an image'\n if (attachment.type === 'video') return '🎥 Sent a video'\n if (attachment.type === 'audio') return '🎵 Sent audio'\n if (attachment.type === 'file') return '📎 Sent a file'\n\n // Fallback\n return '📎 Sent an attachment'\n }\n\n return 'No messages yet'\n }\n\n const lastMessageText = getLastMessageText()\n const lastMessageTime = lastMessage?.created_at\n ? formatRelativeTime(new Date(lastMessage.created_at))\n : ''\n const isLastMessageFromChatbot = lastMessage\n ? isChatbotMessage(lastMessage)\n : false\n\n const messagePreview = renderMessagePreview\n ? renderMessagePreview(lastMessage, lastMessageText)\n : `${isLastMessageFromChatbot ? '✨ ' : ''}${lastMessageText}`\n const isChannelStarred = useChannelStar(channel)\n\n // Use the unread prop passed by Stream Chat (reactive and updates automatically)\n const unreadCount = unread ?? 0\n\n if (debug) {\n console.log('📺 [ChannelList] 📋 CHANNEL PREVIEW RENDER', {\n channelId: channel?.id,\n isSelected,\n participantName,\n unreadCount,\n hasTimestamp: !!lastMessageTime,\n })\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={classNames(\n 'group w-full px-4 py-3 transition-colors text-left max-w-full overflow-hidden focus-ring',\n {\n 'bg-primary-alt/10 border-l-4 border-l-primary': isSelected,\n 'hover:bg-sand': !isSelected,\n }\n )}\n >\n <div className=\"flex items-start gap-3\">\n {/* Avatar */}\n <Avatar\n id={participant?.user?.id || channel.id || 'unknown'}\n name={participantName}\n image={participantImage}\n size={44}\n starred={isChannelStarred}\n className=\"[&_.avatar-fallback]:group-hover:bg-[#eeeeee]\"\n />\n\n {/* Content column */}\n <div className=\"flex-1 min-w-0 flex flex-col gap-1\">\n {/* Name and timestamp row */}\n <div className=\"flex items-center justify-between gap-2\">\n <h3\n className={classNames(\n 'text-sm font-medium truncate',\n isSelected ? 'text-primary' : 'text-charcoal'\n )}\n >\n {isChannelStarred && (\n <span className=\"sr-only\">Starred conversation. </span>\n )}\n {participantName}\n </h3>\n {lastMessageTime && (\n <span className=\"text-xs text-stone flex-shrink-0\">\n {lastMessageTime}\n </span>\n )}\n </div>\n\n {/* Message and unread badge row */}\n <div className=\"flex items-center justify-between gap-2 min-w-0\">\n <p className=\"text-xs text-stone flex-1 line-clamp-1\">\n {messagePreview}\n </p>\n {unreadCount > 0 && (\n <span className=\"bg-[#7f22fe] text-white text-xs px-2 py-0.5 rounded-full min-w-[20px] text-center flex-shrink-0\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n }\n)\n\nexport default CustomChannelPreview\nCustomChannelPreview.displayName = 'CustomChannelPreview'\n","import classNames from 'classnames'\nimport React from 'react'\nimport type { Channel } from 'stream-chat'\nimport { ChannelList as StreamChannelList } from 'stream-chat-react'\n\nimport { restorePendingMessages } from '../../hooks/useRestorePendingMessages'\nimport { useMessagingContext } from '../../providers/MessagingProvider'\nimport type { ChannelListProps } from '../../types'\n\nimport { ChannelListProvider } from './ChannelListContext'\nimport CustomChannelPreview from './CustomChannelPreview'\n\nconst DEFAULT_SORT = { last_message_at: -1 } as const\n\n/**\n * Channel list component with customizable header and actions\n */\nexport const ChannelList = React.memo<ChannelListProps>(\n ({\n onChannelSelect,\n selectedChannel,\n filters,\n allowNewMessagesFromUnfilteredChannels = false,\n onMessageNew,\n onAddedToChannel,\n channelRenderFilterFn,\n sort = DEFAULT_SORT,\n className,\n customEmptyStateIndicator,\n renderMessagePreview,\n viewerLanguage,\n }) => {\n // Track renders\n const renderCountRef = React.useRef(0)\n renderCountRef.current++\n\n // Get debug flag from context\n const { debug = false } = useMessagingContext()\n\n // Wrap channelRenderFilterFn to restore pending messages for all channels\n // as soon as they are loaded, without waiting for the user to click into each one.\n const wrappedChannelRenderFilterFn = React.useCallback(\n (channels: Channel[]) => {\n for (const channel of channels) {\n restorePendingMessages(channel)\n }\n return channelRenderFilterFn\n ? channelRenderFilterFn(channels)\n : channels\n },\n [channelRenderFilterFn]\n )\n\n if (debug) {\n console.log('📺 [ChannelList] 🔄 RENDER START', {\n renderCount: renderCountRef.current,\n selectedChannelId: selectedChannel?.id,\n filters,\n })\n }\n\n const contextValue = React.useMemo(\n () => ({\n selectedChannel,\n onChannelSelect,\n debug,\n renderMessagePreview,\n viewerLanguage,\n }),\n [\n selectedChannel,\n onChannelSelect,\n debug,\n renderMessagePreview,\n viewerLanguage,\n ]\n )\n\n return (\n <div\n className={classNames(\n 'messaging-channel-list h-full flex flex-col min-w-0 overflow-hidden',\n className\n )}\n >\n {/* Channel List */}\n <div className=\"flex-1 overflow-hidden min-w-0\">\n <ChannelListProvider value={contextValue}>\n <StreamChannelList\n key={`${JSON.stringify(filters)}:${JSON.stringify(sort)}`}\n filters={filters}\n sort={sort}\n options={{ limit: 30 }}\n allowNewMessagesFromUnfilteredChannels={\n allowNewMessagesFromUnfilteredChannels\n }\n onMessageNew={onMessageNew}\n onAddedToChannel={onAddedToChannel}\n channelRenderFilterFn={wrappedChannelRenderFilterFn}\n Preview={CustomChannelPreview}\n EmptyStateIndicator={customEmptyStateIndicator}\n />\n </ChannelListProvider>\n </div>\n </div>\n )\n }\n)\nChannelList.displayName = 'ChannelList'\n","import classNames from \"classnames\";\nimport React from \"react\";\n\nexport interface ActionButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"danger\";\n}\n\nconst ActionButton = ({\n variant = \"default\",\n className,\n children,\n ...rest\n}: ActionButtonProps) => {\n const isDanger = variant === \"danger\";\n return (\n <button\n type=\"button\"\n className={classNames(\n \"flex w-full items-center gap-3 rounded-lg px-4 py-3 text-left text-sm transition-colors focus-ring disabled:cursor-not-allowed disabled:opacity-60\",\n isDanger\n ? \"text-danger hover:bg-danger/50\"\n : \"text-charcoal hover:bg-sand\",\n className,\n )}\n {...rest}\n >\n {children}\n </button>\n );\n};\n\nexport default ActionButton;\n","import classNames from \"classnames\";\nimport React from \"react\";\n\ninterface IconButtonProps\n extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"children\"\n > {\n label: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function IconButton({ label, className, children, ...rest }: IconButtonProps) {\n return (\n <button\n type=\"button\"\n className={classNames(\n \"inline-flex items-center justify-center rounded-full transition-colors focus-ring p-2\",\n {\n \"cursor-not-allowed opacity-50\": rest.disabled,\n \"hover:bg-sand\": !rest.disabled,\n },\n className,\n )}\n {...rest}\n >\n <span className=\"sr-only\">{label}</span>\n {children}\n </button>\n );\n}","import { XIcon } from '@phosphor-icons/react'\n\nimport { IconButton } from '../IconButton'\n\ninterface CloseButtonProps {\n onClick: () => void\n}\n\nexport function CloseButton({ onClick }: CloseButtonProps) {\n return (\n <IconButton label=\"Close\" onClick={onClick} className=\"p-1\">\n <XIcon className=\"h-5 w-5 text-stone\" weight=\"bold\" />\n </IconButton>\n )\n}\n","import {\n FlagIcon,\n ProhibitInsetIcon,\n SignOutIcon,\n SpinnerGapIcon,\n} from '@phosphor-icons/react'\nimport React, { useState, useCallback, useEffect } from 'react'\nimport type { Channel as ChannelType, ChannelMemberResponse } from 'stream-chat'\n\nimport { useMessagingContext } from '../../providers/MessagingProvider'\nimport { resolveParticipantDisplayName } from '../../utils/resolveParticipantDisplayName'\nimport ActionButton from '../ActionButton'\nimport { Avatar } from '../Avatar'\nimport { CloseButton } from '../CloseButton'\n\n// Custom user type with username\ntype CustomUser = {\n username?: string\n}\n\n// Blocked user from Stream Chat API\ntype BlockedUser = {\n blocked_user_id: string\n}\n\nexport interface ChannelInfoDialogProps {\n dialogRef: React.RefObject<HTMLDialogElement>\n onClose: () => void\n participant: ChannelMemberResponse | undefined\n participantDisplayName?: string\n channel: ChannelType\n followerStatusLabel?: string\n onLeaveConversation?: (channel: ChannelType) => void\n onBlockParticipant?: (participantId?: string) => void\n showDeleteConversation?: boolean\n onDeleteConversationClick?: () => void\n onBlockParticipantClick?: () => void\n onReportParticipantClick?: () => void\n customProfileContent?: React.ReactNode\n customChannelActions?: React.ReactNode\n}\n\n/**\n * Channel info dialog (matching original implementation)\n */\nexport const ChannelInfoDialog: React.FC<ChannelInfoDialogProps> = ({\n dialogRef,\n onClose,\n participant,\n participantDisplayName,\n channel,\n followerStatusLabel,\n onLeaveConversation,\n onBlockParticipant,\n showDeleteConversation = true,\n onDeleteConversationClick,\n onBlockParticipantClick,\n onReportParticipantClick,\n customProfileContent,\n customChannelActions,\n}) => {\n const { service, debug } = useMessagingContext()\n const [isParticipantBlocked, setIsParticipantBlocked] = useState(false)\n const [isLeaving, setIsLeaving] = useState(false)\n const [isUpdatingBlockStatus, setIsUpdatingBlockStatus] = useState(false)\n\n // Check if participant is blocked when participant changes\n const checkIsParticipantBlocked = useCallback(async () => {\n if (!service || !participant?.user?.id) return\n\n try {\n const blockedUsers = await service.getBlockedUsers()\n const isBlocked = blockedUsers.some(\n (user: BlockedUser) => user.blocked_user_id === participant?.user?.id\n )\n setIsParticipantBlocked(isBlocked)\n } catch (error) {\n console.error(\n '[ChannelInfoDialog] Failed to check blocked status:',\n error\n )\n }\n }, [service, participant?.user?.id])\n\n useEffect(() => {\n checkIsParticipantBlocked()\n }, [checkIsParticipantBlocked])\n\n const handleLeaveConversation = async () => {\n if (isLeaving) return\n\n // Fire analytics callback before action\n onDeleteConversationClick?.()\n\n if (debug) {\n console.log('[ChannelInfoDialog] Leave conversation', channel.cid)\n }\n setIsLeaving(true)\n\n try {\n const actingUserId = channel._client?.userID ?? null\n await channel.hide(actingUserId, false)\n\n if (onLeaveConversation) {\n await onLeaveConversation(channel)\n }\n\n onClose()\n } catch (error) {\n console.error('[ChannelInfoDialog] Failed to leave conversation', error)\n } finally {\n setIsLeaving(false)\n }\n }\n\n const handleBlockUser = async () => {\n if (isUpdatingBlockStatus || !service) return\n\n // Fire analytics callback before action\n onBlockParticipantClick?.()\n\n if (debug) {\n console.log('[ChannelInfoDialog] Block member', participant?.user?.id)\n }\n setIsUpdatingBlockStatus(true)\n\n try {\n await service.blockUser(participant?.user?.id)\n\n if (onBlockParticipant) {\n await onBlockParticipant(participant?.user?.id)\n }\n\n onClose()\n } catch (error) {\n console.error('[ChannelInfoDialog] Failed to block member', error)\n } finally {\n setIsUpdatingBlockStatus(false)\n }\n }\n\n const handleUnblockUser = async () => {\n if (isUpdatingBlockStatus || !service) return\n\n // Fire analytics callback before action\n onBlockParticipantClick?.()\n\n if (debug) {\n console.log('[ChannelInfoDialog] Unblock member', participant?.user?.id)\n }\n setIsUpdatingBlockStatus(true)\n\n try {\n await service.unBlockUser(participant?.user?.id)\n\n if (onBlockParticipant) {\n await onBlockParticipant(participant?.user?.id)\n }\n\n onClose()\n } catch (error) {\n console.error('[ChannelInfoDialog] Failed to unblock member', error)\n } finally {\n setIsUpdatingBlockStatus(false)\n }\n }\n\n const handleReportUser = () => {\n // Fire analytics callback before action\n onReportParticipantClick?.()\n\n onClose()\n window.open(\n 'https://linktr.ee/s/about/trust-center/report',\n '_blank',\n 'noopener,noreferrer'\n )\n }\n\n if (!participant) return null\n\n const participantName =\n participantDisplayName ??\n resolveParticipantDisplayName(participant.user)\n const participantImage = participant.user?.image\n const participantUsername = (participant.user as CustomUser)?.username\n const participantSecondary = participantUsername\n ? `linktr.ee/${participantUsername}`\n : undefined\n const participantId = participant.user?.id || 'unknown'\n\n return (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions\n <dialog\n ref={dialogRef}\n className=\"mes-dialog group\"\n onClose={onClose}\n onClick={(e) => {\n if (e.target === dialogRef.current) {\n onClose()\n }\n }}\n >\n <div className=\"ml-auto flex h-full w-full flex-col bg-white shadow-none transition-shadow duration-200 group-open:shadow-max-elevation-light\">\n <div className=\"flex items-center justify-between border-b border-sand px-4 py-3\">\n <h2 className=\"text-base font-semibold text-charcoal\">Chat info</h2>\n <CloseButton onClick={onClose} />\n </div>\n\n <div className=\"flex-1 px-2 overflow-y-auto w-full\">\n <div\n className=\"flex flex-col items-center gap-3 self-stretch px-4 py-2 mt-6 rounded-lg border border-black/[0.04]\"\n style={{ backgroundColor: '#FBFAF9' }}\n >\n <div className=\"flex items-center gap-3 w-full\">\n <Avatar\n id={participantId}\n name={participantName}\n image={participantImage}\n size={88}\n shape=\"circle\"\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <p className=\"truncate text-base font-semibold text-charcoal\">\n {participantName}\n </p>\n {participantSecondary && (\n <p className=\"truncate text-sm text-[#00000055]\">\n {participantSecondary}\n </p>\n )}\n {/* Deprecated: use customProfileContent instead. followerStatusLabel will be removed in a future release. */}\n {followerStatusLabel && !customProfileContent && (\n <span\n className=\"mt-1 rounded-full text-xs font-normal w-fit\"\n style={{\n padding: '4px 8px',\n backgroundColor:\n followerStatusLabel === 'Subscribed to you'\n ? '#DCFCE7'\n : '#F5F5F4',\n color:\n followerStatusLabel === 'Subscribed to you'\n ? '#008236'\n : '#78716C',\n lineHeight: '133.333%',\n letterSpacing: '0.21px',\n }}\n >\n {followerStatusLabel}\n </span>\n )}\n </div>\n </div>\n {customProfileContent && (\n <div className=\"w-full\">{customProfileContent}</div>\n )}\n </div>\n\n <ul className=\"flex flex-col gap-2 mt-2\">\n {showDeleteConversation && (\n <li>\n <ActionButton\n onClick={handleLeaveConversation}\n disabled={isLeaving}\n aria-busy={isLeaving}\n >\n {isLeaving ? (\n <SpinnerGapIcon className=\"h-5 w-5 animate-spin\" />\n ) : (\n <SignOutIcon className=\"h-5 w-5\" />\n )}\n <span>Delete Conversation</span>\n </ActionButton>\n </li>\n )}\n <li>\n {isParticipantBlocked ? (\n <ActionButton\n onClick={handleUnblockUser}\n disabled={isUpdatingBlockStatus}\n aria-busy={isUpdatingBlockStatus}\n >\n {isUpdatingBlockStatus ? (\n <SpinnerGapIcon className=\"h-5 w-5 animate-spin\" />\n ) : (\n <ProhibitInsetIcon className=\"h-5 w-5\" />\n )}\n <span>Unblock</span>\n </ActionButton>\n ) : (\n <ActionButton\n onClick={handleBlockUser}\n disabled={isUpdatingBlockStatus}\n aria-busy={isUpdatingBlockStatus}\n >\n {isUpdatingBlockStatus ? (\n <SpinnerGapIcon className=\"h-5 w-5 animate-spin\" />\n ) : (\n <ProhibitInsetIcon className=\"h-5 w-5\" />\n )}\n <span>Block</span>\n </ActionButton>\n )}\n </li>\n <li>\n <ActionButton variant=\"danger\" onClick={handleReportUser}>\n <FlagIcon className=\"h-5 w-5\" />\n <span>Report</span>\n </ActionButton>\n </li>\n {customChannelActions}\n </ul>\n </div>\n </div>\n </dialog>\n )\n}\n","import { DateSeparator, type DateSeparatorProps } from 'stream-chat-react'\n\nexport const CustomDateSeparator = (props: DateSeparatorProps) => (\n <DateSeparator {...props} position=\"center\" />\n)\n","import { useCallback, useMemo } from 'react'\nimport type { LocalMessage } from 'stream-chat'\nimport { useChannelStateContext, useChatContext } from 'stream-chat-react'\n\nexport type VoteSelection = 'up' | 'down' | null\n\nconst VOTE_UP = 'vote_up'\nconst VOTE_DOWN = 'vote_down'\n\nfunction getVoteFromReactions(\n ownReactions: LocalMessage['own_reactions']\n): VoteSelection {\n if (!ownReactions?.length) return null\n if (ownReactions.some((r) => r.type === VOTE_DOWN)) return 'down'\n if (ownReactions.some((r) => r.type === VOTE_UP)) return 'up'\n return null\n}\n\ninterface UseMessageVoteResult {\n selected: VoteSelection\n voteUp: () => void\n voteDown: () => void\n}\n\n/**\n * Hook that wraps Stream Chat reactions to provide toggle-style\n * upvote/downvote behavior on a message.\n *\n * Uses enforce_unique so sending a new reaction type automatically\n * removes the previous one. Uses skip_push to avoid notifying the\n * Linker on every vote.\n */\nexport function useMessageVote(message: LocalMessage): UseMessageVoteResult {\n const { channel } = useChannelStateContext()\n const { client } = useChatContext('useMessageVote')\n\n const selected = useMemo(\n () => getVoteFromReactions(message.own_reactions),\n [message.own_reactions]\n )\n\n const voteUp = useCallback(async () => {\n if (!client?.userID) return\n try {\n if (selected === 'up') {\n await channel.deleteReaction(message.id, VOTE_UP)\n } else {\n await channel.sendReaction(\n message.id,\n { type: VOTE_UP },\n { enforce_unique: true, skip_push: true }\n )\n }\n } catch {\n // Silently fail — voting is non-critical\n }\n }, [channel, client?.userID, message.id, selected])\n\n const voteDown = useCallback(async () => {\n if (!client?.userID) return\n try {\n if (selected === 'down') {\n await channel.deleteReaction(message.id, VOTE_DOWN)\n } else {\n await channel.sendReaction(\n message.id,\n { type: VOTE_DOWN },\n { enforce_unique: true, skip_push: true }\n )\n }\n } catch {\n // Silently fail — voting is non-critical\n }\n }, [channel, client?.userID, message.id, selected])\n\n return { selected, voteUp, voteDown }\n}\n","import React, { Suspense } from 'react'\n\nimport type { ComposerCardProps } from './components/Composer/Card'\nimport type { ReceivedCardProps } from './components/Received/Card'\nimport type { SentCardProps } from './components/Sent/Card'\n\nconst ComposerCardLazy = React.lazy(() => import('./components/Composer/Card'))\nconst SentCardLazy = React.lazy(() => import('./components/Sent/Card'))\nconst ReceivedCardLazy = React.lazy(() => import('./components/Received/Card'))\n\nconst LockedAttachmentFallback = () => (\n <div\n className=\"w-[280px] min-h-[200px] animate-pulse rounded-md bg-black/[0.06] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_1px_2px_rgba(0,0,0,0.04),0_8px_32px_rgba(0,0,0,0.1)]\"\n aria-hidden\n />\n)\n\nconst Composer = (props: ComposerCardProps) => (\n <Suspense fallback={<LockedAttachmentFallback />}>\n <ComposerCardLazy {...props} />\n </Suspense>\n)\n\nconst Sent = (props: SentCardProps) => (\n <Suspense fallback={<LockedAttachmentFallback />}>\n <SentCardLazy {...props} />\n </Suspense>\n)\n\nconst Received = (props: ReceivedCardProps) => (\n <Suspense fallback={<LockedAttachmentFallback />}>\n <ReceivedCardLazy {...props} />\n </Suspense>\n)\n\n/**\n * @deprecated Renamed to `LockedAttachment.Sent` (post-send sender card) or\n * `LockedAttachment.Composer` (drafting state). This alias maps to `Sent`\n * because that matches the previous in-thread usage; pre-send / drafting\n * usages (e.g. with `onDismiss`) should migrate to `LockedAttachment.Composer`.\n */\nconst Creator = Sent\n\n/** @deprecated Renamed to `LockedAttachment.Received`. */\nconst Visitor = Received\n\nconst LockedAttachment = { Composer, Sent, Received, Creator, Visitor }\n\nexport default LockedAttachment\nexport type { ComposerCardProps, SentCardProps, ReceivedCardProps }\n/**\n * @deprecated Renamed to `SentCardProps`. Drafting usages (with `onDismiss`)\n * should migrate to `ComposerCardProps`.\n */\nexport type CreatorCardProps = SentCardProps\n/** @deprecated Renamed to `ReceivedCardProps`. */\nexport type VisitorCardProps = ReceivedCardProps\nexport type {\n PaymentStatus,\n LockedAttachmentSource,\n LockedAttachmentGalleryItem,\n LockedAttachmentContextValue,\n} from './types'\n","export type AttachmentSourceType = 'image' | 'audio' | 'video' | 'document'\n\nexport type DocumentIconType =\n | 'pdf'\n | 'doc'\n | 'xls'\n | 'csv'\n | 'ppt'\n | 'zip'\n | 'text'\n | 'markdown'\n | 'generic'\n\nconst DOCUMENT_ICON_PATTERNS: Array<[RegExp, DocumentIconType]> = [\n [/pdf/, 'pdf'],\n [/wordprocessingml|msword|\\.doc/, 'doc'],\n [/spreadsheetml|ms-excel|\\.xls/, 'xls'],\n [/csv/, 'csv'],\n [/presentationml|ms-powerpoint|\\.ppt/, 'ppt'],\n [/zip|x-rar|x-7z|x-tar|x-gzip/, 'zip'],\n [/plain|rtf/, 'text'],\n [/markdown/, 'markdown'],\n]\n\nexport function getSourceType(mimeType: string): AttachmentSourceType {\n if (mimeType.startsWith('video/')) return 'video'\n if (mimeType.startsWith('audio/')) return 'audio'\n if (mimeType.startsWith('image/')) return 'image'\n return 'document'\n}\n\nexport function getDocumentIconType(mimeType: string): DocumentIconType {\n const match = DOCUMENT_ICON_PATTERNS.find(([pattern]) =>\n pattern.test(mimeType)\n )\n return match ? match[1] : 'generic'\n}\n","import {\n FileIcon,\n FileCsvIcon,\n FileDocIcon,\n FileMdIcon,\n FilePdfIcon,\n FilePptIcon,\n FileTextIcon,\n FileXlsIcon,\n FileZipIcon,\n ImageIcon,\n SpeakerHighIcon,\n VideoCameraIcon,\n IconProps,\n} from '@phosphor-icons/react'\nimport React from 'react'\n\nimport { getDocumentIconType, getSourceType } from './mimeType'\nimport type { AttachmentSourceType } from './mimeType'\n\nexport const MEDIA_TYPE_ICON: Record<AttachmentSourceType, React.ElementType> =\n {\n video: VideoCameraIcon,\n audio: SpeakerHighIcon,\n image: ImageIcon,\n document: FileIcon,\n }\n\nconst DOCUMENT_ICON_COMPONENT = {\n pdf: FilePdfIcon,\n doc: FileDocIcon,\n xls: FileXlsIcon,\n csv: FileCsvIcon,\n ppt: FilePptIcon,\n zip: FileZipIcon,\n text: FileTextIcon,\n markdown: FileMdIcon,\n generic: FileIcon,\n} as const\n\nexport function getTypeIcon(mimeType: string): React.ElementType {\n const sourceType = getSourceType(mimeType)\n if (sourceType !== 'document') return MEDIA_TYPE_ICON[sourceType]\n return DOCUMENT_ICON_COMPONENT[getDocumentIconType(mimeType)]\n}\n\n/** Use instead of `<TypeIcon />` where TypeIcon = getTypeIcon(mime) to satisfy react-hooks/static-components. */\nexport function renderTypeIcon(\n mimeType: string,\n props: IconProps\n): React.ReactElement {\n return React.createElement(getTypeIcon(mimeType), props)\n}\n","import { CircleNotchIcon, PauseIcon, PlayIcon } from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { isDevBuild } from '../../utils/isDevBuild'\n\nimport { renderTypeIcon } from './utils/icons'\nimport { getSourceType } from './utils/mimeType'\n\ntype TouchEventUnion =\n | MouseEvent\n | TouchEvent\n | React.MouseEvent\n | React.TouchEvent\n\n\nconst getClientXFromEvent = (e: TouchEventUnion): number => {\n if ('touches' in e) {\n return e.touches[0]?.clientX ?? e.changedTouches[0]?.clientX ?? 0\n }\n return e.clientX\n}\n\nexport interface MediaPlayerProps {\n source: string\n mimeType: string\n poster?: string\n autoPlay?: boolean\n /** Controlled playing state. When provided, syncs to internal play/pause. */\n playing?: boolean\n loop?: boolean\n controls?: boolean\n showProgress?: boolean\n /** When true, requests muted playback (helps autoplay policies on video). */\n muted?: boolean\n /**\n * When provided, overrides the default click-to-play-toggle behaviour on the\n * player container. The play/pause button (which calls stopPropagation) is\n * unaffected, so inline playback still works.\n */\n onContainerClick?: (e: React.MouseEvent) => void\n}\n\nconst MediaPlayer: React.FC<MediaPlayerProps> = ({\n source,\n mimeType,\n poster,\n autoPlay = false,\n playing: playingProp,\n loop = false,\n controls = true,\n showProgress = false,\n muted = false,\n onContainerClick,\n}) => {\n // --- Derived ---\n const sourceType = getSourceType(mimeType)\n\n // --- Refs ---\n const playerRef = useRef<HTMLMediaElement>(null)\n const trackRef = useRef<HTMLDivElement>(null)\n const rafRef = useRef<number | null>(null)\n const prevPlayingPropRef = useRef(playingProp)\n\n // --- State: playback ---\n const [playing, setPlaying] = useState(autoPlay)\n const [played, setPlayed] = useState(0)\n const [seeking, setSeeking] = useState(false)\n\n // --- State: UI ---\n const [scrubberHovered, setScrubberHovered] = useState(false)\n /** Set when autoplay/play() was rejected so user can start via gesture (no controls UI). */\n const [manualPlayRequired, setManualPlayRequired] = useState(false)\n\n // --- State: loading ---\n const [buffering, setBuffering] = useState(false)\n /** True until the first canPlay fires for the current source — hides controls/spinner behind poster. */\n const [initialLoad, setInitialLoad] = useState(true)\n const [videoAspect, setVideoAspect] = useState<number | null>(null)\n\n // --- Callbacks ---\n const startPlaybackFromGesture = useCallback(() => {\n setManualPlayRequired(false)\n setPlaying(true)\n }, [])\n\n const getFraction = useCallback((e: TouchEventUnion) => {\n const track = trackRef.current\n if (!track) return 0\n const rect = track.getBoundingClientRect()\n return Math.max(\n 0,\n Math.min(1, (getClientXFromEvent(e) - rect.left) / rect.width)\n )\n }, [])\n\n const seekTo = useCallback((fraction: number) => {\n const el = playerRef.current\n if (el && el.duration) el.currentTime = fraction * el.duration\n }, [])\n\n const handleTrackPointerDown = (\n e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>\n ) => {\n e.stopPropagation()\n setSeeking(true)\n const fraction = getFraction(e)\n setPlayed(fraction)\n seekTo(fraction)\n }\n\n // --- Effects ---\n\n // Sync controlled playing prop to internal state\n useEffect(() => {\n if (\n playingProp !== undefined &&\n playingProp !== prevPlayingPropRef.current\n ) {\n prevPlayingPropRef.current = playingProp\n setPlaying(playingProp)\n }\n }, [playingProp])\n\n // RAF-driven progress updates\n useEffect(() => {\n if (!playing) {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = null\n }\n return\n }\n const tick = () => {\n const el = playerRef.current\n if (el && el.duration && !seeking) setPlayed(el.currentTime / el.duration)\n rafRef.current = requestAnimationFrame(tick)\n }\n rafRef.current = requestAnimationFrame(tick)\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n }\n }, [playing, seeking])\n\n // ReactPlayer v3 uses native HTML media elements and does not support a\n // declarative `playing` prop — playback must be driven imperatively.\n useEffect(() => {\n const el = playerRef.current\n if (!el) return\n if (playing) {\n void el.play().catch((err) => {\n setPlaying(false)\n setManualPlayRequired(true)\n if (isDevBuild()) {\n console.debug('[MediaPlayer] play() failed', err)\n }\n })\n } else {\n el.pause()\n }\n }, [playing])\n\n // Global seeking listeners\n useEffect(() => {\n if (!seeking) return\n const onMove = (e: MouseEvent | TouchEvent) => setPlayed(getFraction(e))\n const onUp = (e: MouseEvent | TouchEvent) => {\n setSeeking(false)\n seekTo(getFraction(e))\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n window.addEventListener('touchmove', onMove, { passive: true })\n window.addEventListener('touchend', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n window.removeEventListener('touchmove', onMove)\n window.removeEventListener('touchend', onUp)\n }\n }, [seeking, getFraction, seekTo])\n\n // --- Derived render values ---\n // Use natural aspect ratio once metadata loads, fall back to 16:9 before then.\n const aspectStyle = videoAspect\n ? { aspectRatio: String(videoAspect) }\n : undefined\n const aspectClass = !videoAspect ? ' aspect-video' : ''\n const scrubberPercent = Math.round(played * 100)\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={`relative cursor-pointer overflow-hidden bg-black ${aspectClass}`}\n style={aspectStyle}\n onClick={(e) => {\n if (onContainerClick) { onContainerClick(e); return }\n if (manualPlayRequired) return\n if (controls) setPlaying((p) => !p)\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return\n e.preventDefault()\n if (onContainerClick) { onContainerClick(e as unknown as React.MouseEvent); return }\n if (manualPlayRequired) return\n if (controls) setPlaying((p) => !p)\n }}\n >\n {/* For audio, poster persists as a visual background. For video, hide once loaded. */}\n {poster && (sourceType === 'audio' || initialLoad) && (\n <img\n src={poster}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n )}\n {!poster && (sourceType === 'audio' || initialLoad) && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n <div className=\"absolute inset-0\">\n {sourceType === 'audio' ? (\n <audio\n ref={playerRef as React.RefObject<HTMLAudioElement>}\n src={source}\n loop={loop}\n muted={muted}\n style={{ width: '100%', height: '100%' }}\n onLoadStart={() => setBuffering(true)}\n onCanPlay={() => {\n setBuffering(false)\n setInitialLoad(false)\n }}\n onWaiting={() => setBuffering(true)}\n onPlay={() => setManualPlayRequired(false)}\n onEnded={() => {\n if (!loop) {\n setPlaying(false)\n setPlayed(0)\n }\n }}\n >\n <track kind=\"captions\" />\n </audio>\n ) : (\n <video\n ref={playerRef as React.RefObject<HTMLVideoElement>}\n src={source}\n loop={loop}\n muted={muted}\n playsInline\n style={{ width: '100%', height: '100%' }}\n onLoadStart={() => setBuffering(true)}\n onCanPlay={() => {\n setBuffering(false)\n setInitialLoad(false)\n }}\n onWaiting={() => setBuffering(true)}\n onPlay={() => setManualPlayRequired(false)}\n onLoadedMetadata={() => {\n const el = playerRef.current\n if (\n el instanceof HTMLVideoElement &&\n el.videoWidth &&\n el.videoHeight\n ) {\n setVideoAspect(el.videoWidth / el.videoHeight)\n }\n }}\n onEnded={() => {\n if (!loop) {\n setPlaying(false)\n setPlayed(0)\n }\n }}\n >\n <track kind=\"captions\" />\n </video>\n )}\n </div>\n\n {buffering && !manualPlayRequired && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n <CircleNotchIcon\n className=\"size-8 animate-spin text-white/80\"\n weight=\"bold\"\n />\n </div>\n )}\n\n {manualPlayRequired && !controls && (\n <div\n className=\"absolute inset-0 z-30 flex cursor-pointer items-center justify-center bg-black/35\"\n role=\"button\"\n tabIndex={0}\n aria-label=\"Play preview\"\n onClick={(e) => {\n e.stopPropagation()\n startPlaybackFromGesture()\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return\n e.preventDefault()\n e.stopPropagation()\n startPlaybackFromGesture()\n }}\n >\n <span className=\"flex size-16 items-center justify-center rounded-full bg-white/20 text-white backdrop-blur-sm\">\n <PlayIcon className=\"size-9 translate-x-0.5\" weight=\"fill\" />\n </span>\n </div>\n )}\n\n {showProgress && !controls && (\n <div className=\"absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent\">\n <div\n role=\"slider\"\n aria-label=\"Playback position\"\n aria-valuenow={scrubberPercent}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n ref={trackRef}\n className=\"relative flex h-4 w-full cursor-pointer items-center\"\n onMouseDown={handleTrackPointerDown}\n onTouchStart={handleTrackPointerDown}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') seekTo(Math.min(1, played + 0.05))\n if (e.key === 'ArrowLeft') seekTo(Math.max(0, played - 0.05))\n }}\n >\n <div className=\"w-full overflow-hidden rounded-full bg-white/30 h-1\">\n <div\n className=\"h-full rounded-full bg-white\"\n style={{ width: `${scrubberPercent}%` }}\n />\n </div>\n </div>\n </div>\n )}\n\n {controls && (\n <div className=\"absolute inset-x-0 bottom-0 flex items-center gap-2 bg-gradient-to-t from-black/60 to-transparent px-3 pb-2.5 pt-6 transition-all duration-200\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n setPlaying((p) => !p)\n }}\n className=\"shrink-0 text-white\"\n aria-label={playing ? 'Pause' : 'Play'}\n >\n {playing ? (\n <PauseIcon className=\"size-5\" weight=\"fill\" />\n ) : (\n <PlayIcon className=\"size-5 translate-x-px\" weight=\"fill\" />\n )}\n </button>\n\n <div\n role=\"slider\"\n aria-label=\"Playback position\"\n aria-valuenow={scrubberPercent}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n ref={trackRef}\n className=\"relative flex h-4 w-full cursor-pointer items-center\"\n onMouseDown={handleTrackPointerDown}\n onTouchStart={handleTrackPointerDown}\n onClick={(e) => e.stopPropagation()}\n onMouseEnter={() => setScrubberHovered(true)}\n onMouseLeave={() => setScrubberHovered(false)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') seekTo(Math.min(1, played + 0.05))\n if (e.key === 'ArrowLeft') seekTo(Math.max(0, played - 0.05))\n }}\n >\n <div\n className={`w-full overflow-hidden rounded-full bg-white/30 transition-all duration-200 ${scrubberHovered || seeking ? 'h-1.5' : 'h-1'}`}\n >\n <div\n className=\"h-full rounded-full bg-white\"\n style={{ width: `${scrubberPercent}%` }}\n />\n </div>\n <div\n className={`absolute size-3 -translate-x-1/2 rounded-full bg-white shadow transition-[opacity,transform] duration-200 ${scrubberHovered || seeking ? 'scale-100 opacity-100' : 'scale-0 opacity-0'}`}\n style={{ left: `${scrubberPercent}%` }}\n />\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default MediaPlayer\n","import React, { useState } from 'react'\n\nimport MediaPlayer, { type MediaPlayerProps } from './MediaPlayer'\nimport { renderTypeIcon } from './utils/icons'\nimport { getSourceType } from './utils/mimeType'\n\nexport type AttachmentThumbnailVariant = 'light' | 'dark'\n\nexport interface AttachmentThumbnailProps {\n mimeType: string\n sourceUrl?: string\n thumbnailUrl?: string\n title?: string\n variant: AttachmentThumbnailVariant\n /** Extra props passed to MediaPlayer when source is video or audio. */\n mediaPlayerProps?: Partial<\n Pick<\n MediaPlayerProps,\n 'autoPlay' | 'loop' | 'muted' | 'controls' | 'onContainerClick'\n >\n >\n /**\n * When true (Visitor unlocked image/document), use aspect-video + object-contain fade-in.\n */\n containedImage?: boolean\n}\n\nconst placeholderIconClass = (variant: AttachmentThumbnailVariant) =>\n variant === 'dark' ? 'size-12 text-white/20' : 'size-12 text-black/20'\n\nconst posterShellClass = (variant: AttachmentThumbnailVariant) =>\n variant === 'dark'\n ? 'aspect-video overflow-hidden bg-white/10'\n : 'aspect-video overflow-hidden bg-black/5'\n\n/**\n * Renders the media preview area for attachment cards (LockedAttachment, MediaMessage).\n * Overlays (dim, lock, eye toggle) are composed by the parent.\n */\nconst AttachmentThumbnail: React.FC<AttachmentThumbnailProps> = ({\n mimeType,\n sourceUrl,\n thumbnailUrl,\n title,\n variant,\n mediaPlayerProps,\n containedImage = false,\n}) => {\n const sourceType = getSourceType(mimeType)\n const [sourceReady, setSourceReady] = useState(false)\n\n if (sourceUrl && (sourceType === 'video' || sourceType === 'audio')) {\n return (\n <MediaPlayer\n source={sourceUrl}\n mimeType={mimeType}\n poster={thumbnailUrl}\n controls\n {...mediaPlayerProps}\n />\n )\n }\n\n if (sourceUrl && sourceType === 'image') {\n if (containedImage) {\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n <img\n src={sourceUrl}\n alt={title ?? ''}\n className={`absolute inset-0 h-full w-full object-contain transition-opacity duration-300 ${sourceReady ? 'opacity-100' : 'opacity-0'}`}\n draggable={false}\n onLoad={() => setSourceReady(true)}\n />\n </div>\n )\n }\n return (\n <img\n src={sourceUrl}\n alt={title ?? ''}\n className=\"block w-full\"\n draggable={false}\n />\n )\n }\n\n if (sourceUrl && sourceType === 'document') {\n if (thumbnailUrl) {\n if (containedImage) {\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n <img\n src={thumbnailUrl}\n alt={title ?? ''}\n className={`absolute inset-0 h-full w-full object-contain transition-opacity duration-300 ${sourceReady ? 'opacity-100' : 'opacity-0'}`}\n draggable={false}\n onLoad={() => setSourceReady(true)}\n />\n </div>\n )\n }\n return (\n <img\n src={thumbnailUrl}\n alt=\"\"\n className=\"block w-full\"\n draggable={false}\n />\n )\n }\n return (\n <div\n className={`flex aspect-video w-full items-center justify-center ${variant === 'dark' ? 'bg-white/10' : 'bg-black/5'}`}\n >\n {renderTypeIcon(mimeType, {\n className: placeholderIconClass(variant),\n weight: 'regular',\n })}\n </div>\n )\n }\n\n // Poster-only or empty (no sourceUrl)\n if (thumbnailUrl) {\n return (\n <div className={`relative ${posterShellClass(variant)}`}>\n <img\n src={thumbnailUrl}\n alt={title ?? ''}\n draggable={false}\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n </div>\n )\n }\n\n return (\n <div\n className={`flex aspect-video w-full items-center justify-center ${variant === 'dark' ? 'bg-white/10' : 'bg-black/5'}`}\n >\n {renderTypeIcon(mimeType, {\n className: placeholderIconClass(variant),\n weight: 'regular',\n })}\n </div>\n )\n}\n\nexport default AttachmentThumbnail\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport { renderTypeIcon } from './utils/icons'\n\nexport { default as AttachmentThumbnail } from './Thumbnail'\nexport type {\n AttachmentThumbnailProps,\n AttachmentThumbnailVariant,\n} from './Thumbnail'\nexport { default as MediaPlayer } from './MediaPlayer'\nexport type { MediaPlayerProps } from './MediaPlayer'\nexport { renderTypeIcon, getTypeIcon, MEDIA_TYPE_ICON } from './utils/icons'\nexport {\n getSourceType,\n getDocumentIconType,\n type AttachmentSourceType,\n type DocumentIconType,\n} from './utils/mimeType'\n\nexport interface AttachmentCardProps {\n variant: 'light' | 'dark'\n thumbnail: React.ReactNode\n title?: string\n placeholderTitle?: string\n mimeType: string\n detail?: string\n statusBadge?: React.ReactNode\n action?: React.ReactNode\n topLeft?: React.ReactNode\n topRight?: React.ReactNode\n rootRef?: React.Ref<HTMLDivElement>\n 'data-testid'?: string\n}\n\nconst AttachmentCard: React.FC<AttachmentCardProps> = ({\n variant,\n thumbnail,\n title,\n placeholderTitle = 'Attachment title',\n mimeType,\n detail,\n statusBadge,\n action,\n topLeft,\n topRight,\n rootRef,\n 'data-testid': dataTestId,\n}) => {\n const isDark = variant === 'dark'\n const displayTitle = isDark ? (title ?? placeholderTitle) : (title ?? '')\n const titleDimmed = isDark && !title\n\n return (\n <div\n ref={rootRef}\n data-testid={dataTestId}\n className={classNames(\n 'relative w-[280px] select-none overflow-hidden rounded-[24px] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]',\n isDark ? 'bg-[#121110]' : 'bg-white'\n )}\n >\n {topLeft ? (\n <div className=\"pointer-events-auto absolute left-3 top-3 z-50\">{topLeft}</div>\n ) : null}\n {topRight ? (\n <div className=\"pointer-events-auto absolute right-3 top-3 z-50\">{topRight}</div>\n ) : null}\n\n {thumbnail}\n\n <div className=\"px-4 pb-3 pt-3\">\n {displayTitle.trim() !== '' && (\n <p\n className={classNames('mb-0.5 truncate text-base font-medium', {\n 'text-black': !isDark,\n 'text-white/30': isDark && titleDimmed,\n 'text-white': isDark && !titleDimmed,\n })}\n >\n {displayTitle}\n </p>\n )}\n\n <div className=\"flex flex-wrap items-center gap-1\">\n {renderTypeIcon(mimeType, {\n className: classNames(\n 'size-5 shrink-0',\n isDark ? 'text-white/55' : 'text-black/55'\n ),\n weight: 'regular',\n })}\n\n {detail != null && detail !== '' && (\n <span\n className={classNames(\n 'text-xs font-medium',\n isDark ? 'text-white/55' : 'text-black/55'\n )}\n >\n {detail}\n </span>\n )}\n\n {statusBadge}\n </div>\n\n {action}\n </div>\n </div>\n )\n}\n\nexport default AttachmentCard\n","import { CircleNotchIcon, DownloadSimpleIcon, LinkIcon } from '@phosphor-icons/react'\nimport React, { useState } from 'react'\nimport type { Attachment, LocalMessage } from 'stream-chat'\n\nimport AttachmentCard, {\n AttachmentThumbnail,\n getSourceType,\n} from '../AttachmentCard'\nimport { Avatar } from '../Avatar'\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction linkCardShellClass(isMyMessage: boolean) {\n const bg = isMyMessage ? 'bg-[#121110]' : 'bg-[#F3F3F1]'\n return `w-[280px] select-none overflow-hidden rounded-[24px] ${bg} shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]`\n}\n\nfunction linkThumbnailBg(isMyMessage: boolean) {\n return isMyMessage ? 'bg-white/10' : 'bg-black/5'\n}\n\nfunction linkPrimaryText(isMyMessage: boolean) {\n return isMyMessage ? 'text-white' : 'text-black'\n}\n\nfunction linkSecondaryText(isMyMessage: boolean) {\n return isMyMessage ? 'text-white/55' : 'text-black/55'\n}\n\nfunction linkTertiaryText(isMyMessage: boolean) {\n return isMyMessage ? 'text-white/40' : 'text-black/40'\n}\n\nfunction linkIconColor(isMyMessage: boolean) {\n return isMyMessage ? 'text-white/20' : 'text-black/20'\n}\n\n/** Link preview (OG) — no download; opens in a new tab. */\nconst LinkCard: React.FC<{\n attachment: Attachment\n isMyMessage: boolean\n}> = ({ attachment, isMyMessage }) => {\n const { title, text, image_url, og_scrape_url, title_link } = attachment\n const rawUrl = og_scrape_url ?? title_link\n const url =\n typeof rawUrl === 'string' && rawUrl.trim() !== '' ? rawUrl : undefined\n\n const body = (\n <React.Fragment>\n <div className=\"p-2\">\n {image_url ? (\n <img\n src={image_url}\n alt={title ?? ''}\n className=\"aspect-video w-full rounded-[20px] object-cover\"\n />\n ) : (\n <div\n className={`aspect-video w-full rounded-[20px] ${linkThumbnailBg(isMyMessage)} flex items-center justify-center`}\n >\n <LinkIcon className={`size-12 ${linkIconColor(isMyMessage)}`} />\n </div>\n )}\n </div>\n <div className=\"px-3 pb-3\">\n {title && (\n <p className={`truncate text-[14px] font-medium leading-5 ${linkPrimaryText(isMyMessage)}`}>\n {title}\n </p>\n )}\n {text && (\n <p className={`truncate text-[12px] leading-4 ${linkSecondaryText(isMyMessage)}`}>{text}</p>\n )}\n {url && (\n <p className={`mt-1 truncate text-[12px] leading-4 ${linkTertiaryText(isMyMessage)}`}>\n {url}\n </p>\n )}\n </div>\n </React.Fragment>\n )\n\n if (url) {\n return (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"block no-underline\">\n {body}\n </a>\n )\n }\n\n return <div className=\"block\">{body}</div>\n}\n\nexport function isLinkAttachment(a: Attachment): boolean {\n return a.type === 'link' || (!!a.og_scrape_url && !a.asset_url)\n}\n\nexport function resolveLinkAttachment(\n message: LocalMessage\n): Attachment | undefined {\n return message.attachments?.find(isLinkAttachment)\n}\n\nasync function triggerDownload(url: string, filename?: string): Promise<void> {\n let name: string\n try { name = filename ?? new URL(url).pathname.split('/').pop() ?? 'download' }\n catch { name = filename ?? 'download' }\n const res = await fetch(url, { mode: 'cors' })\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n const blob = await res.blob()\n const objectUrl = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = objectUrl\n a.download = name\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(objectUrl)\n}\n\nconst DownloadAction: React.FC<{ url: string; filename?: string }> = ({\n url,\n filename,\n}) => {\n const [busy, setBusy] = useState(false)\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n const fallback = window.open('', '_blank', 'noopener,noreferrer')\n setBusy(true)\n triggerDownload(url, filename)\n .then(() => { fallback?.close() })\n .catch(() => { if (fallback) fallback.location.href = url })\n .finally(() => setBusy(false))\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={busy}\n className=\"mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none text-white hover:bg-[#2a2928] disabled:opacity-70\"\n >\n {busy ? (\n <CircleNotchIcon className=\"size-4 animate-spin text-white\" weight=\"bold\" />\n ) : (\n <React.Fragment>\n <DownloadSimpleIcon className=\"size-4 text-white\" weight=\"bold\" />\n Download\n </React.Fragment>\n )}\n </button>\n )\n}\n\nexport interface MediaMessageResolved {\n resolvedUrl: string\n resolvedType: string\n title?: string\n fileSize?: number\n thumbnailUrl?: string\n}\n\nexport function resolveMediaFromMessage(\n message: LocalMessage\n): MediaMessageResolved | null {\n const videoAttachment = message.attachments?.find(\n (a) => a.type === 'video' && a.asset_url\n )\n const imageAttachment = message.attachments?.find(\n (a) => a.type === 'image' && (a as { image_url?: string }).image_url\n )\n const audioAttachment = message.attachments?.find(\n (a) => a.type === 'audio' && a.asset_url\n )\n const fileAttachment = message.attachments?.find(\n (a) => a.type === 'file' && a.asset_url\n )\n\n const activeAttachment =\n videoAttachment ?? imageAttachment ?? audioAttachment ?? fileAttachment\n\n const resolvedUrl =\n videoAttachment?.asset_url ??\n (imageAttachment as { image_url?: string } | undefined)?.image_url ??\n audioAttachment?.asset_url ??\n fileAttachment?.asset_url\n\n if (!resolvedUrl) return null\n\n const resolvedType =\n activeAttachment?.mime_type ??\n (activeAttachment?.type === 'image'\n ? 'image/jpeg'\n : activeAttachment?.type === 'video'\n ? 'video/mp4'\n : activeAttachment?.type === 'audio'\n ? 'audio/mpeg'\n : 'application/octet-stream')\n\n const title = (activeAttachment as { title?: string } | undefined)?.title\n const fileSize = (activeAttachment as { file_size?: number } | undefined)?.file_size\n const thumbnailUrl = (videoAttachment as { thumb_url?: string } | undefined)?.thumb_url\n\n return {\n resolvedUrl,\n resolvedType,\n title,\n fileSize,\n thumbnailUrl,\n }\n}\n\n/** Dark card (sent / own message) — matches LockedAttachment.Sent preview without toggle. */\nconst Creator: React.FC<MediaMessageResolved> = ({\n resolvedUrl,\n resolvedType,\n title,\n fileSize,\n thumbnailUrl,\n}) => {\n const detail = fileSize !== undefined ? formatBytes(fileSize) : undefined\n\n return (\n <AttachmentCard\n variant=\"dark\"\n title={title}\n placeholderTitle=\"\"\n mimeType={resolvedType}\n detail={detail}\n thumbnail={\n <AttachmentThumbnail\n mimeType={resolvedType}\n sourceUrl={resolvedUrl}\n thumbnailUrl={thumbnailUrl}\n title={title}\n variant=\"dark\"\n />\n }\n />\n )\n}\n\n/** Light card (received) — matches LockedAttachment.Received unlocked without Purchased copy. */\nconst Visitor: React.FC<MediaMessageResolved> = ({\n resolvedUrl,\n resolvedType,\n title,\n fileSize,\n thumbnailUrl,\n}) => {\n const sourceType = getSourceType(resolvedType)\n const detail = fileSize !== undefined ? formatBytes(fileSize) : undefined\n\n return (\n <AttachmentCard\n variant=\"light\"\n title={title}\n mimeType={resolvedType}\n detail={detail}\n thumbnail={\n <AttachmentThumbnail\n mimeType={resolvedType}\n sourceUrl={resolvedUrl}\n thumbnailUrl={thumbnailUrl}\n title={title}\n variant=\"light\"\n containedImage={sourceType === 'image' || sourceType === 'document'}\n />\n }\n action={<DownloadAction url={resolvedUrl} filename={title} />}\n />\n )\n}\n\nexport interface MediaMessageProps {\n message: LocalMessage\n isMyMessage?: boolean\n}\n\n/**\n * @deprecated Slated for removal once the profile repo is migrated to\n * `LinkAttachment` (and its forthcoming media-only Attachment variants).\n * New consumers should reach for `LinkAttachment.Composer`,\n * `LinkAttachment.Sent`, or `LinkAttachment.Received` instead.\n */\nconst MediaMessageRoot: React.FC<MediaMessageProps> = ({\n message,\n isMyMessage = false,\n}) => {\n const linkAttachment = resolveLinkAttachment(message)\n const resolved = resolveMediaFromMessage(message)\n if (!linkAttachment && !resolved) return null\n\n const messageClass = isMyMessage\n ? 'str-chat__message str-chat__message-simple str-chat__message--me str-chat__message-simple--me'\n : 'str-chat__message str-chat__message-simple str-chat__message--other'\n\n return (\n <div className={messageClass}>\n {!isMyMessage && message.user && (\n <Avatar\n className=\"str-chat__avatar str-chat__message-sender-avatar\"\n id={message.user.id}\n image={message.user.image}\n name={message.user.name ?? message.user.id}\n />\n )}\n <div\n className=\"str-chat__message-inner\"\n style={{ marginInlineEnd: 0, marginInlineStart: 0 }}\n >\n <div className=\"str-chat__message-bubble-wrapper\">\n <div\n className=\"str-chat__message-bubble\"\n style={{ padding: 0, borderRadius: 0, overflow: 'visible', background: 'transparent' }}\n >\n {linkAttachment ? (\n <div className={linkCardShellClass(isMyMessage)}>\n <LinkCard attachment={linkAttachment} isMyMessage={isMyMessage} />\n </div>\n ) : isMyMessage ? (\n <Creator {...resolved!} />\n ) : (\n <Visitor {...resolved!} />\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nconst MediaMessageCreatorEntry: React.FC<{ message: LocalMessage }> = ({\n message,\n}) => {\n const linkAttachment = resolveLinkAttachment(message)\n if (linkAttachment) {\n return (\n <div className={linkCardShellClass(true)}>\n <LinkCard attachment={linkAttachment} isMyMessage={true} />\n </div>\n )\n }\n const resolved = resolveMediaFromMessage(message)\n if (!resolved) return null\n return <Creator {...resolved} />\n}\n\nconst MediaMessageVisitorEntry: React.FC<{ message: LocalMessage }> = ({\n message,\n}) => {\n const linkAttachment = resolveLinkAttachment(message)\n if (linkAttachment) {\n return (\n <div className={linkCardShellClass(false)}>\n <LinkCard attachment={linkAttachment} isMyMessage={false} />\n </div>\n )\n }\n const resolved = resolveMediaFromMessage(message)\n if (!resolved) return null\n return <Visitor {...resolved} />\n}\n\nexport const MediaMessage = Object.assign(MediaMessageRoot, {\n Creator: MediaMessageCreatorEntry,\n Visitor: MediaMessageVisitorEntry,\n})\n","import type { Channel, LocalMessage } from 'stream-chat'\n\nimport type { PaymentStatus } from '../../stream-custom-data'\n\nexport interface LockedAttachmentBaseProps {\n title?: string\n mimeType?: string\n thumbnailUrl?: string\n detail?: string\n amountText?: string\n paymentStatus?: PaymentStatus\n /**\n * When provided with 2+ items, the card renders as a mixed-media carousel\n * (e.g. a couple of photos + a video) instead of a single thumbnail. Each\n * item brings its own thumbnail and optional source so that\n * `LockedAttachment.Composer` / `.Sent` / `.Received` can all share the\n * same carousel chrome.\n */\n gallery?: LockedAttachmentGalleryItem[]\n}\n\nexport interface LockedAttachmentGalleryItem {\n /** MIME type of this carousel item — drives the per-item play / lock affordance. */\n mimeType: string\n /** Poster image used for both the locked (blurred) and unlocked preview state. */\n thumbnailUrl?: string\n /** Underlying source (image or video URL) — shown only when unlocked. */\n sourceUrl?: string\n}\n\nexport interface LockedAttachmentSource {\n /** Proxied URL used by the media player for in-app playback. */\n sourceUrl: string\n /** URL opened when the visitor clicks Download — may be a file or a web destination. */\n redeemUrl?: string\n /** Thumbnail URL from the fetched asset — overrides the metadata thumbnail when present. */\n thumbnailUrl?: string\n}\n\nexport type { PaymentStatus }\n\nexport interface LockedAttachmentContextValue {\n isUnlocking: (id: string) => boolean\n onUnlockClick?: (message: LocalMessage, channel: Channel) => void\n onDownloadClick?: (message: LocalMessage, channel: Channel) => void\n onFetchSource?: (message: LocalMessage, channel: Channel) => Promise<LockedAttachmentSource | void>\n}\n\nexport const defaultLockedAttachmentContextValue: LockedAttachmentContextValue = {\n isUnlocking: () => false,\n}\n","import { createContext, useContext } from 'react'\n\nimport { defaultLockedAttachmentContextValue, type LockedAttachmentContextValue } from '../LockedAttachment/types'\n\nexport interface CustomMessageRegistry {\n LockedAttachment: LockedAttachmentContextValue\n}\n\nconst customMessageDefaults: CustomMessageRegistry = {\n LockedAttachment: defaultLockedAttachmentContextValue,\n}\n\nconst CustomMessageContext = createContext<Partial<CustomMessageRegistry>>({})\n\nexport const CustomMessageProvider = CustomMessageContext.Provider\n\nexport function useCustomMessage<K extends keyof CustomMessageRegistry>(key: K): CustomMessageRegistry[K] {\n const ctx = useContext(CustomMessageContext)\n return (ctx[key] ?? customMessageDefaults[key]) as CustomMessageRegistry[K]\n}\n","import { ThumbsUpIcon, ThumbsDownIcon } from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React from 'react'\n\nimport type { VoteSelection } from '../../hooks/useMessageVote'\n\ninterface MessageVoteButtonsProps {\n selected: VoteSelection\n onVoteUp: () => void\n onVoteDown: () => void\n}\n\nexport const MessageVoteButtons: React.FC<MessageVoteButtonsProps> = ({\n selected,\n onVoteUp,\n onVoteDown,\n}) => (\n <div className=\"message-vote-buttons\">\n <button\n type=\"button\"\n className={classNames('message-vote-button focus-ring', {\n 'message-vote-button--selected': selected === 'up',\n })}\n onClick={onVoteUp}\n aria-label=\"Good response\"\n aria-pressed={selected === 'up'}\n data-tooltip=\"Good response\"\n >\n <ThumbsUpIcon size={16} weight={selected === 'up' ? 'fill' : 'regular'} />\n </button>\n <button\n type=\"button\"\n className={classNames('message-vote-button focus-ring', {\n 'message-vote-button--selected': selected === 'down',\n })}\n onClick={onVoteDown}\n aria-label=\"Bad response\"\n aria-pressed={selected === 'down'}\n data-tooltip=\"Bad response\"\n >\n <ThumbsDownIcon size={16} weight={selected === 'down' ? 'fill' : 'regular'} />\n </button>\n </div>\n)\n","import classNames from 'classnames'\nimport React, { useMemo, useState } from 'react'\nimport {\n Attachment as DefaultAttachment,\n EditMessageModal as DefaultEditMessageModal,\n MessageBounceModal,\n MessageBouncePrompt as DefaultMessageBouncePrompt,\n MessageBlocked as DefaultMessageBlocked,\n MessageDeleted as DefaultMessageDeleted,\n MessageErrorIcon,\n MessageIsThreadReplyInChannelButtonIndicator as DefaultMessageIsThreadReplyInChannelButtonIndicator,\n MessageRepliesCountButton as DefaultMessageRepliesCountButton,\n MessageText,\n Poll,\n ReminderNotification as DefaultReminderNotification,\n StreamedMessageText as DefaultStreamedMessageText,\n areMessageUIPropsEqual,\n isDateSeparatorMessage,\n isMessageBlocked,\n isMessageBounced,\n messageHasAttachments,\n messageHasReactions,\n useChannelStateContext,\n useComponentContext,\n useChatContext,\n useMessageContext,\n useMessageReminder,\n type MessageContextValue,\n type MessageUIComponentProps,\n} from 'stream-chat-react'\n\nimport { useMessageVote } from '../../hooks/useMessageVote'\nimport { getMessageDisplayText } from '../../utils/getMessageDisplayText'\nimport { Avatar } from '../Avatar'\nimport LockedAttachment from '../LockedAttachment'\nimport { isLinkAttachment } from '../MediaMessage'\n\nimport { useCustomMessage } from './context'\nimport {\n MessageTag,\n isAttachmentMessage,\n isChatbotMessage,\n isTipOnlyMessage,\n} from './MessageTag'\nimport { MessageVoteButtons } from './MessageVoteButtons'\n\ntype CustomMessageUIComponentProps = MessageUIComponentProps & {\n chatbotVotingEnabled?: boolean\n viewerLanguage?: string\n}\n\ntype CustomMessageWithContextProps = MessageContextValue & {\n chatbotVotingEnabled?: boolean\n viewerLanguage?: string\n}\n\nconst CustomMessageWithContext = (props: CustomMessageWithContextProps) => {\n const {\n additionalMessageInputProps,\n chatbotVotingEnabled,\n editing,\n endOfGroup,\n firstOfGroup,\n groupedByUser,\n handleAction,\n handleOpenThread,\n handleRetry,\n highlighted,\n isMessageAIGenerated,\n isMyMessage,\n message,\n renderText,\n threadList,\n viewerLanguage,\n } = props\n\n const { client } = useChatContext('CustomMessage')\n const { channel } = useChannelStateContext('CustomMessage')\n const { isUnlocking, onUnlockClick, onFetchSource, onDownloadClick } =\n useCustomMessage('LockedAttachment')\n const [isBounceDialogOpen, setIsBounceDialogOpen] = useState(false)\n const reminder = useMessageReminder(message.id)\n const { selected: voteState, voteUp, voteDown } = useMessageVote(message)\n\n const {\n Attachment = DefaultAttachment,\n EditMessageModal = DefaultEditMessageModal,\n MessageActions,\n MessageBlocked = DefaultMessageBlocked,\n MessageBouncePrompt = DefaultMessageBouncePrompt,\n MessageDeleted = DefaultMessageDeleted,\n MessageIsThreadReplyInChannelButtonIndicator = DefaultMessageIsThreadReplyInChannelButtonIndicator,\n MessageRepliesCountButton = DefaultMessageRepliesCountButton,\n ReminderNotification = DefaultReminderNotification,\n StreamedMessageText = DefaultStreamedMessageText,\n PinIndicator,\n } = useComponentContext('CustomMessage')\n\n const hasAttachment = messageHasAttachments(message)\n const hasReactions = messageHasReactions(message)\n const isAIGenerated = useMemo(\n () => isMessageAIGenerated?.(message),\n [isMessageAIGenerated, message]\n )\n const finalAttachments = useMemo(() => {\n const attachments = message.attachments ?? []\n const raw = message.shared_location\n ? [message.shared_location, ...attachments]\n : attachments\n\n if (!isChatbotMessage(message)) return raw\n\n const filtered = raw.filter((a) => !('type' in a) || !isLinkAttachment(a))\n return filtered.length === raw.length ? raw : filtered\n }, [message])\n const displayMessage = useMemo(() => {\n const displayText = getMessageDisplayText({ message, viewerLanguage })\n return displayText === message.text\n ? message\n : { ...message, text: displayText }\n }, [message, viewerLanguage])\n\n if (isDateSeparatorMessage(message)) {\n return null\n }\n\n if (message.deleted_at || message.type === 'deleted') {\n return <MessageDeleted message={message} />\n }\n\n if (isMessageBlocked(message)) {\n return <MessageBlocked />\n }\n\n const showReplyCountButton = !threadList && !!message.reply_count\n const showIsReplyInChannel =\n !threadList && message.show_in_channel && message.parent_id\n const allowRetry =\n message.status === 'failed' && message.error?.status !== 403\n const isBounced = isMessageBounced(message)\n let handleClick: (() => void) | undefined = undefined\n\n if (allowRetry) {\n handleClick = () => handleRetry(message)\n } else if (isBounced) {\n handleClick = () => setIsBounceDialogOpen(true)\n }\n\n const isMine = isMyMessage()\n const rootClassName = classNames(\n 'str-chat__message str-chat__message-simple',\n `str-chat__message--${message.type}`,\n `str-chat__message--${message.status}`,\n isMine\n ? 'str-chat__message--me str-chat__message-simple--me'\n : 'str-chat__message--other',\n message.text ? 'str-chat__message--has-text' : 'has-no-text',\n {\n 'str-chat__message--has-attachment': hasAttachment,\n 'str-chat__message--highlighted': highlighted,\n 'str-chat__message--pinned pinned-message': message.pinned,\n 'str-chat__message--with-reactions': hasReactions,\n 'str-chat__message-send-can-be-retried':\n message?.status === 'failed' && message?.error?.status !== 403,\n 'str-chat__message-with-thread-link':\n showReplyCountButton || showIsReplyInChannel,\n 'str-chat__virtual-message__wrapper--end': endOfGroup,\n 'str-chat__virtual-message__wrapper--first': firstOfGroup,\n 'str-chat__virtual-message__wrapper--group': groupedByUser,\n }\n )\n\n const poll = message.poll_id && client.polls.fromState(message.poll_id)\n const isTipOnly = isTipOnlyMessage(message)\n const isChatbot = isChatbotMessage(message)\n const isAttachment = isAttachmentMessage(message)\n const hasRenderableAttachments = !!(\n finalAttachments?.length && !message.quoted_message\n )\n const useAttachmentFooterChatbotTag =\n isChatbot && isMine && hasRenderableAttachments\n\n return (\n <>\n {editing && (\n <EditMessageModal\n additionalMessageInputProps={additionalMessageInputProps}\n />\n )}\n {isBounceDialogOpen && (\n <MessageBounceModal\n MessageBouncePrompt={MessageBouncePrompt}\n onClose={() => setIsBounceDialogOpen(false)}\n open={isBounceDialogOpen}\n />\n )}\n <div className={rootClassName} key={message.id}>\n {PinIndicator && <PinIndicator />}\n {!!reminder && <ReminderNotification reminder={reminder} />}\n {message.user && (\n <Avatar\n className=\"str-chat__avatar str-chat__message-sender-avatar\"\n id={message.user.id}\n image={message.user.image}\n name={message.user.name || message.user.id}\n size={isChatbot ? 24 : 28}\n shape=\"circle\"\n dmAgentEnabled={isChatbot}\n />\n )}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n className={classNames('str-chat__message-inner', {\n 'str-chat__simple-message--error-failed': allowRetry || isBounced,\n })}\n data-testid=\"message-inner\"\n onClick={handleClick}\n onKeyDown={handleClick}\n role={handleClick ? 'button' : undefined}\n tabIndex={handleClick ? 0 : undefined}\n style={{\n // Force margins to 0 to prevent hover layout shift\n // Stream Chat CSS sets margin-inline-end/start to 78px, then 0 on hover\n marginInlineEnd: 0,\n marginInlineStart: 0,\n }}\n >\n {isAttachment ? (\n <div className=\"str-chat__message-bubble-wrapper\">\n {isMine ? (\n <LockedAttachment.Sent\n title={message.metadata?.attachment_title}\n mimeType={message.metadata?.attachment_mime_type}\n thumbnailUrl={message.metadata?.attachment_thumbnail}\n amountText={message.metadata?.amount_text}\n detail={message.metadata?.attachment_detail}\n paymentStatus={message.metadata?.payment_status}\n onPreviewClick={() => onUnlockClick?.(message, channel)}\n onFetchSource={async () =>\n await onFetchSource?.(message, channel)\n }\n />\n ) : (\n <LockedAttachment.Received\n title={message.metadata?.attachment_title}\n mimeType={message.metadata?.attachment_mime_type}\n thumbnailUrl={message.metadata?.attachment_thumbnail}\n amountText={message.metadata?.amount_text}\n detail={message.metadata?.attachment_detail}\n paymentStatus={message.metadata?.payment_status}\n isUnlocking={isUnlocking(message.id)}\n onUnlockClick={() => onUnlockClick?.(message, channel)}\n onFetchSource={async () =>\n await onFetchSource?.(message, channel)\n }\n onDownloadClick={() => onDownloadClick?.(message, channel)}\n />\n )}\n {message.text && (\n <div className=\"str-chat__message-bubble\">\n <MessageText\n message={displayMessage}\n renderText={renderText}\n />\n </div>\n )}\n </div>\n ) : isTipOnly ? (\n /* Tip-only messages render as a standalone bubble */\n <MessageTag message={message} standalone />\n ) : (\n <div className=\"str-chat__message-bubble-wrapper\">\n <div className=\"str-chat__message-bubble\">\n {isChatbot && !useAttachmentFooterChatbotTag && (\n <MessageTag\n message={message}\n hasAttachment={hasRenderableAttachments}\n isMyMessage={isMine}\n />\n )}\n {poll && <Poll poll={poll} />}\n {finalAttachments?.length && !message.quoted_message ? (\n <Attachment\n actionHandler={handleAction}\n attachments={finalAttachments}\n />\n ) : null}\n {isAIGenerated ? (\n <StreamedMessageText\n message={displayMessage}\n renderText={renderText}\n />\n ) : (\n <MessageText\n message={displayMessage}\n renderText={renderText}\n />\n )}\n <MessageErrorIcon />\n </div>\n </div>\n )}\n {MessageActions && <MessageActions />}\n </div>\n {!isAttachment && !isTipOnly && (\n <div className=\"str-chat__message-footer\">\n {(!isChatbot || useAttachmentFooterChatbotTag) && (\n <MessageTag\n message={message}\n hasAttachment={hasRenderableAttachments}\n isMyMessage={isMine}\n />\n )}\n {chatbotVotingEnabled && isChatbot && (\n <MessageVoteButtons\n selected={voteState}\n onVoteUp={voteUp}\n onVoteDown={voteDown}\n />\n )}\n </div>\n )}\n {showReplyCountButton && (\n <MessageRepliesCountButton\n onClick={handleOpenThread}\n reply_count={message.reply_count}\n />\n )}\n {showIsReplyInChannel && (\n <MessageIsThreadReplyInChannelButtonIndicator />\n )}\n </div>\n </>\n )\n}\n\nconst MemoizedCustomMessage = React.memo(\n CustomMessageWithContext,\n (prev, next) => {\n if (prev.chatbotVotingEnabled !== next.chatbotVotingEnabled) return false\n if (prev.viewerLanguage !== next.viewerLanguage) return false\n return areMessageUIPropsEqual(prev, next)\n }\n) as typeof CustomMessageWithContext\n\nexport const CustomMessage = (props: CustomMessageUIComponentProps) => {\n const messageContext = useMessageContext('CustomMessage')\n return <MemoizedCustomMessage {...messageContext} {...props} />\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import React, { useContext } from 'react';\nexport const ChannelStateContext = React.createContext(undefined);\nexport const ChannelStateProvider = ({ children, value, }) => (React.createElement(ChannelStateContext.Provider, { value: value }, children));\nexport const useChannelStateContext = (componentName) => {\n const contextValue = useContext(ChannelStateContext);\n if (!contextValue) {\n console.warn(`The useChannelStateContext hook was called outside of the ChannelStateContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`);\n return {};\n }\n return contextValue;\n};\n/**\n * Typescript currently does not support partial inference, so if ChannelStateContext\n * typing is desired while using the HOC withChannelStateContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChannelStateContext = (Component) => {\n const WithChannelStateContextComponent = (props) => {\n const channelStateContext = useChannelStateContext();\n return React.createElement(Component, { ...props, ...channelStateContext });\n };\n WithChannelStateContextComponent.displayName = (Component.displayName ||\n Component.name ||\n 'Component').replace('Base', '');\n return WithChannelStateContextComponent;\n};\n","import React, { useContext } from 'react';\nimport { getDisplayName } from './utils/getDisplayName';\nexport const ChatContext = React.createContext(undefined);\nexport const ChatProvider = ({ children, value, }) => (React.createElement(ChatContext.Provider, { value: value }, children));\nexport const useChatContext = (componentName) => {\n const contextValue = useContext(ChatContext);\n if (!contextValue) {\n console.warn(`The useChatContext hook was called outside of the ChatContext provider. Make sure this hook is called within a child of the Chat component. The errored call is located in the ${componentName} component.`);\n return {};\n }\n return contextValue;\n};\n/**\n * Typescript currently does not support partial inference so if ChatContext\n * typing is desired while using the HOC withChatContext the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChatContext = (Component) => {\n const WithChatContextComponent = (props) => {\n const chatContext = useChatContext();\n return React.createElement(Component, { ...props, ...chatContext });\n };\n WithChatContextComponent.displayName = `WithChatContext${getDisplayName(Component)}`;\n return WithChatContextComponent;\n};\n","import React, { useContext } from 'react';\nexport const ComponentContext = React.createContext({});\nexport const ComponentProvider = ({ children, value, }) => (React.createElement(ComponentContext.Provider, { value: value }, children));\nexport const useComponentContext = (\n/**\n * @deprecated\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n_componentName) => useContext(ComponentContext);\n/**\n * Typescript currently does not support partial inference, so if ComponentContext\n * typing is desired while using the HOC withComponentContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withComponentContext = (Component) => {\n const WithComponentContextComponent = (props) => {\n const componentContext = useComponentContext();\n return React.createElement(Component, { ...props, ...componentContext });\n };\n WithComponentContextComponent.displayName = (Component.displayName ||\n Component.name ||\n 'Component').replace('Base', '');\n return WithComponentContextComponent;\n};\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","import { useCallback, useMemo } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => { };\nexport function useStateStore(store, selector) {\n const wrappedSubscription = useCallback((onStoreChange) => {\n const unsubscribe = store?.subscribeWithSelector(selector, onStoreChange);\n return unsubscribe ?? noop;\n }, [store, selector]);\n const wrappedSnapshot = useMemo(() => {\n let cachedTuple;\n return () => {\n const currentValue = store?.getLatestValue();\n if (!currentValue)\n return undefined;\n // store value hasn't changed, no need to compare individual values\n if (cachedTuple && cachedTuple[0] === currentValue) {\n return cachedTuple[1];\n }\n const newlySelected = selector(currentValue);\n // store value changed but selected values wouldn't have to, double-check selected\n if (cachedTuple) {\n let selectededAreEqualToCached = true;\n for (const key in cachedTuple[1]) {\n if (cachedTuple[1][key] === newlySelected[key])\n continue;\n selectededAreEqualToCached = false;\n break;\n }\n if (selectededAreEqualToCached)\n return cachedTuple[1];\n }\n cachedTuple = [currentValue, newlySelected];\n return cachedTuple[1];\n };\n }, [store, selector]);\n const state = useSyncExternalStore(wrappedSubscription, wrappedSnapshot);\n return state;\n}\n","import { useCallback, useEffect } from 'react';\nimport { modalDialogManagerId, useDialogManager, useNearestDialogManagerContext, } from '../../../context';\nimport { useStateStore } from '../../../store';\nexport const useDialog = ({ dialogManagerId, id }) => {\n const { dialogManager } = useDialogManager({ dialogManagerId });\n useEffect(() => () => {\n // Since this cleanup can run even if the component is still mounted\n // and dialog id is unchanged (e.g. in <StrictMode />), it's safer to\n // mark state as unused and only remove it after a timeout, rather than\n // to remove it immediately.\n dialogManager.markForRemoval(id);\n }, [dialogManager, id]);\n return dialogManager.getOrCreate({ id });\n};\nexport const useDialogOnNearestManager = ({ id }) => {\n const { dialogManager } = useNearestDialogManagerContext() ?? {};\n const dialog = useDialog({ dialogManagerId: dialogManager?.id, id });\n return {\n dialog,\n dialogManager,\n };\n};\nexport const modalDialogId = 'modal-dialog';\nexport const useModalDialog = () => useDialog({ dialogManagerId: modalDialogManagerId, id: modalDialogId });\nexport const useDialogIsOpen = (id, dialogManagerId) => {\n const { dialogManager } = useDialogManager({ dialogManagerId });\n const dialogIsOpenSelector = useCallback(({ dialogsById }) => ({ isOpen: !!dialogsById[id]?.isOpen }), [id]);\n return useStateStore(dialogManager.state, dialogIsOpenSelector).isOpen;\n};\nexport const useModalDialogIsOpen = () => useDialogIsOpen(modalDialogId, modalDialogManagerId);\nconst openedDialogCountSelector = (nextValue) => ({\n openedDialogCount: Object.values(nextValue.dialogsById).reduce((count, dialog) => {\n if (dialog.isOpen)\n return count + 1;\n return count;\n }, 0),\n});\nexport const useOpenedDialogCount = ({ dialogManagerId, } = {}) => {\n const { dialogManager } = useDialogManager({ dialogManagerId });\n return useStateStore(dialogManager.state, openedDialogCountSelector).openedDialogCount;\n};\n","import { useLayoutEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nexport const Portal = ({ children, getPortalDestination, isOpen, }) => {\n const [portalDestination, setPortalDestination] = useState(null);\n useLayoutEffect(() => {\n const destination = getPortalDestination();\n if (!destination || !isOpen)\n return;\n setPortalDestination(destination);\n }, [getPortalDestination, isOpen]);\n if (!portalDestination)\n return null;\n return createPortal(children, portalDestination);\n};\n","import React, { useCallback } from 'react';\nimport { useDialogIsOpen, useOpenedDialogCount } from './hooks';\nimport { Portal } from '../Portal/Portal';\nimport { useDialogManager, useNearestDialogManagerContext } from '../../context';\nexport const DialogPortalDestination = () => {\n const { dialogManager } = useNearestDialogManagerContext() ?? {};\n const openedDialogCount = useOpenedDialogCount({ dialogManagerId: dialogManager?.id });\n // const [destinationRoot, setDestinationRoot] = useState<HTMLDivElement | null>(null);\n // todo: allow to configure and then enable\n // useEffect(() => {\n // if (!destinationRoot) return;\n // const handleClickOutside = (event: MouseEvent) => {\n // if (!destinationRoot?.contains(event.target as Node)) {\n // dialogManager?.closeAll();\n // }\n // };\n // document.addEventListener('click', handleClickOutside, { capture: true });\n // return () => {\n // document.removeEventListener('click', handleClickOutside, { capture: true });\n // };\n // }, [destinationRoot, dialogManager]);\n if (!openedDialogCount)\n return null;\n return (React.createElement(\"div\", { className: 'str-chat__dialog-overlay', \"data-str-chat__portal-id\": dialogManager?.id, \"data-testid\": 'str-chat__dialog-overlay', onClick: () => dialogManager?.closeAll(), \n // ref={setDestinationRoot}\n style: {\n '--str-chat__dialog-overlay-height': openedDialogCount > 0 ? '100%' : '0',\n } }));\n};\nexport const DialogPortalEntry = ({ children, dialogId, dialogManagerId, }) => {\n const { dialogManager } = useDialogManager({ dialogId, dialogManagerId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManagerId);\n const getPortalDestination = useCallback(() => document.querySelector(`div[data-str-chat__portal-id=\"${dialogManager.id}\"]`), [dialogManager.id]);\n return (React.createElement(Portal, { getPortalDestination: getPortalDestination, isOpen: dialogIsOpen }, children));\n};\n","import React, { useContext, useEffect, useMemo, useState, } from 'react';\nimport { StateStore } from 'stream-chat';\nimport { DialogManager } from '../components/Dialog/DialogManager';\nimport { DialogPortalDestination } from '../components/Dialog/DialogPortal';\nconst dialogManagersRegistry = new StateStore({});\nconst getDialogManager = (id) => dialogManagersRegistry.getLatestValue()[id];\nconst getOrCreateDialogManager = (id) => {\n let manager = getDialogManager(id);\n if (!manager) {\n manager = new DialogManager({ id });\n dialogManagersRegistry.partialNext({ [id]: manager });\n }\n return manager;\n};\nconst removeDialogManager = (id) => {\n if (!getDialogManager(id))\n return;\n dialogManagersRegistry.partialNext({ [id]: undefined });\n};\nconst DialogManagerProviderContext = React.createContext(undefined);\n/**\n * Marks the portal location\n * @param children\n * @param id\n * @constructor\n */\nexport const DialogManagerProvider = ({ children, id, }) => {\n const [dialogManager, setDialogManager] = useState(() => {\n if (id)\n return getDialogManager(id) ?? null;\n return new DialogManager(); // will not be included in the registry\n });\n useEffect(() => {\n if (!id)\n return;\n setDialogManager(getOrCreateDialogManager(id));\n return () => {\n removeDialogManager(id);\n setDialogManager(null);\n };\n }, [id]);\n // temporarily do not render until a new dialog manager is created\n if (!dialogManager)\n return null;\n return (React.createElement(DialogManagerProviderContext.Provider, { value: { dialogManager } },\n children,\n React.createElement(DialogPortalDestination, null)));\n};\nconst getManagerFromStore = ({ dialogId, dialogManagerId, newState, previousState, }) => {\n let managerInNewState;\n let managerInPrevState;\n if (dialogManagerId) {\n if (!dialogId) {\n managerInNewState = newState[dialogManagerId];\n managerInPrevState = previousState?.[dialogManagerId];\n }\n else {\n if (newState[dialogManagerId]?.get(dialogId)) {\n managerInNewState = newState[dialogManagerId];\n }\n if (previousState?.[dialogManagerId]?.get(dialogId)) {\n managerInPrevState = previousState[dialogManagerId];\n }\n }\n }\n else if (dialogId) {\n managerInNewState = Object.values(newState).find((dialogMng) => dialogId && dialogMng?.get(dialogId));\n managerInPrevState =\n previousState &&\n Object.values(previousState).find((dialogMng) => dialogId && dialogMng?.get(dialogId));\n }\n return { managerInNewState, managerInPrevState };\n};\n/**\n * Retrieves the nearest dialog manager or searches for the dialog manager by dialog manager id or dialog id.\n * Dialog id will take precedence over dialog manager id if both are provided and dialog manager is found by dialog id.\n */\nexport const useDialogManager = ({ dialogId, dialogManagerId, } = {}) => {\n const nearestDialogManagerContext = useContext(DialogManagerProviderContext);\n const [dialogManagerContext, setDialogManagerContext] = useState(() => {\n const { managerInNewState } = getManagerFromStore({\n dialogId,\n dialogManagerId,\n newState: dialogManagersRegistry.getLatestValue(),\n previousState: undefined,\n });\n return managerInNewState\n ? { dialogManager: managerInNewState }\n : nearestDialogManagerContext;\n });\n useEffect(() => {\n if (!dialogId && !dialogManagerId)\n return;\n const unsubscribe = dialogManagersRegistry.subscribeWithSelector((state) => state, (newState, previousState) => {\n const { managerInNewState, managerInPrevState } = getManagerFromStore({\n dialogId,\n dialogManagerId,\n newState,\n previousState,\n });\n if (!managerInPrevState || managerInNewState?.id !== managerInPrevState.id) {\n setDialogManagerContext((prevState) => {\n if (prevState?.dialogManager.id === managerInNewState?.id)\n return prevState;\n // fixme: need to handle the possibility that the dialogManager is undefined\n return {\n dialogManager: managerInNewState || nearestDialogManagerContext?.dialogManager,\n };\n });\n }\n });\n return () => {\n unsubscribe();\n };\n }, [dialogId, dialogManagerId, nearestDialogManagerContext?.dialogManager]);\n if (!dialogManagerContext?.dialogManager) {\n console.warn(`Dialog manager (manager id: ${dialogManagerId}, dialog id: ${dialogId}) is not available`);\n }\n return dialogManagerContext;\n};\nexport const modalDialogManagerId = 'modal-dialog-manager';\nexport const ModalDialogManagerProvider = ({ children }) => (React.createElement(DialogManagerProvider, { id: modalDialogManagerId }, children));\nexport const useModalDialogManager = () => useMemo(() => getDialogManager(modalDialogManagerId), []);\nexport const useNearestDialogManagerContext = () => useContext(DialogManagerProviderContext);\n","import React, { useContext } from 'react';\nexport const MessageContext = React.createContext(undefined);\nexport const MessageProvider = ({ children, value, }) => (React.createElement(MessageContext.Provider, { value: value }, children));\nexport const useMessageContext = (\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n_componentName) => {\n const contextValue = useContext(MessageContext);\n if (!contextValue) {\n return {};\n }\n return contextValue;\n};\n/**\n * Typescript currently does not support partial inference, so if MessageContext\n * typing is desired while using the HOC withMessageContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withMessageContext = (Component) => {\n const WithMessageContextComponent = (props) => {\n const messageContext = useMessageContext();\n return React.createElement(Component, { ...props, ...messageContext });\n };\n WithMessageContextComponent.displayName = (Component.displayName ||\n Component.name ||\n 'Component').replace('Base', '');\n return WithMessageContextComponent;\n};\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_calendar=t()}(this,(function(){\"use strict\";return function(e,t,a){var n=\"h:mm A\",d={lastDay:\"[Yesterday at] \"+n,sameDay:\"[Today at] \"+n,nextDay:\"[Tomorrow at] \"+n,nextWeek:\"dddd [at] \"+n,lastWeek:\"[Last] dddd [at] \"+n,sameElse:\"MM/DD/YYYY\"};t.prototype.calendar=function(e,t){var n=t||this.$locale().calendar||d,o=a(e||void 0).startOf(\"d\"),s=this.diff(o,\"d\",!0),i=\"sameElse\",f=s<-6?i:s<-1?\"lastWeek\":s<0?\"lastDay\":s<1?\"sameDay\":s<2?\"nextDay\":s<7?\"nextWeek\":i,l=n[f]||d[f];return\"function\"==typeof l?l.call(this,a()):this.format(l)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_localizedFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"};return function(t,o,n){var r=o.prototype,i=r.format;n.en.formats=e,r.format=function(t){void 0===t&&(t=\"YYYY-MM-DDTHH:mm:ssZ\");var o=this.$locale().formats,n=function(t,o){return t.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var i=r&&r.toUpperCase();return n||o[r]||e[r]||o[i].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,o){return t||o.slice(1)}))}))}(t,void 0===o?{}:o);return i.call(this,n)}}}));","import Dayjs from 'dayjs';\nexport const notValidDateWarning = 'MessageTimestamp was called without a message, or message has invalid created_at date.';\nexport const noParsingFunctionWarning = 'MessageTimestamp was called but there is no datetime parsing function available';\nexport const isNumberOrString = (output) => typeof output === 'string' || typeof output === 'number';\nexport const isDayOrMoment = (output) => !!output?.isSame;\nexport const isDate = (output) => output !== null &&\n typeof output === 'object' &&\n typeof output.getTime === 'function';\nexport function getDateString({ calendar, calendarFormats, format, formatDate, messageCreatedAt, t, tDateTimeParser, timestampTranslationKey, }) {\n if (!messageCreatedAt ||\n (typeof messageCreatedAt === 'string' && !Date.parse(messageCreatedAt))) {\n console.warn(notValidDateWarning);\n return null;\n }\n if (typeof formatDate === 'function') {\n return formatDate(new Date(messageCreatedAt));\n }\n if (t && timestampTranslationKey) {\n const options = {};\n if (typeof calendar !== 'undefined' && calendar !== null)\n options.calendar = calendar;\n if (typeof calendarFormats !== 'undefined' && calendarFormats !== null)\n options.calendarFormats = calendarFormats;\n if (typeof format !== 'undefined' && format !== null)\n options.format = format;\n const translatedTimestamp = t(timestampTranslationKey, {\n ...options,\n timestamp: new Date(messageCreatedAt),\n });\n const translationKeyFound = timestampTranslationKey !== translatedTimestamp;\n if (translationKeyFound)\n return translatedTimestamp;\n }\n if (!tDateTimeParser) {\n console.warn(noParsingFunctionWarning);\n return null;\n }\n const parsedTime = tDateTimeParser(messageCreatedAt);\n if (isDayOrMoment(parsedTime)) {\n /**\n * parsedTime.calendar is guaranteed on the type but is only\n * available when a user calls dayjs.extend(calendar)\n */\n return calendar && parsedTime.calendar\n ? parsedTime.calendar(undefined, calendarFormats || undefined)\n : parsedTime.format(format || undefined);\n }\n if (isDate(parsedTime)) {\n return parsedTime.toDateString();\n }\n if (isNumberOrString(parsedTime)) {\n return parsedTime;\n }\n return null;\n}\nexport const predefinedFormatters = {\n durationFormatter: (streamI18n) => (value, _, { format, withSuffix }) => {\n // NOTE: isDayjs is not exported in \"dayjs\" package for ESM, hence we access\n // `isDayjs` from Dayjs instance\n if (format && Dayjs.isDayjs(streamI18n.DateTimeParser)) {\n return streamI18n.DateTimeParser.duration(value).format(format);\n }\n return streamI18n.DateTimeParser.duration(value).humanize(!!withSuffix);\n },\n timestampFormatter: (streamI18n) => (value, _, { calendarFormats, ...options }) => {\n let parsedCalendarFormats;\n try {\n if (!options.calendar) {\n parsedCalendarFormats = {};\n }\n else if (typeof calendarFormats === 'string') {\n parsedCalendarFormats = JSON.parse(calendarFormats);\n }\n else if (typeof calendarFormats === 'object') {\n parsedCalendarFormats = calendarFormats;\n }\n }\n catch (e) {\n console.error('[TIMESTAMP FORMATTER]', e);\n }\n const result = getDateString({\n ...options,\n calendarFormats: parsedCalendarFormats,\n messageCreatedAt: value,\n tDateTimeParser: streamI18n.tDateTimeParser,\n });\n if (!result || typeof result === 'number') {\n return JSON.stringify(value);\n }\n return result;\n },\n};\nexport const defaultTranslatorFunction = ((key) => key);\nexport const defaultDateTimeParser = (input) => Dayjs(input);\nexport const isLanguageSupported = (language) => {\n const translations = [\n 'de',\n 'en',\n 'es',\n 'fr',\n 'hi',\n 'it',\n 'ja',\n 'ko',\n 'nl',\n 'pt',\n 'ru',\n 'tr',\n ];\n return translations.some((translation) => language === translation);\n};\n","import React, { useContext } from 'react';\nimport Dayjs from 'dayjs';\nimport calendar from 'dayjs/plugin/calendar';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport { getDisplayName } from './utils/getDisplayName';\nimport { defaultDateTimeParser, defaultTranslatorFunction } from '../i18n/utils';\nDayjs.extend(calendar);\nDayjs.extend(localizedFormat);\nexport const TranslationContext = React.createContext({\n t: defaultTranslatorFunction,\n tDateTimeParser: defaultDateTimeParser,\n userLanguage: 'en',\n});\nexport const TranslationProvider = ({ children, value, }) => (React.createElement(TranslationContext.Provider, { value: value }, children));\nexport const useTranslationContext = (componentName) => {\n const contextValue = useContext(TranslationContext);\n if (!contextValue) {\n console.warn(`The useTranslationContext hook was called outside of the TranslationContext provider. Make sure this hook is called within a child of the Chat component. The errored call is located in the ${componentName} component.`);\n return {};\n }\n return contextValue;\n};\nexport const withTranslationContext = (Component) => {\n const WithTranslationContextComponent = (props) => {\n const translationContext = useTranslationContext();\n return React.createElement(Component, { ...props, ...translationContext });\n };\n WithTranslationContextComponent.displayName = `WithTranslationContext${getDisplayName(Component)}`;\n return WithTranslationContextComponent;\n};\n","import React, { createContext, useContext } from 'react';\nimport { Channel } from '../../components';\nexport const ThreadContext = createContext(undefined);\nexport const useThreadContext = () => useContext(ThreadContext);\nexport const ThreadProvider = ({ children, thread, }) => (React.createElement(ThreadContext.Provider, { value: thread },\n React.createElement(Channel, { channel: thread?.channel }, children)));\n","import React from 'react';\n// TODO: unify icons across SDK\nexport const Icon = {\n MessageBubble: (props) => (React.createElement(\"svg\", { className: 'str-chat__icon str-chat__icon--message-bubble', fill: 'none', height: '14', viewBox: '0 0 14 14', width: '14', xmlns: 'http://www.w3.org/2000/svg', ...props },\n React.createElement(\"path\", { d: 'M1.66659 1.66665H12.3333V9.66665H2.44659L1.66659 10.4466V1.66665ZM1.66659 0.333313C0.933252 0.333313 0.339919 0.933313 0.339919 1.66665L0.333252 13.6666L2.99992 11H12.3333C13.0666 11 13.6666 10.4 13.6666 9.66665V1.66665C13.6666 0.933313 13.0666 0.333313 12.3333 0.333313H1.66659ZM2.99992 6.99998H10.9999V8.33331H2.99992V6.99998ZM2.99992 4.99998H10.9999V6.33331H2.99992V4.99998ZM2.99992 2.99998H10.9999V4.33331H2.99992V2.99998Z', fill: 'currentColor' }))),\n MessageBubbleEmpty: (props) => (React.createElement(\"svg\", { className: 'str-chat__icon str-chat__icon--message-bubble-empty', fill: 'none', height: '20', viewBox: '0 0 20 20', width: '20', xmlns: 'http://www.w3.org/2000/svg', ...props },\n React.createElement(\"path\", { d: 'M18 0H2C0.9 0 0 0.9 0 2V20L4 16H18C19.1 16 20 15.1 20 14V2C20 0.9 19.1 0 18 0ZM18 14H4L2 16V2H18V14Z', fill: 'currentColor' }))),\n Reload: (props) => (React.createElement(\"svg\", { className: 'str-chat__icon str-chat__icon--reload', fill: 'none', height: '22', viewBox: '0 0 16 22', width: '16', xmlns: 'http://www.w3.org/2000/svg', ...props },\n React.createElement(\"path\", { d: 'M8 3V0L4 4L8 8V5C11.31 5 14 7.69 14 11C14 12.01 13.75 12.97 13.3 13.8L14.76 15.26C15.54 14.03 16 12.57 16 11C16 6.58 12.42 3 8 3ZM8 17C4.69 17 2 14.31 2 11C2 9.99 2.25 9.03 2.7 8.2L1.24 6.74C0.46 7.97 0 9.43 0 11C0 15.42 3.58 19 8 19V22L12 18L8 14V17Z', fill: 'currentColor' }))),\n User: (props) => (React.createElement(\"svg\", { className: 'str-chat__icon str-chat__icon--user', fill: 'none', height: '16', viewBox: '0 0 16 16', width: '16', xmlns: 'http://www.w3.org/2000/svg', ...props },\n React.createElement(\"path\", { d: 'M8 2C9.1 2 10 2.9 10 4C10 5.1 9.1 6 8 6C6.9 6 6 5.1 6 4C6 2.9 6.9 2 8 2ZM8 12C10.7 12 13.8 13.29 14 14H2C2.23 13.28 5.31 12 8 12ZM8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z', fill: 'currentColor' }))),\n};\n","// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters\nexport const getWholeChar = (str, i) => {\n const code = str.charCodeAt(i);\n if (Number.isNaN(code))\n return '';\n if (code < 0xd800 || code > 0xdfff)\n return str.charAt(i);\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n return '';\n};\n","import clsx from 'clsx';\nimport React, { useEffect, useState } from 'react';\nimport { Icon } from '../Threads/icons';\nimport { getWholeChar } from '../../utils';\n/**\n * A round avatar image with fallback to username's first letter\n */\nexport const Avatar = (props) => {\n const { className, image, name, onClick = () => undefined, onMouseOver = () => undefined, } = props;\n const [error, setError] = useState(false);\n useEffect(() => {\n setError(false);\n }, [image]);\n const nameStr = name?.toString() || '';\n const initials = getWholeChar(nameStr, 0);\n const showImage = image && !error;\n return (React.createElement(\"div\", { className: clsx(`str-chat__avatar str-chat__message-sender-avatar`, className, {\n ['str-chat__avatar--multiple-letters']: initials.length > 1,\n ['str-chat__avatar--no-letters']: !initials.length,\n ['str-chat__avatar--one-letter']: initials.length === 1,\n }), \"data-testid\": 'avatar', onClick: onClick, onMouseOver: onMouseOver, role: 'button', title: name }, showImage ? (React.createElement(\"img\", { alt: initials, className: 'str-chat__avatar-image', \"data-testid\": 'avatar-img', onError: () => setError(true), src: image })) : (React.createElement(React.Fragment, null,\n !!initials.length && (React.createElement(\"div\", { className: clsx('str-chat__avatar-fallback'), \"data-testid\": 'avatar-fallback' }, initials)),\n !initials.length && React.createElement(Icon.User, null)))));\n};\n","import deepequal from 'react-fast-compare';\nimport emojiRegex from 'emoji-regex';\n/**\n * Following function validates a function which returns notification message.\n * It validates if the first parameter is function and also if return value of function is string or no.\n */\nexport const validateAndGetMessage = (func, args) => {\n if (!func || typeof func !== 'function')\n return null;\n // below is due to tests passing a single argument\n // rather than an array.\n if (!Array.isArray(args)) {\n args = [args];\n }\n const returnValue = func(...args);\n if (typeof returnValue !== 'string')\n return null;\n return returnValue;\n};\n/**\n * Tell if the owner of the current message is muted\n */\nexport const isUserMuted = (message, mutes) => {\n if (!mutes || !message)\n return false;\n const userMuted = mutes.filter((el) => el.target.id === message.user?.id);\n return !!userMuted.length;\n};\nexport const OPTIONAL_MESSAGE_ACTIONS = {\n deleteForMe: 'deleteForMe',\n};\nexport const MESSAGE_ACTIONS = {\n delete: 'delete',\n edit: 'edit',\n flag: 'flag',\n markUnread: 'markUnread',\n mute: 'mute',\n pin: 'pin',\n quote: 'quote',\n react: 'react',\n remindMe: 'remindMe',\n reply: 'reply',\n saveForLater: 'saveForLater',\n};\n// @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\nexport const defaultPinPermissions = {\n commerce: {\n admin: true,\n anonymous: false,\n channel_member: false,\n channel_moderator: true,\n guest: false,\n member: false,\n moderator: true,\n owner: true,\n user: false,\n },\n gaming: {\n admin: true,\n anonymous: false,\n channel_member: false,\n channel_moderator: true,\n guest: false,\n member: false,\n moderator: true,\n owner: false,\n user: false,\n },\n livestream: {\n admin: true,\n anonymous: false,\n channel_member: false,\n channel_moderator: true,\n guest: false,\n member: false,\n moderator: true,\n owner: true,\n user: false,\n },\n messaging: {\n admin: true,\n anonymous: false,\n channel_member: true,\n channel_moderator: true,\n guest: false,\n member: true,\n moderator: true,\n owner: true,\n user: false,\n },\n team: {\n admin: true,\n anonymous: false,\n channel_member: true,\n channel_moderator: true,\n guest: false,\n member: true,\n moderator: true,\n owner: true,\n user: false,\n },\n};\nexport const getMessageActions = (actions, { canDelete, canEdit, canFlag, canMarkUnread, canMute, canPin, canQuote, canReact, canReply, }, channelConfig) => {\n const messageActionsAfterPermission = [];\n let messageActions = [];\n if (actions && typeof actions === 'boolean') {\n // If value of actions is true, then populate all the possible values\n messageActions = Object.keys(MESSAGE_ACTIONS);\n }\n else if (actions && actions.length > 0) {\n messageActions = [...actions];\n }\n else {\n return [];\n }\n if (canDelete && messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.delete);\n }\n if (canDelete && messageActions.indexOf(OPTIONAL_MESSAGE_ACTIONS.deleteForMe) > -1) {\n messageActionsAfterPermission.push(OPTIONAL_MESSAGE_ACTIONS.deleteForMe);\n }\n if (canEdit && messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.edit);\n }\n if (canFlag && messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.flag);\n }\n if (canMarkUnread && messageActions.indexOf(MESSAGE_ACTIONS.markUnread) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.markUnread);\n }\n if (canMute && messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.mute);\n }\n if (canPin && messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.pin);\n }\n if (canQuote && messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.quote);\n }\n if (canReact && messageActions.indexOf(MESSAGE_ACTIONS.react) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.react);\n }\n if (channelConfig?.['user_message_reminders'] &&\n messageActions.indexOf(MESSAGE_ACTIONS.remindMe) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.remindMe);\n }\n if (canReply && messageActions.indexOf(MESSAGE_ACTIONS.reply) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.reply);\n }\n if (channelConfig?.['user_message_reminders'] &&\n messageActions.indexOf(MESSAGE_ACTIONS.saveForLater) > -1) {\n messageActionsAfterPermission.push(MESSAGE_ACTIONS.saveForLater);\n }\n return messageActionsAfterPermission;\n};\nexport const ACTIONS_NOT_WORKING_IN_THREAD = [\n MESSAGE_ACTIONS.pin,\n MESSAGE_ACTIONS.reply,\n MESSAGE_ACTIONS.markUnread,\n];\n/**\n * @deprecated use `shouldRenderMessageActions` instead\n */\nexport const showMessageActionsBox = (actions, inThread) => shouldRenderMessageActions({ inThread, messageActions: actions });\nexport const shouldRenderMessageActions = ({ customMessageActions, CustomMessageActionsList, inThread, messageActions, }) => {\n if (typeof CustomMessageActionsList !== 'undefined' ||\n typeof customMessageActions !== 'undefined')\n return true;\n if (!messageActions.length)\n return false;\n if (inThread &&\n messageActions.filter((action) => !ACTIONS_NOT_WORKING_IN_THREAD.includes(action))\n .length === 0) {\n return false;\n }\n if (messageActions.length === 1 &&\n (messageActions.includes(MESSAGE_ACTIONS.react) ||\n messageActions.includes(MESSAGE_ACTIONS.reply))) {\n return false;\n }\n if (messageActions.length === 2 &&\n messageActions.includes(MESSAGE_ACTIONS.react) &&\n messageActions.includes(MESSAGE_ACTIONS.reply)) {\n return false;\n }\n return true;\n};\nfunction areMessagesEqual(prevMessage, nextMessage) {\n const areBaseMessagesEqual = (prevMessage, nextMessage) => prevMessage.deleted_at === nextMessage.deleted_at &&\n prevMessage.latest_reactions?.length === nextMessage.latest_reactions?.length &&\n prevMessage.own_reactions?.length === nextMessage.own_reactions?.length &&\n prevMessage.pinned === nextMessage.pinned &&\n prevMessage.reply_count === nextMessage.reply_count &&\n prevMessage.status === nextMessage.status &&\n prevMessage.text === nextMessage.text &&\n prevMessage.type === nextMessage.type &&\n prevMessage.updated_at === nextMessage.updated_at &&\n prevMessage.user?.updated_at === nextMessage.user?.updated_at;\n return (areBaseMessagesEqual(prevMessage, nextMessage) &&\n Boolean(prevMessage.quoted_message) === Boolean(nextMessage.quoted_message) &&\n ((!prevMessage.quoted_message && !nextMessage.quoted_message) ||\n areBaseMessagesEqual(prevMessage.quoted_message, nextMessage.quoted_message)));\n}\nexport const areMessagePropsEqual = (prevProps, nextProps) => {\n const { message: prevMessage, Message: prevMessageUI } = prevProps;\n const { message: nextMessage, Message: nextMessageUI } = nextProps;\n if (prevMessageUI !== nextMessageUI)\n return false;\n if (prevProps.endOfGroup !== nextProps.endOfGroup)\n return false;\n if (nextProps.showDetailedReactions !== prevProps.showDetailedReactions) {\n return false;\n }\n if (nextProps.closeReactionSelectorOnClick !== prevProps.closeReactionSelectorOnClick) {\n return false;\n }\n const messagesAreEqual = areMessagesEqual(prevMessage, nextMessage);\n if (!messagesAreEqual)\n return false;\n const deepEqualProps = deepequal(nextProps.messageActions, prevProps.messageActions) &&\n deepequal(nextProps.readBy, prevProps.readBy) &&\n deepequal(nextProps.deliveredTo, prevProps.deliveredTo) &&\n deepequal(nextProps.highlighted, prevProps.highlighted) &&\n deepequal(nextProps.groupStyles, prevProps.groupStyles) && // last 3 messages can have different group styles\n deepequal(nextProps.mutes, prevProps.mutes) &&\n deepequal(nextProps.lastReceivedId, prevProps.lastReceivedId);\n if (!deepEqualProps)\n return false;\n return (prevProps.messageListRect === nextProps.messageListRect // MessageList wrapper layout changes\n );\n};\nexport const areMessageUIPropsEqual = (prevProps, nextProps) => {\n const { lastReceivedId: prevLastReceivedId, message: prevMessage } = prevProps;\n const { lastReceivedId: nextLastReceivedId, message: nextMessage } = nextProps;\n if (prevProps.editing !== nextProps.editing)\n return false;\n if (prevProps.highlighted !== nextProps.highlighted)\n return false;\n if (prevProps.endOfGroup !== nextProps.endOfGroup)\n return false;\n if (prevProps.mutes?.length !== nextProps.mutes?.length)\n return false;\n if (prevProps.readBy?.length !== nextProps.readBy?.length)\n return false;\n if (prevProps.deliveredTo?.length !== nextProps.deliveredTo?.length)\n return false;\n if (prevProps.groupStyles !== nextProps.groupStyles)\n return false;\n if (prevProps.showDetailedReactions !== nextProps.showDetailedReactions) {\n return false;\n }\n if ((prevMessage.id === prevLastReceivedId || prevMessage.id === nextLastReceivedId) &&\n prevLastReceivedId !== nextLastReceivedId) {\n return false;\n }\n return areMessagesEqual(prevMessage, nextMessage);\n};\nexport const messageHasReactions = (message) => Object.values(message?.reaction_groups ?? {}).some(({ count }) => count > 0);\nexport const messageHasAttachments = (message) => !!message?.attachments && !!message.attachments.length;\nexport const getImages = (message) => {\n if (!message?.attachments) {\n return [];\n }\n return message.attachments.filter((item) => item.type === 'image');\n};\nexport const getNonImageAttachments = (message) => {\n if (!message?.attachments) {\n return [];\n }\n return message.attachments.filter((item) => item.type !== 'image');\n};\n/**\n * Default Tooltip Username mapper implementation.\n *\n * @param user the user.\n */\nexport const mapToUserNameOrId = (user) => user.name || user.id;\nexport const getReadByTooltipText = (users, t, client, tooltipUserNameMapper) => {\n let outStr = '';\n if (!t) {\n throw new Error('getReadByTooltipText was called, but translation function is not available');\n }\n if (!tooltipUserNameMapper) {\n throw new Error('getReadByTooltipText was called, but tooltipUserNameMapper function is not available');\n }\n // first filter out client user, so restLength won't count it\n const otherUsers = users\n .filter((item) => item && client?.user && item.id !== client.user.id)\n .map(tooltipUserNameMapper);\n const slicedArr = otherUsers.slice(0, 5);\n const restLength = otherUsers.length - slicedArr.length;\n if (slicedArr.length === 1) {\n outStr = `${slicedArr[0]} `;\n }\n else if (slicedArr.length === 2) {\n // joins all with \"and\" but =no commas\n // example: \"bob and sam\"\n outStr = t('{{ firstUser }} and {{ secondUser }}', {\n firstUser: slicedArr[0],\n secondUser: slicedArr[1],\n });\n }\n else if (slicedArr.length > 2) {\n // joins all with commas, but last one gets \", and\" (oxford comma!)\n // example: \"bob, joe, sam and 4 more\"\n if (restLength === 0) {\n // mutate slicedArr to remove last user to display it separately\n const lastUser = slicedArr.splice(slicedArr.length - 1, 1);\n outStr = t('{{ commaSeparatedUsers }}, and {{ lastUser }}', {\n commaSeparatedUsers: slicedArr.join(', '),\n lastUser,\n });\n }\n else {\n outStr = t('{{ commaSeparatedUsers }} and {{ moreCount }} more', {\n commaSeparatedUsers: slicedArr.join(', '),\n moreCount: restLength,\n });\n }\n }\n return outStr;\n};\nexport const isOnlyEmojis = (text) => {\n if (!text)\n return false;\n const noEmojis = text.replace(emojiRegex(), '');\n const noSpace = noEmojis.replace(/[\\s\\n]/gm, '');\n return !noSpace;\n};\nexport const isMessageBounced = (message) => message.type === 'error' &&\n (message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_BOUNCE' ||\n message.moderation?.action === 'bounce');\nexport const isMessageBlocked = (message) => message.type === 'error' &&\n (message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_REMOVE' ||\n message.moderation?.action === 'remove');\nexport const isMessageEdited = (message) => !!message.message_text_updated_at;\n","import { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nexport const useUserRole = (message, onlySenderCanEdit, disableQuotedMessages) => {\n const { channel, channelCapabilities = {} } = useChannelStateContext('useUserRole');\n const { client } = useChatContext('useUserRole');\n /**\n * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n * `isAdmin` will be removed in future release. See `channelCapabilities`.\n */\n const isAdmin = client.user?.role === 'admin' || channel.state.membership.role === 'admin';\n /**\n * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n * `isOwner` will be removed in future release. See `channelCapabilities`.\n */\n const isOwner = channel.state.membership.role === 'owner';\n /**\n * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n * `isModerator` will be removed in future release. See `channelCapabilities`.\n */\n const isModerator = client.user?.role === 'channel_moderator' ||\n channel.state.membership.role === 'channel_moderator' ||\n channel.state.membership.role === 'moderator' ||\n channel.state.membership.is_moderator === true ||\n channel.state.membership.channel_role === 'channel_moderator';\n const isMyMessage = client.userID === message.user?.id;\n const canEdit = !message.poll &&\n ((!onlySenderCanEdit && channelCapabilities['update-any-message']) ||\n (isMyMessage && channelCapabilities['update-own-message']));\n const canDelete = channelCapabilities['delete-any-message'] ||\n (isMyMessage && channelCapabilities['delete-own-message']);\n const canFlag = !isMyMessage && channelCapabilities['flag-message'];\n const canMarkUnread = channelCapabilities['read-events'];\n const canMute = !isMyMessage && channelCapabilities['mute-channel'];\n const canQuote = !disableQuotedMessages && channelCapabilities['quote-message'];\n const canReact = channelCapabilities['send-reaction'];\n const canReply = channelCapabilities['send-reply'];\n return {\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canQuote,\n canReact,\n canReply,\n isAdmin,\n isModerator,\n isMyMessage,\n isOwner,\n };\n};\n","import { useCallback } from 'react';\nimport { useChatContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nexport const useMessageReminder = (messageId) => {\n const { client } = useChatContext();\n const reminderSelector = useCallback((state) => ({\n reminder: state.reminders.get(messageId),\n }), [messageId]);\n const { reminder } = useStateStore(client.reminders.state, reminderSelector);\n return reminder;\n};\n","const $d447af545b77c9f1$export$b204af158042fbac = (el)=>{\n return el?.ownerDocument ?? document;\n};\nconst $d447af545b77c9f1$export$f21a1ffae260145a = (el)=>{\n if (el && 'window' in el && el.window === el) return el;\n const doc = $d447af545b77c9f1$export$b204af158042fbac(el);\n return doc.defaultView || window;\n};\n/**\n * Type guard that checks if a value is a Node. Verifies the presence and type of the nodeType property.\n */ function $d447af545b77c9f1$var$isNode(value) {\n return value !== null && typeof value === 'object' && 'nodeType' in value && typeof value.nodeType === 'number';\n}\nfunction $d447af545b77c9f1$export$af51f0f06c0f328a(node) {\n return $d447af545b77c9f1$var$isNode(node) && node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && 'host' in node;\n}\n\n\nexport {$d447af545b77c9f1$export$b204af158042fbac as getOwnerDocument, $d447af545b77c9f1$export$f21a1ffae260145a as getOwnerWindow, $d447af545b77c9f1$export$af51f0f06c0f328a as isShadowRoot};\n//# sourceMappingURL=domHelpers.mjs.map\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ let $6a20a7989e6c817a$var$_tableNestedRows = false;\nlet $6a20a7989e6c817a$var$_shadowDOM = false;\nfunction $6a20a7989e6c817a$export$d9d8a0f82de49530() {\n $6a20a7989e6c817a$var$_tableNestedRows = true;\n}\nfunction $6a20a7989e6c817a$export$1b00cb14a96194e6() {\n return $6a20a7989e6c817a$var$_tableNestedRows;\n}\nfunction $6a20a7989e6c817a$export$12b151d9882e9985() {\n $6a20a7989e6c817a$var$_shadowDOM = true;\n}\nfunction $6a20a7989e6c817a$export$98658e8c59125e6a() {\n return $6a20a7989e6c817a$var$_shadowDOM;\n}\n\n\nexport {$6a20a7989e6c817a$export$d9d8a0f82de49530 as enableTableNestedRows, $6a20a7989e6c817a$export$1b00cb14a96194e6 as tableNestedRows, $6a20a7989e6c817a$export$12b151d9882e9985 as enableShadowDOM, $6a20a7989e6c817a$export$98658e8c59125e6a as shadowDOM};\n//# sourceMappingURL=flags.mjs.map\n","import {getOwnerWindow as $d447af545b77c9f1$export$f21a1ffae260145a, isShadowRoot as $d447af545b77c9f1$export$af51f0f06c0f328a} from \"../domHelpers.mjs\";\nimport {shadowDOM as $eXv8n$shadowDOM} from \"react-stately/private/flags/flags\";\n\n// Source: https://github.com/microsoft/tabster/blob/a89fc5d7e332d48f68d03b1ca6e344489d1c3898/src/Shadowdomize/DOMFunctions.ts#L16\n/* eslint-disable rsp-rules/no-non-shadow-contains, rsp-rules/safe-event-target */ \n\nfunction $23f2114a1b82827e$export$4282f70798064fe0(node, otherNode) {\n if (!(0, $eXv8n$shadowDOM)()) return otherNode && node ? node.contains(otherNode) : false;\n if (!node || !otherNode) return false;\n let currentNode = otherNode;\n while(currentNode !== null){\n if (currentNode === node) return true;\n if (currentNode.tagName === 'SLOT' && currentNode.assignedSlot) // Element is slotted\n currentNode = currentNode.assignedSlot.parentNode;\n else if ((0, $d447af545b77c9f1$export$af51f0f06c0f328a)(currentNode)) // Element is in shadow root\n currentNode = currentNode.host;\n else currentNode = currentNode.parentNode;\n }\n return false;\n}\nconst $23f2114a1b82827e$export$cd4e5573fbe2b576 = (doc = document)=>{\n if (!(0, $eXv8n$shadowDOM)()) return doc.activeElement;\n let activeElement = doc.activeElement;\n while(activeElement && 'shadowRoot' in activeElement && activeElement.shadowRoot?.activeElement)activeElement = activeElement.shadowRoot.activeElement;\n return activeElement;\n};\nfunction $23f2114a1b82827e$export$e58f029f0fbfdb29(event) {\n if ((0, $eXv8n$shadowDOM)() && event.target instanceof Element && event.target.shadowRoot) {\n if ('composedPath' in event) return event.composedPath()[0] ?? null;\n else if ('composedPath' in event.nativeEvent) return event.nativeEvent.composedPath()[0] ?? null;\n }\n return event.target;\n}\nfunction $23f2114a1b82827e$export$b4f377a2b6254582(node) {\n if (!node) return false;\n // Get the active element within the node's parent shadow root (or the document). Can return null.\n let root = node.getRootNode();\n let ownerWindow = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(node);\n if (!(root instanceof ownerWindow.Document || root instanceof ownerWindow.ShadowRoot)) return false;\n let activeElement = root.activeElement;\n // Check if the active element is within this node. These nodes are within the same shadow root.\n return activeElement != null && node.contains(activeElement);\n}\n\n\nexport {$23f2114a1b82827e$export$4282f70798064fe0 as nodeContains, $23f2114a1b82827e$export$cd4e5573fbe2b576 as getActiveElement, $23f2114a1b82827e$export$e58f029f0fbfdb29 as getEventTarget, $23f2114a1b82827e$export$b4f377a2b6254582 as isFocusWithin};\n//# sourceMappingURL=DOMFunctions.mjs.map\n","import {nodeContains as $23f2114a1b82827e$export$4282f70798064fe0} from \"./DOMFunctions.mjs\";\nimport {shadowDOM as $kGVXB$shadowDOM} from \"react-stately/private/flags/flags\";\n\n// https://github.com/microsoft/tabster/blob/a89fc5d7e332d48f68d03b1ca6e344489d1c3898/src/Shadowdomize/ShadowTreeWalker.ts\n\n\nclass $654b97e09f2a30c1$export$63eb3ababa9c55c4 {\n constructor(doc, root, whatToShow, filter){\n this._walkerStack = [];\n this._currentSetFor = new Set();\n this._acceptNode = (node)=>{\n if (node.nodeType === Node.ELEMENT_NODE) {\n const shadowRoot = node.shadowRoot;\n if (shadowRoot) {\n const walker = this._doc.createTreeWalker(shadowRoot, this.whatToShow, {\n acceptNode: this._acceptNode\n });\n this._walkerStack.unshift(walker);\n return NodeFilter.FILTER_ACCEPT;\n } else {\n if (typeof this.filter === 'function') return this.filter(node);\n else if (this.filter?.acceptNode) return this.filter.acceptNode(node);\n else if (this.filter === null) return NodeFilter.FILTER_ACCEPT;\n }\n }\n return NodeFilter.FILTER_SKIP;\n };\n this._doc = doc;\n this.root = root;\n this.filter = filter ?? null;\n this.whatToShow = whatToShow ?? NodeFilter.SHOW_ALL;\n this._currentNode = root;\n this._walkerStack.unshift(doc.createTreeWalker(root, whatToShow, this._acceptNode));\n const shadowRoot = root.shadowRoot;\n if (shadowRoot) {\n const walker = this._doc.createTreeWalker(shadowRoot, this.whatToShow, {\n acceptNode: this._acceptNode\n });\n this._walkerStack.unshift(walker);\n }\n }\n get currentNode() {\n return this._currentNode;\n }\n set currentNode(node) {\n if (!(0, $23f2114a1b82827e$export$4282f70798064fe0)(this.root, node)) throw new Error('Cannot set currentNode to a node that is not contained by the root node.');\n const walkers = [];\n let curNode = node;\n let currentWalkerCurrentNode = node;\n this._currentNode = node;\n while(curNode && curNode !== this.root)if (curNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const shadowRoot = curNode;\n const walker = this._doc.createTreeWalker(shadowRoot, this.whatToShow, {\n acceptNode: this._acceptNode\n });\n walkers.push(walker);\n walker.currentNode = currentWalkerCurrentNode;\n this._currentSetFor.add(walker);\n curNode = currentWalkerCurrentNode = shadowRoot.host;\n } else curNode = curNode.parentNode;\n const walker = this._doc.createTreeWalker(this.root, this.whatToShow, {\n acceptNode: this._acceptNode\n });\n walkers.push(walker);\n walker.currentNode = currentWalkerCurrentNode;\n this._currentSetFor.add(walker);\n this._walkerStack = walkers;\n }\n get doc() {\n return this._doc;\n }\n firstChild() {\n let currentNode = this.currentNode;\n let newNode = this.nextNode();\n if (!(0, $23f2114a1b82827e$export$4282f70798064fe0)(currentNode, newNode)) {\n this.currentNode = currentNode;\n return null;\n }\n if (newNode) this.currentNode = newNode;\n return newNode;\n }\n lastChild() {\n let walker = this._walkerStack[0];\n let newNode = walker.lastChild();\n if (newNode) this.currentNode = newNode;\n return newNode;\n }\n nextNode() {\n const nextNode = this._walkerStack[0].nextNode();\n if (nextNode) {\n const shadowRoot = nextNode.shadowRoot;\n if (shadowRoot) {\n let nodeResult;\n if (typeof this.filter === 'function') nodeResult = this.filter(nextNode);\n else if (this.filter?.acceptNode) nodeResult = this.filter.acceptNode(nextNode);\n if (nodeResult === NodeFilter.FILTER_ACCEPT) {\n this.currentNode = nextNode;\n return nextNode;\n }\n // _acceptNode should have added new walker for this shadow,\n // go in recursively.\n let newNode = this.nextNode();\n if (newNode) this.currentNode = newNode;\n return newNode;\n }\n if (nextNode) this.currentNode = nextNode;\n return nextNode;\n } else {\n if (this._walkerStack.length > 1) {\n this._walkerStack.shift();\n let newNode = this.nextNode();\n if (newNode) this.currentNode = newNode;\n return newNode;\n } else return null;\n }\n }\n previousNode() {\n const currentWalker = this._walkerStack[0];\n if (currentWalker.currentNode === currentWalker.root) {\n if (this._currentSetFor.has(currentWalker)) {\n this._currentSetFor.delete(currentWalker);\n if (this._walkerStack.length > 1) {\n this._walkerStack.shift();\n let newNode = this.previousNode();\n if (newNode) this.currentNode = newNode;\n return newNode;\n } else return null;\n }\n return null;\n }\n const previousNode = currentWalker.previousNode();\n if (previousNode) {\n const shadowRoot = previousNode.shadowRoot;\n if (shadowRoot) {\n let nodeResult;\n if (typeof this.filter === 'function') nodeResult = this.filter(previousNode);\n else if (this.filter?.acceptNode) nodeResult = this.filter.acceptNode(previousNode);\n if (nodeResult === NodeFilter.FILTER_ACCEPT) {\n if (previousNode) this.currentNode = previousNode;\n return previousNode;\n }\n // _acceptNode should have added new walker for this shadow,\n // go in recursively.\n let newNode = this.lastChild();\n if (newNode) this.currentNode = newNode;\n return newNode;\n }\n if (previousNode) this.currentNode = previousNode;\n return previousNode;\n } else {\n if (this._walkerStack.length > 1) {\n this._walkerStack.shift();\n let newNode = this.previousNode();\n if (newNode) this.currentNode = newNode;\n return newNode;\n } else return null;\n }\n }\n /**\n * @deprecated\n */ nextSibling() {\n // if (__DEV__) {\n // throw new Error(\"Method not implemented.\");\n // }\n return null;\n }\n /**\n * @deprecated\n */ previousSibling() {\n // if (__DEV__) {\n // throw new Error(\"Method not implemented.\");\n // }\n return null;\n }\n /**\n * @deprecated\n */ parentNode() {\n // if (__DEV__) {\n // throw new Error(\"Method not implemented.\");\n // }\n return null;\n }\n}\nfunction $654b97e09f2a30c1$export$4d0f8be8b12a7ef6(doc, root, whatToShow, filter) {\n if ((0, $kGVXB$shadowDOM)()) return new $654b97e09f2a30c1$export$63eb3ababa9c55c4(doc, root, whatToShow, filter);\n return doc.createTreeWalker(root, whatToShow, filter);\n}\n\n\nexport {$654b97e09f2a30c1$export$63eb3ababa9c55c4 as ShadowTreeWalker, $654b97e09f2a30c1$export$4d0f8be8b12a7ef6 as createShadowTreeWalker};\n//# sourceMappingURL=ShadowTreeWalker.mjs.map\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $1969ac565cfec8d0$export$de79e2c695e052f3(element) {\n if ($1969ac565cfec8d0$var$supportsPreventScroll()) element.focus({\n preventScroll: true\n });\n else {\n let scrollableElements = $1969ac565cfec8d0$var$getScrollableElements(element);\n element.focus();\n $1969ac565cfec8d0$var$restoreScrollPosition(scrollableElements);\n }\n}\nlet $1969ac565cfec8d0$var$supportsPreventScrollCached = null;\nfunction $1969ac565cfec8d0$var$supportsPreventScroll() {\n if ($1969ac565cfec8d0$var$supportsPreventScrollCached == null) {\n $1969ac565cfec8d0$var$supportsPreventScrollCached = false;\n try {\n let focusElem = document.createElement('div');\n focusElem.focus({\n get preventScroll () {\n $1969ac565cfec8d0$var$supportsPreventScrollCached = true;\n return true;\n }\n });\n } catch {\n // Ignore\n }\n }\n return $1969ac565cfec8d0$var$supportsPreventScrollCached;\n}\nfunction $1969ac565cfec8d0$var$getScrollableElements(element) {\n let parent = element.parentNode;\n let scrollableElements = [];\n let rootScrollingElement = document.scrollingElement || document.documentElement;\n while(parent instanceof HTMLElement && parent !== rootScrollingElement){\n if (parent.offsetHeight < parent.scrollHeight || parent.offsetWidth < parent.scrollWidth) scrollableElements.push({\n element: parent,\n scrollTop: parent.scrollTop,\n scrollLeft: parent.scrollLeft\n });\n parent = parent.parentNode;\n }\n if (rootScrollingElement instanceof HTMLElement) scrollableElements.push({\n element: rootScrollingElement,\n scrollTop: rootScrollingElement.scrollTop,\n scrollLeft: rootScrollingElement.scrollLeft\n });\n return scrollableElements;\n}\nfunction $1969ac565cfec8d0$var$restoreScrollPosition(scrollableElements) {\n for (let { element: element, scrollTop: scrollTop, scrollLeft: scrollLeft } of scrollableElements){\n element.scrollTop = scrollTop;\n element.scrollLeft = scrollLeft;\n }\n}\n\n\nexport {$1969ac565cfec8d0$export$de79e2c695e052f3 as focusWithoutScrolling};\n//# sourceMappingURL=focusWithoutScrolling.mjs.map\n","import {getOwnerWindow as $d447af545b77c9f1$export$f21a1ffae260145a} from \"./domHelpers.mjs\";\n\n/*\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nconst $ae77152785188400$var$supportsCheckVisibility = typeof Element !== 'undefined' && 'checkVisibility' in Element.prototype;\nfunction $ae77152785188400$var$isStyleVisible(element) {\n const windowObject = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(element);\n if (!(element instanceof windowObject.HTMLElement) && !(element instanceof windowObject.SVGElement)) return false;\n let { display: display, visibility: visibility } = element.style;\n let isVisible = display !== 'none' && visibility !== 'hidden' && visibility !== 'collapse';\n if (isVisible) {\n const { getComputedStyle: getComputedStyle } = element.ownerDocument.defaultView;\n let { display: computedDisplay, visibility: computedVisibility } = getComputedStyle(element);\n isVisible = computedDisplay !== 'none' && computedVisibility !== 'hidden' && computedVisibility !== 'collapse';\n }\n return isVisible;\n}\nfunction $ae77152785188400$var$isAttributeVisible(element, childElement) {\n return !element.hasAttribute('hidden') && // Ignore HiddenSelect when tree walking.\n !element.hasAttribute('data-react-aria-prevent-focus') && (element.nodeName === 'DETAILS' && childElement && childElement.nodeName !== 'SUMMARY' ? element.hasAttribute('open') : true);\n}\nfunction $ae77152785188400$export$e989c0fffaa6b27a(element, childElement) {\n if ($ae77152785188400$var$supportsCheckVisibility) return element.checkVisibility({\n visibilityProperty: true\n }) && !element.closest('[data-react-aria-prevent-focus]');\n return element.nodeName !== '#comment' && $ae77152785188400$var$isStyleVisible(element) && $ae77152785188400$var$isAttributeVisible(element, childElement) && (!element.parentElement || $ae77152785188400$export$e989c0fffaa6b27a(element.parentElement, element));\n}\n\n\nexport {$ae77152785188400$export$e989c0fffaa6b27a as isElementVisible};\n//# sourceMappingURL=isElementVisible.mjs.map\n","import {isElementVisible as $ae77152785188400$export$e989c0fffaa6b27a} from \"./isElementVisible.mjs\";\n\n/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nconst $3b8b240c1bf84ab9$var$focusableElements = [\n 'input:not([disabled]):not([type=hidden])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'a[href]',\n 'area[href]',\n 'summary',\n 'iframe',\n 'object',\n 'embed',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable^=\"false\"])',\n 'permission'\n];\nconst $3b8b240c1bf84ab9$var$FOCUSABLE_ELEMENT_SELECTOR = $3b8b240c1bf84ab9$var$focusableElements.join(':not([hidden]),') + ',[tabindex]:not([disabled]):not([hidden])';\n$3b8b240c1bf84ab9$var$focusableElements.push('[tabindex]:not([tabindex=\"-1\"]):not([disabled])');\nconst $3b8b240c1bf84ab9$var$TABBABLE_ELEMENT_SELECTOR = $3b8b240c1bf84ab9$var$focusableElements.join(':not([hidden]):not([tabindex=\"-1\"]),');\nfunction $3b8b240c1bf84ab9$export$4c063cf1350e6fed(element, options) {\n return element.matches($3b8b240c1bf84ab9$var$FOCUSABLE_ELEMENT_SELECTOR) && !$3b8b240c1bf84ab9$var$isInert(element) && (options?.skipVisibilityCheck || (0, $ae77152785188400$export$e989c0fffaa6b27a)(element));\n}\nfunction $3b8b240c1bf84ab9$export$bebd5a1431fec25d(element) {\n return element.matches($3b8b240c1bf84ab9$var$TABBABLE_ELEMENT_SELECTOR) && (0, $ae77152785188400$export$e989c0fffaa6b27a)(element) && !$3b8b240c1bf84ab9$var$isInert(element);\n}\nfunction $3b8b240c1bf84ab9$var$isInert(element) {\n let node = element;\n while(node != null){\n if (node instanceof node.ownerDocument.defaultView.HTMLElement && node.inert) return true;\n node = node.parentElement;\n }\n return false;\n}\n\n\nexport {$3b8b240c1bf84ab9$export$4c063cf1350e6fed as isFocusable, $3b8b240c1bf84ab9$export$bebd5a1431fec25d as isTabbable};\n//# sourceMappingURL=isFocusable.mjs.map\n","import $3ARPR$react from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nconst $c4867b2f328c2698$export$e5c5a5f917a5871c = typeof document !== 'undefined' ? (0, $3ARPR$react).useLayoutEffect : ()=>{};\n\n\nexport {$c4867b2f328c2698$export$e5c5a5f917a5871c as useLayoutEffect};\n//# sourceMappingURL=useLayoutEffect.mjs.map\n","import {focusWithoutScrolling as $1969ac565cfec8d0$export$de79e2c695e052f3} from \"../utils/focusWithoutScrolling.mjs\";\nimport {getActiveElement as $23f2114a1b82827e$export$cd4e5573fbe2b576, getEventTarget as $23f2114a1b82827e$export$e58f029f0fbfdb29} from \"../utils/shadowdom/DOMFunctions.mjs\";\nimport {getOwnerWindow as $d447af545b77c9f1$export$f21a1ffae260145a} from \"../utils/domHelpers.mjs\";\nimport {isFocusable as $3b8b240c1bf84ab9$export$4c063cf1350e6fed} from \"../utils/isFocusable.mjs\";\nimport {useLayoutEffect as $c4867b2f328c2698$export$e5c5a5f917a5871c} from \"../utils/useLayoutEffect.mjs\";\nimport {useRef as $lIB5W$useRef, useCallback as $lIB5W$useCallback} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\n\n\n\nfunction $a92dc41f639950be$export$525bc4921d56d4a(nativeEvent) {\n let event = nativeEvent;\n event.nativeEvent = nativeEvent;\n event.isDefaultPrevented = ()=>event.defaultPrevented;\n // cancelBubble is technically deprecated in the spec, but still supported in all browsers.\n event.isPropagationStopped = ()=>event.cancelBubble;\n event.persist = ()=>{};\n return event;\n}\nfunction $a92dc41f639950be$export$c2b7abe5d61ec696(event, target) {\n Object.defineProperty(event, 'target', {\n value: target\n });\n Object.defineProperty(event, 'currentTarget', {\n value: target\n });\n}\nfunction $a92dc41f639950be$export$715c682d09d639cc(onBlur) {\n let stateRef = (0, $lIB5W$useRef)({\n isFocused: false,\n observer: null\n });\n // Clean up MutationObserver on unmount. See below.\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n const state = stateRef.current;\n return ()=>{\n if (state.observer) {\n state.observer.disconnect();\n state.observer = null;\n }\n };\n }, []);\n // This function is called during a React onFocus event.\n return (0, $lIB5W$useCallback)((e)=>{\n // React does not fire onBlur when an element is disabled. https://github.com/facebook/react/issues/9142\n // Most browsers fire a native focusout event in this case, except for Firefox. In that case, we use a\n // MutationObserver to watch for the disabled attribute, and dispatch these events ourselves.\n // For browsers that do, focusout fires before the MutationObserver, so onBlur should not fire twice.\n let eventTarget = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n if (eventTarget instanceof HTMLButtonElement || eventTarget instanceof HTMLInputElement || eventTarget instanceof HTMLTextAreaElement || eventTarget instanceof HTMLSelectElement) {\n stateRef.current.isFocused = true;\n let target = eventTarget;\n let onBlurHandler = (e)=>{\n stateRef.current.isFocused = false;\n if (target.disabled) {\n // For backward compatibility, dispatch a (fake) React synthetic event.\n let event = $a92dc41f639950be$export$525bc4921d56d4a(e);\n onBlur?.(event);\n }\n // We no longer need the MutationObserver once the target is blurred.\n if (stateRef.current.observer) {\n stateRef.current.observer.disconnect();\n stateRef.current.observer = null;\n }\n };\n target.addEventListener('focusout', onBlurHandler, {\n once: true\n });\n stateRef.current.observer = new MutationObserver(()=>{\n if (stateRef.current.isFocused && target.disabled) {\n stateRef.current.observer?.disconnect();\n let relatedTargetEl = target === (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)() ? null : (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)();\n target.dispatchEvent(new FocusEvent('blur', {\n relatedTarget: relatedTargetEl\n }));\n target.dispatchEvent(new FocusEvent('focusout', {\n bubbles: true,\n relatedTarget: relatedTargetEl\n }));\n }\n });\n stateRef.current.observer.observe(target, {\n attributes: true,\n attributeFilter: [\n 'disabled'\n ]\n });\n }\n }, [\n onBlur\n ]);\n}\nlet $a92dc41f639950be$export$fda7da73ab5d4c48 = false;\nfunction $a92dc41f639950be$export$cabe61c495ee3649(target) {\n // The browser will focus the nearest focusable ancestor of our target.\n while(target && !(0, $3b8b240c1bf84ab9$export$4c063cf1350e6fed)(target, {\n skipVisibilityCheck: true\n }))target = target.parentElement;\n let window = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(target);\n let activeElement = window.document.activeElement;\n if (!activeElement || activeElement === target) return;\n $a92dc41f639950be$export$fda7da73ab5d4c48 = true;\n let isRefocusing = false;\n let onBlur = (e)=>{\n if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === activeElement || isRefocusing) e.stopImmediatePropagation();\n };\n let onFocusOut = (e)=>{\n if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === activeElement || isRefocusing) {\n e.stopImmediatePropagation();\n // If there was no focusable ancestor, we don't expect a focus event.\n // Re-focus the original active element here.\n if (!target && !isRefocusing) {\n isRefocusing = true;\n (0, $1969ac565cfec8d0$export$de79e2c695e052f3)(activeElement);\n cleanup();\n }\n }\n };\n let onFocus = (e)=>{\n if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === target || isRefocusing) e.stopImmediatePropagation();\n };\n let onFocusIn = (e)=>{\n if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === target || isRefocusing) {\n e.stopImmediatePropagation();\n if (!isRefocusing) {\n isRefocusing = true;\n (0, $1969ac565cfec8d0$export$de79e2c695e052f3)(activeElement);\n cleanup();\n }\n }\n };\n window.addEventListener('blur', onBlur, true);\n window.addEventListener('focusout', onFocusOut, true);\n window.addEventListener('focusin', onFocusIn, true);\n window.addEventListener('focus', onFocus, true);\n let cleanup = ()=>{\n cancelAnimationFrame(raf);\n window.removeEventListener('blur', onBlur, true);\n window.removeEventListener('focusout', onFocusOut, true);\n window.removeEventListener('focusin', onFocusIn, true);\n window.removeEventListener('focus', onFocus, true);\n $a92dc41f639950be$export$fda7da73ab5d4c48 = false;\n isRefocusing = false;\n };\n let raf = requestAnimationFrame(cleanup);\n return cleanup;\n}\n\n\nexport {$a92dc41f639950be$export$525bc4921d56d4a as createSyntheticEvent, $a92dc41f639950be$export$c2b7abe5d61ec696 as setEventTarget, $a92dc41f639950be$export$715c682d09d639cc as useSyntheticBlurEvent, $a92dc41f639950be$export$fda7da73ab5d4c48 as ignoreFocusEvent, $a92dc41f639950be$export$cabe61c495ee3649 as preventFocus};\n//# sourceMappingURL=utils.mjs.map\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $2add3ce32c6007eb$var$testUserAgent(re) {\n if (typeof window === 'undefined' || window.navigator == null) return false;\n let brands = window.navigator['userAgentData']?.brands;\n return Array.isArray(brands) && brands.some((brand)=>re.test(brand.brand)) || re.test(window.navigator.userAgent);\n}\nfunction $2add3ce32c6007eb$var$testPlatform(re) {\n return typeof window !== 'undefined' && window.navigator != null ? re.test(window.navigator['userAgentData']?.platform || window.navigator.platform) : false;\n}\nfunction $2add3ce32c6007eb$var$cached(fn) {\n if (process.env.NODE_ENV === 'test') return fn;\n let res = null;\n return ()=>{\n if (res == null) res = fn();\n return res;\n };\n}\nconst $2add3ce32c6007eb$export$9ac100e40613ea10 = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$var$testPlatform(/^Mac/i);\n});\nconst $2add3ce32c6007eb$export$186c6964ca17d99 = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$var$testPlatform(/^iPhone/i);\n});\nconst $2add3ce32c6007eb$export$7bef049ce92e4224 = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$var$testPlatform(/^iPad/i) || // iPadOS 13 lies and says it's a Mac, but we can distinguish by detecting touch support.\n $2add3ce32c6007eb$export$9ac100e40613ea10() && navigator.maxTouchPoints > 1;\n});\nconst $2add3ce32c6007eb$export$fedb369cb70207f1 = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$export$186c6964ca17d99() || $2add3ce32c6007eb$export$7bef049ce92e4224();\n});\nconst $2add3ce32c6007eb$export$e1865c3bedcd822b = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$export$9ac100e40613ea10() || $2add3ce32c6007eb$export$fedb369cb70207f1();\n});\nconst $2add3ce32c6007eb$export$78551043582a6a98 = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$var$testUserAgent(/AppleWebKit/i) && !$2add3ce32c6007eb$export$6446a186d09e379e();\n});\nconst $2add3ce32c6007eb$export$6446a186d09e379e = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$var$testUserAgent(/Chrome/i);\n});\nconst $2add3ce32c6007eb$export$a11b0059900ceec8 = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$var$testUserAgent(/Android/i);\n});\nconst $2add3ce32c6007eb$export$b7d78993b74f766d = $2add3ce32c6007eb$var$cached(function() {\n return $2add3ce32c6007eb$var$testUserAgent(/Firefox/i);\n});\n\n\nexport {$2add3ce32c6007eb$export$9ac100e40613ea10 as isMac, $2add3ce32c6007eb$export$186c6964ca17d99 as isIPhone, $2add3ce32c6007eb$export$7bef049ce92e4224 as isIPad, $2add3ce32c6007eb$export$fedb369cb70207f1 as isIOS, $2add3ce32c6007eb$export$e1865c3bedcd822b as isAppleDevice, $2add3ce32c6007eb$export$78551043582a6a98 as isWebKit, $2add3ce32c6007eb$export$6446a186d09e379e as isChrome, $2add3ce32c6007eb$export$a11b0059900ceec8 as isAndroid, $2add3ce32c6007eb$export$b7d78993b74f766d as isFirefox};\n//# sourceMappingURL=platform.mjs.map\n","import {isAndroid as $2add3ce32c6007eb$export$a11b0059900ceec8} from \"./platform.mjs\";\n\n/*\n * Copyright 2022 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $b5c62b033c25b96d$export$60278871457622de(event) {\n // JAWS/NVDA with Firefox.\n if (event.pointerType === '' && event.isTrusted) return true;\n // Android TalkBack's detail value varies depending on the event listener providing the event so we have specific logic here instead\n // If pointerType is defined, event is from a click listener. For events from mousedown listener, detail === 0 is a sufficient check\n // to detect TalkBack virtual clicks.\n if ((0, $2add3ce32c6007eb$export$a11b0059900ceec8)() && event.pointerType) return event.type === 'click' && event.buttons === 1;\n return event.detail === 0 && !event.pointerType;\n}\nfunction $b5c62b033c25b96d$export$29bf1b5f2c56cf63(event) {\n // If the pointer size is zero, then we assume it's from a screen reader.\n // Android TalkBack double tap will sometimes return a event with width and height of 1\n // and pointerType === 'mouse' so we need to check for a specific combination of event attributes.\n // Cannot use \"event.pressure === 0\" as the sole check due to Safari pointer events always returning pressure === 0\n // instead of .5, see https://bugs.webkit.org/show_bug.cgi?id=206216. event.pointerType === 'mouse' is to distingush\n // Talkback double tap from Windows Firefox touch screen press\n return !(0, $2add3ce32c6007eb$export$a11b0059900ceec8)() && event.width === 0 && event.height === 0 || event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse';\n}\n\n\nexport {$b5c62b033c25b96d$export$60278871457622de as isVirtualClick, $b5c62b033c25b96d$export$29bf1b5f2c56cf63 as isVirtualPointerEvent};\n//# sourceMappingURL=isVirtualEvent.mjs.map\n","import {focusWithoutScrolling as $1969ac565cfec8d0$export$de79e2c695e052f3} from \"./focusWithoutScrolling.mjs\";\nimport {isFirefox as $2add3ce32c6007eb$export$b7d78993b74f766d, isIPad as $2add3ce32c6007eb$export$7bef049ce92e4224, isMac as $2add3ce32c6007eb$export$9ac100e40613ea10, isWebKit as $2add3ce32c6007eb$export$78551043582a6a98} from \"./platform.mjs\";\nimport $epzQQ$react, {createContext as $epzQQ$createContext, useMemo as $epzQQ$useMemo, useContext as $epzQQ$useContext} from \"react\";\n\n/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nconst $caaf0dd3060ed57c$var$RouterContext = /*#__PURE__*/ (0, $epzQQ$createContext)({\n isNative: true,\n open: $caaf0dd3060ed57c$var$openSyntheticLink,\n useHref: (href)=>href\n});\nfunction $caaf0dd3060ed57c$export$323e4fc2fa4753fb(props) {\n let { children: children, navigate: navigate, useHref: useHref } = props;\n let ctx = (0, $epzQQ$useMemo)(()=>({\n isNative: false,\n open: (target, modifiers, href, routerOptions)=>{\n $caaf0dd3060ed57c$var$getSyntheticLink(target, (link)=>{\n if ($caaf0dd3060ed57c$export$efa8c9099e530235(link, modifiers)) navigate(href, routerOptions);\n else $caaf0dd3060ed57c$export$95185d699e05d4d7(link, modifiers);\n });\n },\n useHref: useHref || ((href)=>href)\n }), [\n navigate,\n useHref\n ]);\n return /*#__PURE__*/ (0, $epzQQ$react).createElement($caaf0dd3060ed57c$var$RouterContext.Provider, {\n value: ctx\n }, children);\n}\nfunction $caaf0dd3060ed57c$export$9a302a45f65d0572() {\n return (0, $epzQQ$useContext)($caaf0dd3060ed57c$var$RouterContext);\n}\nfunction $caaf0dd3060ed57c$export$efa8c9099e530235(link, modifiers) {\n // Use getAttribute here instead of link.target. Firefox will default link.target to \"_parent\" when inside an iframe.\n let target = link.getAttribute('target');\n return (!target || target === '_self') && link.origin === location.origin && !link.hasAttribute('download') && !modifiers.metaKey && // open in new tab (mac)\n !modifiers.ctrlKey && // open in new tab (windows)\n !modifiers.altKey && // download\n !modifiers.shiftKey;\n}\nfunction $caaf0dd3060ed57c$export$95185d699e05d4d7(target, modifiers, setOpening = true) {\n let { metaKey: metaKey, ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey } = modifiers;\n // Firefox does not recognize keyboard events as a user action by default, and the popup blocker\n // will prevent links with target=\"_blank\" from opening. However, it does allow the event if the\n // Command/Control key is held, which opens the link in a background tab. This seems like the best we can do.\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=257870 and https://bugzilla.mozilla.org/show_bug.cgi?id=746640.\n if ((0, $2add3ce32c6007eb$export$b7d78993b74f766d)() && window.event?.type?.startsWith('key') && target.target === '_blank') {\n if ((0, $2add3ce32c6007eb$export$9ac100e40613ea10)()) metaKey = true;\n else ctrlKey = true;\n }\n // WebKit does not support firing click events with modifier keys, but does support keyboard events.\n // https://github.com/WebKit/WebKit/blob/c03d0ac6e6db178f90923a0a63080b5ca210d25f/Source/WebCore/html/HTMLAnchorElement.cpp#L184\n let event = (0, $2add3ce32c6007eb$export$78551043582a6a98)() && (0, $2add3ce32c6007eb$export$9ac100e40613ea10)() && !(0, $2add3ce32c6007eb$export$7bef049ce92e4224)() && process.env.NODE_ENV !== 'test' ? new KeyboardEvent('keydown', {\n keyIdentifier: 'Enter',\n metaKey: metaKey,\n ctrlKey: ctrlKey,\n altKey: altKey,\n shiftKey: shiftKey\n }) : new MouseEvent('click', {\n metaKey: metaKey,\n ctrlKey: ctrlKey,\n altKey: altKey,\n shiftKey: shiftKey,\n detail: 1,\n bubbles: true,\n cancelable: true\n });\n $caaf0dd3060ed57c$export$95185d699e05d4d7.isOpening = setOpening;\n (0, $1969ac565cfec8d0$export$de79e2c695e052f3)(target);\n target.dispatchEvent(event);\n $caaf0dd3060ed57c$export$95185d699e05d4d7.isOpening = false;\n}\n// https://github.com/parcel-bundler/parcel/issues/8724\n$caaf0dd3060ed57c$export$95185d699e05d4d7.isOpening = false;\nfunction $caaf0dd3060ed57c$var$getSyntheticLink(target, open) {\n if (target instanceof HTMLAnchorElement) open(target);\n else if (target.hasAttribute('data-href')) {\n let link = document.createElement('a');\n link.href = target.getAttribute('data-href');\n if (target.hasAttribute('data-target')) link.target = target.getAttribute('data-target');\n if (target.hasAttribute('data-rel')) link.rel = target.getAttribute('data-rel');\n if (target.hasAttribute('data-download')) link.download = target.getAttribute('data-download');\n if (target.hasAttribute('data-ping')) link.ping = target.getAttribute('data-ping');\n if (target.hasAttribute('data-referrer-policy')) link.referrerPolicy = target.getAttribute('data-referrer-policy');\n target.appendChild(link);\n open(link);\n target.removeChild(link);\n }\n}\nfunction $caaf0dd3060ed57c$var$openSyntheticLink(target, modifiers) {\n $caaf0dd3060ed57c$var$getSyntheticLink(target, (link)=>$caaf0dd3060ed57c$export$95185d699e05d4d7(link, modifiers));\n}\nfunction $caaf0dd3060ed57c$export$bdc77b0c0a3a85d6(props) {\n let router = $caaf0dd3060ed57c$export$9a302a45f65d0572();\n const href = router.useHref(props.href ?? '');\n return {\n 'data-href': props.href ? href : undefined,\n 'data-target': props.target,\n 'data-rel': props.rel,\n 'data-download': props.download,\n 'data-ping': props.ping,\n 'data-referrer-policy': props.referrerPolicy\n };\n}\nfunction $caaf0dd3060ed57c$export$51437d503373d223(props) {\n return {\n 'data-href': props.href,\n 'data-target': props.target,\n 'data-rel': props.rel,\n 'data-download': props.download,\n 'data-ping': props.ping,\n 'data-referrer-policy': props.referrerPolicy\n };\n}\nfunction $caaf0dd3060ed57c$export$7e924b3091a3bd18(props) {\n let router = $caaf0dd3060ed57c$export$9a302a45f65d0572();\n const href = router.useHref(props?.href ?? '');\n return {\n href: props?.href ? href : undefined,\n target: props?.target,\n rel: props?.rel,\n download: props?.download,\n ping: props?.ping,\n referrerPolicy: props?.referrerPolicy\n };\n}\nfunction $caaf0dd3060ed57c$export$13aea1a3cb5e3f1f(e, router, href, routerOptions) {\n // If a custom router is provided, prevent default and forward if this link should client navigate.\n if (!router.isNative && e.currentTarget instanceof HTMLAnchorElement && e.currentTarget.href && // If props are applied to a router Link component, it may have already prevented default.\n !e.isDefaultPrevented() && $caaf0dd3060ed57c$export$efa8c9099e530235(e.currentTarget, e) && href) {\n e.preventDefault();\n router.open(e.currentTarget, e, href, routerOptions);\n }\n}\n\n\nexport {$caaf0dd3060ed57c$export$323e4fc2fa4753fb as RouterProvider, $caaf0dd3060ed57c$export$efa8c9099e530235 as shouldClientNavigate, $caaf0dd3060ed57c$export$95185d699e05d4d7 as openLink, $caaf0dd3060ed57c$export$9a302a45f65d0572 as useRouter, $caaf0dd3060ed57c$export$bdc77b0c0a3a85d6 as useSyntheticLinkProps, $caaf0dd3060ed57c$export$51437d503373d223 as getSyntheticLinkProps, $caaf0dd3060ed57c$export$7e924b3091a3bd18 as useLinkProps, $caaf0dd3060ed57c$export$13aea1a3cb5e3f1f as handleLinkClick};\n//# sourceMappingURL=openLink.mjs.map\n","import {getActiveElement as $23f2114a1b82827e$export$cd4e5573fbe2b576, getEventTarget as $23f2114a1b82827e$export$e58f029f0fbfdb29} from \"../utils/shadowdom/DOMFunctions.mjs\";\nimport {getOwnerDocument as $d447af545b77c9f1$export$b204af158042fbac, getOwnerWindow as $d447af545b77c9f1$export$f21a1ffae260145a} from \"../utils/domHelpers.mjs\";\nimport {ignoreFocusEvent as $a92dc41f639950be$export$fda7da73ab5d4c48} from \"./utils.mjs\";\nimport {isMac as $2add3ce32c6007eb$export$9ac100e40613ea10} from \"../utils/platform.mjs\";\nimport {isVirtualClick as $b5c62b033c25b96d$export$60278871457622de} from \"../utils/isVirtualEvent.mjs\";\nimport {openLink as $caaf0dd3060ed57c$export$95185d699e05d4d7} from \"../utils/openLink.mjs\";\nimport {useIsSSR as $c7eafbbe1ea5834e$export$535bd6ca7f90a273} from \"../ssr/SSRProvider.mjs\";\nimport {useState as $7U4qw$useState, useEffect as $7U4qw$useEffect} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\n\n\n\n\n\n\nlet $8f5a2122b0992be3$var$currentModality = null;\nlet $8f5a2122b0992be3$var$currentPointerType = 'keyboard';\nconst $8f5a2122b0992be3$export$901e90a13c50a14e = new Set();\nlet $8f5a2122b0992be3$export$d90243b58daecda7 = new Map(); // We use a map here to support setting event listeners across multiple document objects.\nlet $8f5a2122b0992be3$var$hasEventBeforeFocus = false;\nlet $8f5a2122b0992be3$var$hasBlurredWindowRecently = false;\n// Only Tab or Esc keys will make focus visible on text input elements\nconst $8f5a2122b0992be3$var$FOCUS_VISIBLE_INPUT_KEYS = {\n Tab: true,\n Escape: true\n};\nfunction $8f5a2122b0992be3$var$triggerChangeHandlers(modality, e) {\n for (let handler of $8f5a2122b0992be3$export$901e90a13c50a14e)handler(modality, e);\n}\n/**\n * Helper function to determine if a KeyboardEvent is unmodified and could make keyboard focus styles visible.\n */ function $8f5a2122b0992be3$var$isValidKey(e) {\n // Control and Shift keys trigger when navigating back to the tab with keyboard.\n return !(e.metaKey || !(0, $2add3ce32c6007eb$export$9ac100e40613ea10)() && e.altKey || e.ctrlKey || e.key === 'Control' || e.key === 'Shift' || e.key === 'Meta');\n}\nfunction $8f5a2122b0992be3$var$handleKeyboardEvent(e) {\n $8f5a2122b0992be3$var$hasEventBeforeFocus = true;\n if (!(0, $caaf0dd3060ed57c$export$95185d699e05d4d7).isOpening && $8f5a2122b0992be3$var$isValidKey(e)) {\n $8f5a2122b0992be3$var$currentModality = 'keyboard';\n $8f5a2122b0992be3$var$currentPointerType = 'keyboard';\n $8f5a2122b0992be3$var$triggerChangeHandlers('keyboard', e);\n }\n}\nfunction $8f5a2122b0992be3$var$handlePointerEvent(e) {\n $8f5a2122b0992be3$var$currentModality = 'pointer';\n $8f5a2122b0992be3$var$currentPointerType = 'pointerType' in e ? e.pointerType : 'mouse';\n if (e.type === 'mousedown' || e.type === 'pointerdown') {\n $8f5a2122b0992be3$var$hasEventBeforeFocus = true;\n $8f5a2122b0992be3$var$triggerChangeHandlers('pointer', e);\n }\n}\nfunction $8f5a2122b0992be3$var$handleClickEvent(e) {\n if (!(0, $caaf0dd3060ed57c$export$95185d699e05d4d7).isOpening && (0, $b5c62b033c25b96d$export$60278871457622de)(e)) {\n $8f5a2122b0992be3$var$hasEventBeforeFocus = true;\n $8f5a2122b0992be3$var$currentModality = 'virtual';\n $8f5a2122b0992be3$var$currentPointerType = 'virtual';\n }\n}\nfunction $8f5a2122b0992be3$var$handleFocusEvent(e) {\n // Firefox fires two extra focus events when the user first clicks into an iframe:\n // first on the window, then on the document. We ignore these events so they don't\n // cause keyboard focus rings to appear.\n let ownerWindow = (0, $d447af545b77c9f1$export$f21a1ffae260145a)((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e));\n let ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e));\n if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === ownerWindow || (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === ownerDocument || (0, $a92dc41f639950be$export$fda7da73ab5d4c48) || !e.isTrusted) return;\n // If a focus event occurs without a preceding keyboard or pointer event, switch to virtual modality.\n // This occurs, for example, when navigating a form with the next/previous buttons on iOS.\n if (!$8f5a2122b0992be3$var$hasEventBeforeFocus && !$8f5a2122b0992be3$var$hasBlurredWindowRecently) {\n $8f5a2122b0992be3$var$currentModality = 'virtual';\n $8f5a2122b0992be3$var$currentPointerType = 'virtual';\n $8f5a2122b0992be3$var$triggerChangeHandlers('virtual', e);\n }\n $8f5a2122b0992be3$var$hasEventBeforeFocus = false;\n $8f5a2122b0992be3$var$hasBlurredWindowRecently = false;\n}\nfunction $8f5a2122b0992be3$var$handleWindowBlur() {\n if (0, $a92dc41f639950be$export$fda7da73ab5d4c48) return;\n // When the window is blurred, reset state. This is necessary when tabbing out of the window,\n // for example, since a subsequent focus event won't be fired.\n $8f5a2122b0992be3$var$hasEventBeforeFocus = false;\n $8f5a2122b0992be3$var$hasBlurredWindowRecently = true;\n}\n/**\n * Setup global event listeners to control when keyboard focus style should be visible.\n */ function $8f5a2122b0992be3$var$setupGlobalFocusEvents(element) {\n // eslint-disable-next-line no-restricted-globals\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n const windowObject = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(element);\n const documentObject = (0, $d447af545b77c9f1$export$b204af158042fbac)(element);\n if ($8f5a2122b0992be3$export$d90243b58daecda7.get(windowObject)) return;\n // Programmatic focus() calls shouldn't affect the current input modality.\n // However, we need to detect other cases when a focus event occurs without\n // a preceding user event (e.g. screen reader focus). Overriding the focus\n // method on HTMLElement.prototype is a bit hacky, but works.\n let focus = windowObject.HTMLElement.prototype.focus;\n windowObject.HTMLElement.prototype.focus = function() {\n $8f5a2122b0992be3$var$hasEventBeforeFocus = true;\n focus.apply(this, arguments);\n };\n documentObject.addEventListener('keydown', $8f5a2122b0992be3$var$handleKeyboardEvent, true);\n documentObject.addEventListener('keyup', $8f5a2122b0992be3$var$handleKeyboardEvent, true);\n documentObject.addEventListener('click', $8f5a2122b0992be3$var$handleClickEvent, true);\n // Register focus events on the window so they are sure to happen\n // before React's event listeners (registered on the document).\n windowObject.addEventListener('focus', $8f5a2122b0992be3$var$handleFocusEvent, true);\n windowObject.addEventListener('blur', $8f5a2122b0992be3$var$handleWindowBlur, false);\n if (typeof PointerEvent !== 'undefined') {\n documentObject.addEventListener('pointerdown', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.addEventListener('pointermove', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.addEventListener('pointerup', $8f5a2122b0992be3$var$handlePointerEvent, true);\n } else if (process.env.NODE_ENV === 'test') {\n documentObject.addEventListener('mousedown', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.addEventListener('mousemove', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.addEventListener('mouseup', $8f5a2122b0992be3$var$handlePointerEvent, true);\n }\n // Add unmount handler\n windowObject.addEventListener('beforeunload', ()=>{\n $8f5a2122b0992be3$var$tearDownWindowFocusTracking(element);\n }, {\n once: true\n });\n $8f5a2122b0992be3$export$d90243b58daecda7.set(windowObject, {\n focus: focus\n });\n}\nconst $8f5a2122b0992be3$var$tearDownWindowFocusTracking = (element, loadListener)=>{\n const windowObject = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(element);\n const documentObject = (0, $d447af545b77c9f1$export$b204af158042fbac)(element);\n if (loadListener) documentObject.removeEventListener('DOMContentLoaded', loadListener);\n if (!$8f5a2122b0992be3$export$d90243b58daecda7.has(windowObject)) return;\n windowObject.HTMLElement.prototype.focus = $8f5a2122b0992be3$export$d90243b58daecda7.get(windowObject).focus;\n documentObject.removeEventListener('keydown', $8f5a2122b0992be3$var$handleKeyboardEvent, true);\n documentObject.removeEventListener('keyup', $8f5a2122b0992be3$var$handleKeyboardEvent, true);\n documentObject.removeEventListener('click', $8f5a2122b0992be3$var$handleClickEvent, true);\n windowObject.removeEventListener('focus', $8f5a2122b0992be3$var$handleFocusEvent, true);\n windowObject.removeEventListener('blur', $8f5a2122b0992be3$var$handleWindowBlur, false);\n if (typeof PointerEvent !== 'undefined') {\n documentObject.removeEventListener('pointerdown', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.removeEventListener('pointermove', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.removeEventListener('pointerup', $8f5a2122b0992be3$var$handlePointerEvent, true);\n } else if (process.env.NODE_ENV === 'test') {\n documentObject.removeEventListener('mousedown', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.removeEventListener('mousemove', $8f5a2122b0992be3$var$handlePointerEvent, true);\n documentObject.removeEventListener('mouseup', $8f5a2122b0992be3$var$handlePointerEvent, true);\n }\n $8f5a2122b0992be3$export$d90243b58daecda7.delete(windowObject);\n};\nfunction $8f5a2122b0992be3$export$2f1888112f558a7d(element) {\n const documentObject = (0, $d447af545b77c9f1$export$b204af158042fbac)(element);\n let loadListener;\n if (documentObject.readyState !== 'loading') $8f5a2122b0992be3$var$setupGlobalFocusEvents(element);\n else {\n loadListener = ()=>{\n $8f5a2122b0992be3$var$setupGlobalFocusEvents(element);\n };\n documentObject.addEventListener('DOMContentLoaded', loadListener);\n }\n return ()=>$8f5a2122b0992be3$var$tearDownWindowFocusTracking(element, loadListener);\n}\n// Server-side rendering does not have the document object defined\n// eslint-disable-next-line no-restricted-globals\nif (typeof document !== 'undefined') $8f5a2122b0992be3$export$2f1888112f558a7d();\nfunction $8f5a2122b0992be3$export$b9b3dfddab17db27() {\n return $8f5a2122b0992be3$var$currentModality !== 'pointer';\n}\nfunction $8f5a2122b0992be3$export$630ff653c5ada6a9() {\n return $8f5a2122b0992be3$var$currentModality;\n}\nfunction $8f5a2122b0992be3$export$8397ddfc504fdb9a(modality) {\n $8f5a2122b0992be3$var$currentModality = modality;\n $8f5a2122b0992be3$var$currentPointerType = modality === 'pointer' ? 'mouse' : modality;\n $8f5a2122b0992be3$var$triggerChangeHandlers(modality, null);\n}\nfunction $8f5a2122b0992be3$export$887a228355cf7d95() {\n return $8f5a2122b0992be3$var$currentPointerType;\n}\nfunction $8f5a2122b0992be3$export$98e20ec92f614cfe() {\n $8f5a2122b0992be3$var$setupGlobalFocusEvents();\n let [modality, setModality] = (0, $7U4qw$useState)($8f5a2122b0992be3$var$currentModality);\n (0, $7U4qw$useEffect)(()=>{\n let handler = ()=>{\n setModality($8f5a2122b0992be3$var$currentModality);\n };\n $8f5a2122b0992be3$export$901e90a13c50a14e.add(handler);\n return ()=>{\n $8f5a2122b0992be3$export$901e90a13c50a14e.delete(handler);\n };\n }, []);\n return (0, $c7eafbbe1ea5834e$export$535bd6ca7f90a273)() ? null : modality;\n}\nconst $8f5a2122b0992be3$var$nonTextInputTypes = new Set([\n 'checkbox',\n 'radio',\n 'range',\n 'color',\n 'file',\n 'image',\n 'button',\n 'submit',\n 'reset'\n]);\n/**\n * If this is attached to text input component, return if the event is a focus event (Tab/Escape keys pressed) so that\n * focus visible style can be properly set.\n */ function $8f5a2122b0992be3$var$isKeyboardFocusEvent(isTextInput, modality, e) {\n let eventTarget = e ? (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) : undefined;\n let document1 = (0, $d447af545b77c9f1$export$b204af158042fbac)(eventTarget);\n let ownerWindow = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(eventTarget);\n const IHTMLInputElement = typeof ownerWindow !== 'undefined' ? ownerWindow.HTMLInputElement : HTMLInputElement;\n const IHTMLTextAreaElement = typeof ownerWindow !== 'undefined' ? ownerWindow.HTMLTextAreaElement : HTMLTextAreaElement;\n const IHTMLElement = typeof ownerWindow !== 'undefined' ? ownerWindow.HTMLElement : HTMLElement;\n const IKeyboardEvent = typeof ownerWindow !== 'undefined' ? ownerWindow.KeyboardEvent : KeyboardEvent;\n // For keyboard events that occur on a non-input element that will move focus into input element (aka ArrowLeft going from Datepicker button to the main input group)\n // we need to rely on the user passing isTextInput into here. This way we can skip toggling focus visiblity for said input element\n let activeElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(document1);\n isTextInput = isTextInput || activeElement instanceof IHTMLInputElement && !$8f5a2122b0992be3$var$nonTextInputTypes.has(activeElement.type) || activeElement instanceof IHTMLTextAreaElement || activeElement instanceof IHTMLElement && activeElement.isContentEditable;\n return !(isTextInput && modality === 'keyboard' && e instanceof IKeyboardEvent && !$8f5a2122b0992be3$var$FOCUS_VISIBLE_INPUT_KEYS[e.key]);\n}\nfunction $8f5a2122b0992be3$export$ffd9e5021c1fb2d6(props = {}) {\n let { isTextInput: isTextInput, autoFocus: autoFocus } = props;\n let [isFocusVisibleState, setFocusVisible] = (0, $7U4qw$useState)(autoFocus || $8f5a2122b0992be3$export$b9b3dfddab17db27());\n $8f5a2122b0992be3$export$ec71b4b83ac08ec3((isFocusVisible)=>{\n setFocusVisible(isFocusVisible);\n }, [\n isTextInput\n ], {\n isTextInput: isTextInput\n });\n return {\n isFocusVisible: isFocusVisibleState\n };\n}\nfunction $8f5a2122b0992be3$export$ec71b4b83ac08ec3(fn, deps, opts) {\n $8f5a2122b0992be3$var$setupGlobalFocusEvents();\n (0, $7U4qw$useEffect)(()=>{\n if (opts?.enabled === false) return;\n let handler = (modality, e)=>{\n // We want to early return for any keyboard events that occur inside text inputs EXCEPT for Tab and Escape\n if (!$8f5a2122b0992be3$var$isKeyboardFocusEvent(!!opts?.isTextInput, modality, e)) return;\n fn($8f5a2122b0992be3$export$b9b3dfddab17db27());\n };\n $8f5a2122b0992be3$export$901e90a13c50a14e.add(handler);\n return ()=>{\n $8f5a2122b0992be3$export$901e90a13c50a14e.delete(handler);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n\n\nexport {$8f5a2122b0992be3$export$901e90a13c50a14e as changeHandlers, $8f5a2122b0992be3$export$d90243b58daecda7 as hasSetupGlobalListeners, $8f5a2122b0992be3$export$2f1888112f558a7d as addWindowFocusTracking, $8f5a2122b0992be3$export$b9b3dfddab17db27 as isFocusVisible, $8f5a2122b0992be3$export$630ff653c5ada6a9 as getInteractionModality, $8f5a2122b0992be3$export$8397ddfc504fdb9a as setInteractionModality, $8f5a2122b0992be3$export$887a228355cf7d95 as getPointerType, $8f5a2122b0992be3$export$98e20ec92f614cfe as useInteractionModality, $8f5a2122b0992be3$export$ffd9e5021c1fb2d6 as useFocusVisible, $8f5a2122b0992be3$export$ec71b4b83ac08ec3 as useFocusVisibleListener};\n//# sourceMappingURL=useFocusVisible.mjs.map\n","import {getEventTarget as $23f2114a1b82827e$export$e58f029f0fbfdb29} from \"./shadowdom/DOMFunctions.mjs\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // We store a global list of elements that are currently transitioning,\n// mapped to a set of CSS properties that are transitioning for that element.\n// This is necessary rather than a simple count of transitions because of browser\n// bugs, e.g. Chrome sometimes fires both transitionend and transitioncancel rather\n// than one or the other. So we need to track what's actually transitioning so that\n// we can ignore these duplicate events.\n\nlet $081cb5757e08788e$var$transitionsByElement = new Map();\n// A list of callbacks to call once there are no transitioning elements.\nlet $081cb5757e08788e$var$transitionCallbacks = new Set();\nfunction $081cb5757e08788e$var$setupGlobalEvents() {\n if (typeof window === 'undefined') return;\n function isTransitionEvent(event) {\n return 'propertyName' in event;\n }\n let onTransitionStart = (e)=>{\n let eventTarget = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n if (!isTransitionEvent(e) || !eventTarget) return;\n // Add the transitioning property to the list for this element.\n let transitions = $081cb5757e08788e$var$transitionsByElement.get(eventTarget);\n if (!transitions) {\n transitions = new Set();\n $081cb5757e08788e$var$transitionsByElement.set(eventTarget, transitions);\n // The transitioncancel event must be registered on the element itself, rather than as a global\n // event. This enables us to handle when the node is deleted from the document while it is transitioning.\n // In that case, the cancel event would have nowhere to bubble to so we need to handle it directly.\n eventTarget.addEventListener('transitioncancel', onTransitionEnd, {\n once: true\n });\n }\n transitions.add(e.propertyName);\n };\n let onTransitionEnd = (e)=>{\n let eventTarget = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n if (!isTransitionEvent(e) || !eventTarget) return;\n // Remove property from list of transitioning properties.\n let properties = $081cb5757e08788e$var$transitionsByElement.get(eventTarget);\n if (!properties) return;\n properties.delete(e.propertyName);\n // If empty, remove transitioncancel event, and remove the element from the list of transitioning elements.\n if (properties.size === 0) {\n eventTarget.removeEventListener('transitioncancel', onTransitionEnd);\n $081cb5757e08788e$var$transitionsByElement.delete(eventTarget);\n }\n // If no transitioning elements, call all of the queued callbacks.\n if ($081cb5757e08788e$var$transitionsByElement.size === 0) {\n for (let cb of $081cb5757e08788e$var$transitionCallbacks)cb();\n $081cb5757e08788e$var$transitionCallbacks.clear();\n }\n };\n document.body.addEventListener('transitionrun', onTransitionStart);\n document.body.addEventListener('transitionend', onTransitionEnd);\n}\nif (typeof document !== 'undefined') {\n if (document.readyState !== 'loading') $081cb5757e08788e$var$setupGlobalEvents();\n else document.addEventListener('DOMContentLoaded', $081cb5757e08788e$var$setupGlobalEvents);\n}\n/**\n * Cleans up any elements that are no longer in the document.\n * This is necessary because we can't rely on transitionend events to fire\n * for elements that are removed from the document while transitioning.\n */ function $081cb5757e08788e$var$cleanupDetachedElements() {\n for (const [eventTarget] of $081cb5757e08788e$var$transitionsByElement)// Similar to `eventTarget instanceof Element && !eventTarget.isConnected`, but avoids\n // the explicit instanceof check, since it may be different in different contexts.\n if ('isConnected' in eventTarget && !eventTarget.isConnected) $081cb5757e08788e$var$transitionsByElement.delete(eventTarget);\n}\nfunction $081cb5757e08788e$export$24490316f764c430(fn) {\n // Wait one frame to see if an animation starts, e.g. a transition on mount.\n requestAnimationFrame(()=>{\n $081cb5757e08788e$var$cleanupDetachedElements();\n // If no transitions are running, call the function immediately.\n // Otherwise, add it to a list of callbacks to run at the end of the animation.\n if ($081cb5757e08788e$var$transitionsByElement.size === 0) fn();\n else $081cb5757e08788e$var$transitionCallbacks.add(fn);\n });\n}\n\n\nexport {$081cb5757e08788e$export$24490316f764c430 as runAfterTransition};\n//# sourceMappingURL=runAfterTransition.mjs.map\n","import {focusWithoutScrolling as $1969ac565cfec8d0$export$de79e2c695e052f3} from \"../utils/focusWithoutScrolling.mjs\";\nimport {getActiveElement as $23f2114a1b82827e$export$cd4e5573fbe2b576} from \"../utils/shadowdom/DOMFunctions.mjs\";\nimport {getInteractionModality as $8f5a2122b0992be3$export$630ff653c5ada6a9} from \"./useFocusVisible.mjs\";\nimport {getOwnerDocument as $d447af545b77c9f1$export$b204af158042fbac} from \"../utils/domHelpers.mjs\";\nimport {runAfterTransition as $081cb5757e08788e$export$24490316f764c430} from \"../utils/runAfterTransition.mjs\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\n\n\nfunction $f192c2f16961cbe0$export$80f3e147d781571c(element) {\n if (!element.isConnected) return;\n // If the user is interacting with a virtual cursor, e.g. screen reader, then\n // wait until after any animated transitions that are currently occurring on\n // the page before shifting focus. This avoids issues with VoiceOver on iOS\n // causing the page to scroll when moving focus if the element is transitioning\n // from off the screen.\n const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(element);\n if ((0, $8f5a2122b0992be3$export$630ff653c5ada6a9)() === 'virtual') {\n let lastFocusedElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument);\n (0, $081cb5757e08788e$export$24490316f764c430)(()=>{\n const activeElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument);\n // If focus did not move or focus was lost to the body, and the element is still in the document, focus it.\n if ((activeElement === lastFocusedElement || activeElement === ownerDocument.body) && element.isConnected) (0, $1969ac565cfec8d0$export$de79e2c695e052f3)(element);\n });\n } else (0, $1969ac565cfec8d0$export$de79e2c695e052f3)(element);\n}\n\n\nexport {$f192c2f16961cbe0$export$80f3e147d781571c as focusSafely};\n//# sourceMappingURL=focusSafely.mjs.map\n","import {createShadowTreeWalker as $654b97e09f2a30c1$export$4d0f8be8b12a7ef6} from \"../utils/shadowdom/ShadowTreeWalker.mjs\";\nimport {focusSafely as $f192c2f16961cbe0$export$80f3e147d781571c} from \"../interactions/focusSafely.mjs\";\nimport {getActiveElement as $23f2114a1b82827e$export$cd4e5573fbe2b576, getEventTarget as $23f2114a1b82827e$export$e58f029f0fbfdb29, nodeContains as $23f2114a1b82827e$export$4282f70798064fe0} from \"../utils/shadowdom/DOMFunctions.mjs\";\nimport {getInteractionModality as $8f5a2122b0992be3$export$630ff653c5ada6a9} from \"../interactions/useFocusVisible.mjs\";\nimport {getOwnerDocument as $d447af545b77c9f1$export$b204af158042fbac, getOwnerWindow as $d447af545b77c9f1$export$f21a1ffae260145a} from \"../utils/domHelpers.mjs\";\nimport {isAndroid as $2add3ce32c6007eb$export$a11b0059900ceec8, isChrome as $2add3ce32c6007eb$export$6446a186d09e379e} from \"../utils/platform.mjs\";\nimport {isFocusable as $3b8b240c1bf84ab9$export$4c063cf1350e6fed, isTabbable as $3b8b240c1bf84ab9$export$bebd5a1431fec25d} from \"../utils/isFocusable.mjs\";\nimport {useLayoutEffect as $c4867b2f328c2698$export$e5c5a5f917a5871c} from \"../utils/useLayoutEffect.mjs\";\nimport $jmfRy$react, {useRef as $jmfRy$useRef, useContext as $jmfRy$useContext, useMemo as $jmfRy$useMemo, useEffect as $jmfRy$useEffect} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\n\n\n\n\n\n\nconst $535772f9d2c1f38d$var$FocusContext = /*#__PURE__*/ (0, $jmfRy$react).createContext(null);\nconst $535772f9d2c1f38d$var$RESTORE_FOCUS_EVENT = 'react-aria-focus-scope-restore';\nlet $535772f9d2c1f38d$var$activeScope = null;\nfunction $535772f9d2c1f38d$export$20e40289641fbbb6(props) {\n let { children: children, contain: contain, restoreFocus: restoreFocus, autoFocus: autoFocus } = props;\n let startRef = (0, $jmfRy$useRef)(null);\n let endRef = (0, $jmfRy$useRef)(null);\n let scopeRef = (0, $jmfRy$useRef)([]);\n let { parentNode: parentNode } = (0, $jmfRy$useContext)($535772f9d2c1f38d$var$FocusContext) || {};\n // Create a tree node here so we can add children to it even before it is added to the tree.\n let node = (0, $jmfRy$useMemo)(()=>new $535772f9d2c1f38d$var$TreeNode({\n scopeRef: scopeRef\n }), [\n scopeRef\n ]);\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n // If a new scope mounts outside the active scope, (e.g. DialogContainer launched from a menu),\n // use the active scope as the parent instead of the parent from context. Layout effects run bottom\n // up, so if the parent is not yet added to the tree, don't do this. Only the outer-most FocusScope\n // that is being added should get the activeScope as its parent.\n let parent = parentNode || $535772f9d2c1f38d$export$d06fae2ee68b101e.root;\n if ($535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(parent.scopeRef) && $535772f9d2c1f38d$var$activeScope && !$535772f9d2c1f38d$var$isAncestorScope($535772f9d2c1f38d$var$activeScope, parent.scopeRef)) {\n let activeNode = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode($535772f9d2c1f38d$var$activeScope);\n if (activeNode) parent = activeNode;\n }\n // Add the node to the parent, and to the tree.\n parent.addChild(node);\n $535772f9d2c1f38d$export$d06fae2ee68b101e.addNode(node);\n }, [\n node,\n parentNode\n ]);\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n let node = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scopeRef);\n if (node) node.contain = !!contain;\n }, [\n contain\n ]);\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n // Find all rendered nodes between the sentinels and add them to the scope.\n let node = startRef.current?.nextSibling;\n let nodes = [];\n let stopPropagation = (e)=>e.stopPropagation();\n while(node && node !== endRef.current){\n nodes.push(node);\n // Stop custom restore focus event from propagating to parent focus scopes.\n node.addEventListener($535772f9d2c1f38d$var$RESTORE_FOCUS_EVENT, stopPropagation);\n node = node.nextSibling;\n }\n scopeRef.current = nodes;\n return ()=>{\n for (let node of nodes)node.removeEventListener($535772f9d2c1f38d$var$RESTORE_FOCUS_EVENT, stopPropagation);\n };\n }, [\n children\n ]);\n $535772f9d2c1f38d$var$useActiveScopeTracker(scopeRef, restoreFocus, contain);\n $535772f9d2c1f38d$var$useFocusContainment(scopeRef, contain);\n $535772f9d2c1f38d$var$useRestoreFocus(scopeRef, restoreFocus, contain);\n $535772f9d2c1f38d$var$useAutoFocus(scopeRef, autoFocus);\n // This needs to be an effect so that activeScope is updated after the FocusScope tree is complete.\n // It cannot be a useLayoutEffect because the parent of this node hasn't been attached in the tree yet.\n (0, $jmfRy$useEffect)(()=>{\n const activeElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)((0, $d447af545b77c9f1$export$b204af158042fbac)(scopeRef.current ? scopeRef.current[0] : undefined));\n let scope = null;\n if ($535772f9d2c1f38d$var$isElementInScope(activeElement, scopeRef.current)) {\n // We need to traverse the focusScope tree and find the bottom most scope that\n // contains the active element and set that as the activeScope.\n for (let node of $535772f9d2c1f38d$export$d06fae2ee68b101e.traverse())if (node.scopeRef && $535772f9d2c1f38d$var$isElementInScope(activeElement, node.scopeRef.current)) scope = node;\n if (scope === $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scopeRef)) $535772f9d2c1f38d$var$activeScope = scope.scopeRef;\n }\n }, [\n scopeRef\n ]);\n // This layout effect cleanup is so that the tree node is removed synchronously with react before the RAF\n // in useRestoreFocus cleanup runs.\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n return ()=>{\n // Scope may have been re-parented.\n let parentScope = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scopeRef)?.parent?.scopeRef ?? null;\n if ((scopeRef === $535772f9d2c1f38d$var$activeScope || $535772f9d2c1f38d$var$isAncestorScope(scopeRef, $535772f9d2c1f38d$var$activeScope)) && (!parentScope || $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(parentScope))) $535772f9d2c1f38d$var$activeScope = parentScope;\n $535772f9d2c1f38d$export$d06fae2ee68b101e.removeTreeNode(scopeRef);\n };\n }, [\n scopeRef\n ]);\n let focusManager = (0, $jmfRy$useMemo)(()=>$535772f9d2c1f38d$var$createFocusManagerForScope(scopeRef), []);\n let value = (0, $jmfRy$useMemo)(()=>({\n focusManager: focusManager,\n parentNode: node\n }), [\n node,\n focusManager\n ]);\n return /*#__PURE__*/ (0, $jmfRy$react).createElement($535772f9d2c1f38d$var$FocusContext.Provider, {\n value: value\n }, /*#__PURE__*/ (0, $jmfRy$react).createElement(\"span\", {\n \"data-focus-scope-start\": true,\n hidden: true,\n ref: startRef\n }), children, /*#__PURE__*/ (0, $jmfRy$react).createElement(\"span\", {\n \"data-focus-scope-end\": true,\n hidden: true,\n ref: endRef\n }));\n}\nfunction $535772f9d2c1f38d$export$10c5169755ce7bd7() {\n return (0, $jmfRy$useContext)($535772f9d2c1f38d$var$FocusContext)?.focusManager;\n}\nfunction $535772f9d2c1f38d$var$createFocusManagerForScope(scopeRef) {\n return {\n focusNext (opts = {}) {\n let scope = scopeRef.current;\n let { from: from, tabbable: tabbable, wrap: wrap, accept: accept } = opts;\n let node = from || (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)((0, $d447af545b77c9f1$export$b204af158042fbac)(scope[0] ?? undefined));\n let sentinel = scope[0].previousElementSibling;\n let scopeRoot = $535772f9d2c1f38d$var$getScopeRoot(scope);\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(scopeRoot, {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = $535772f9d2c1f38d$var$isElementInScope(node, scope) ? node : sentinel;\n let nextNode = walker.nextNode();\n if (!nextNode && wrap) {\n walker.currentNode = sentinel;\n nextNode = walker.nextNode();\n }\n if (nextNode) $535772f9d2c1f38d$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusPrevious (opts = {}) {\n let scope = scopeRef.current;\n let { from: from, tabbable: tabbable, wrap: wrap, accept: accept } = opts;\n let node = from || (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)((0, $d447af545b77c9f1$export$b204af158042fbac)(scope[0] ?? undefined));\n let sentinel = scope[scope.length - 1].nextElementSibling;\n let scopeRoot = $535772f9d2c1f38d$var$getScopeRoot(scope);\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(scopeRoot, {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = $535772f9d2c1f38d$var$isElementInScope(node, scope) ? node : sentinel;\n let previousNode = walker.previousNode();\n if (!previousNode && wrap) {\n walker.currentNode = sentinel;\n previousNode = walker.previousNode();\n }\n if (previousNode) $535772f9d2c1f38d$var$focusElement(previousNode, true);\n return previousNode;\n },\n focusFirst (opts = {}) {\n let scope = scopeRef.current;\n let { tabbable: tabbable, accept: accept } = opts;\n let scopeRoot = $535772f9d2c1f38d$var$getScopeRoot(scope);\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(scopeRoot, {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = scope[0].previousElementSibling;\n let nextNode = walker.nextNode();\n if (nextNode) $535772f9d2c1f38d$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusLast (opts = {}) {\n let scope = scopeRef.current;\n let { tabbable: tabbable, accept: accept } = opts;\n let scopeRoot = $535772f9d2c1f38d$var$getScopeRoot(scope);\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(scopeRoot, {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = scope[scope.length - 1].nextElementSibling;\n let previousNode = walker.previousNode();\n if (previousNode) $535772f9d2c1f38d$var$focusElement(previousNode, true);\n return previousNode;\n }\n };\n}\nfunction $535772f9d2c1f38d$var$getScopeRoot(scope) {\n return scope[0].parentElement;\n}\nfunction $535772f9d2c1f38d$var$shouldContainFocus(scopeRef) {\n let scope = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode($535772f9d2c1f38d$var$activeScope);\n while(scope && scope.scopeRef !== scopeRef){\n if (scope.contain) return false;\n scope = scope.parent;\n }\n return true;\n}\nfunction $535772f9d2c1f38d$var$getRadiosInGroup(element) {\n if (!element.form) // Radio buttons outside a form - query the document\n return Array.from((0, $d447af545b77c9f1$export$b204af158042fbac)(element).querySelectorAll(`input[type=\"radio\"][name=\"${CSS.escape(element.name)}\"]`)).filter((radio)=>!radio.form);\n // namedItem returns RadioNodeList (iterable) for 2+ elements, but a single Element for exactly 1.\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormControlsCollection/namedItem\n const radioList = element.form.elements.namedItem(element.name);\n let ownerWindow = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(element);\n if (radioList instanceof ownerWindow.RadioNodeList) return Array.from(radioList).filter((el)=>el instanceof ownerWindow.HTMLInputElement);\n if (radioList instanceof ownerWindow.HTMLInputElement) return [\n radioList\n ];\n return [];\n}\nfunction $535772f9d2c1f38d$var$isTabbableRadio(element) {\n if (element.checked) return true;\n const radios = $535772f9d2c1f38d$var$getRadiosInGroup(element);\n return radios.length > 0 && !radios.some((radio)=>radio.checked);\n}\nfunction $535772f9d2c1f38d$var$useFocusContainment(scopeRef, contain) {\n let focusedNode = (0, $jmfRy$useRef)(undefined);\n let raf = (0, $jmfRy$useRef)(undefined);\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n let scope = scopeRef.current;\n if (!contain) {\n // if contain was changed, then we should cancel any ongoing waits to pull focus back into containment\n if (raf.current) {\n cancelAnimationFrame(raf.current);\n raf.current = undefined;\n }\n return;\n }\n const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(scope ? scope[0] : undefined);\n // Handle the Tab key to contain focus within the scope\n let onKeyDown = (e)=>{\n if (e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey || !$535772f9d2c1f38d$var$shouldContainFocus(scopeRef) || e.isComposing) return;\n let focusedElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument);\n let scope = scopeRef.current;\n if (!scope || !$535772f9d2c1f38d$var$isElementInScope(focusedElement, scope)) return;\n let scopeRoot = $535772f9d2c1f38d$var$getScopeRoot(scope);\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(scopeRoot, {\n tabbable: true\n }, scope);\n if (!focusedElement) return;\n walker.currentNode = focusedElement;\n let nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n if (!nextElement) {\n walker.currentNode = e.shiftKey ? scope[scope.length - 1].nextElementSibling : scope[0].previousElementSibling;\n nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n }\n e.preventDefault();\n if (nextElement) {\n $535772f9d2c1f38d$var$focusElement(nextElement, true);\n if (nextElement instanceof (0, $d447af545b77c9f1$export$f21a1ffae260145a)(nextElement).HTMLInputElement) nextElement.select();\n }\n };\n let onFocus = (e)=>{\n // If focusing an element in a child scope of the currently active scope, the child becomes active.\n // Moving out of the active scope to an ancestor is not allowed.\n if ((!$535772f9d2c1f38d$var$activeScope || $535772f9d2c1f38d$var$isAncestorScope($535772f9d2c1f38d$var$activeScope, scopeRef)) && $535772f9d2c1f38d$var$isElementInScope((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e), scopeRef.current)) {\n $535772f9d2c1f38d$var$activeScope = scopeRef;\n focusedNode.current = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n } else if ($535772f9d2c1f38d$var$shouldContainFocus(scopeRef) && !$535772f9d2c1f38d$var$isElementInChildScope((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e), scopeRef)) {\n // If a focus event occurs outside the active scope (e.g. user tabs from browser location bar),\n // restore focus to the previously focused node or the first tabbable element in the active scope.\n if (focusedNode.current) focusedNode.current.focus();\n else if ($535772f9d2c1f38d$var$activeScope && $535772f9d2c1f38d$var$activeScope.current) $535772f9d2c1f38d$var$focusFirstInScope($535772f9d2c1f38d$var$activeScope.current);\n } else if ($535772f9d2c1f38d$var$shouldContainFocus(scopeRef)) focusedNode.current = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n };\n let onBlur = (e)=>{\n // Firefox doesn't shift focus back to the Dialog properly without this\n if (raf.current) cancelAnimationFrame(raf.current);\n raf.current = requestAnimationFrame(()=>{\n // Patches infinite focus coersion loop for Android Talkback where the user isn't able to move the virtual cursor\n // if within a containing focus scope. Bug filed against Chrome: https://issuetracker.google.com/issues/384844019.\n // Note that this means focus can leave focus containing modals due to this, but it is isolated to Chrome Talkback.\n let modality = (0, $8f5a2122b0992be3$export$630ff653c5ada6a9)();\n let shouldSkipFocusRestore = (modality === 'virtual' || modality === null) && (0, $2add3ce32c6007eb$export$a11b0059900ceec8)() && (0, $2add3ce32c6007eb$export$6446a186d09e379e)();\n // Use document.activeElement instead of e.relatedTarget so we can tell if user clicked into iframe\n let activeElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument);\n if (!shouldSkipFocusRestore && activeElement && $535772f9d2c1f38d$var$shouldContainFocus(scopeRef) && !$535772f9d2c1f38d$var$isElementInChildScope(activeElement, scopeRef)) {\n $535772f9d2c1f38d$var$activeScope = scopeRef;\n let target = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n if (target && target.isConnected) {\n focusedNode.current = target;\n focusedNode.current?.focus();\n } else if ($535772f9d2c1f38d$var$activeScope.current) $535772f9d2c1f38d$var$focusFirstInScope($535772f9d2c1f38d$var$activeScope.current);\n }\n });\n };\n ownerDocument.addEventListener('keydown', onKeyDown, false);\n ownerDocument.addEventListener('focusin', onFocus, false);\n scope?.forEach((element)=>element.addEventListener('focusin', onFocus, false));\n scope?.forEach((element)=>element.addEventListener('focusout', onBlur, false));\n return ()=>{\n ownerDocument.removeEventListener('keydown', onKeyDown, false);\n ownerDocument.removeEventListener('focusin', onFocus, false);\n scope?.forEach((element)=>element.removeEventListener('focusin', onFocus, false));\n scope?.forEach((element)=>element.removeEventListener('focusout', onBlur, false));\n };\n }, [\n scopeRef,\n contain\n ]);\n // This is a useLayoutEffect so it is guaranteed to run before our async synthetic blur\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n return ()=>{\n if (raf.current) cancelAnimationFrame(raf.current);\n };\n }, [\n raf\n ]);\n}\nfunction $535772f9d2c1f38d$var$isElementInAnyScope(element) {\n return $535772f9d2c1f38d$var$isElementInChildScope(element);\n}\nfunction $535772f9d2c1f38d$var$isElementInScope(element, scope) {\n if (!element) return false;\n if (!scope) return false;\n return scope.some((node)=>(0, $23f2114a1b82827e$export$4282f70798064fe0)(node, element));\n}\nfunction $535772f9d2c1f38d$var$isElementInChildScope(element, scope = null) {\n // If the element is within a top layer element (e.g. toasts), always allow moving focus there.\n if (element instanceof Element && element.closest('[data-react-aria-top-layer]')) return true;\n // node.contains in isElementInScope covers child scopes that are also DOM children,\n // but does not cover child scopes in portals.\n for (let { scopeRef: s } of $535772f9d2c1f38d$export$d06fae2ee68b101e.traverse($535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scope))){\n if (s && $535772f9d2c1f38d$var$isElementInScope(element, s.current)) return true;\n }\n return false;\n}\nfunction $535772f9d2c1f38d$export$1258395f99bf9cbf(element) {\n return $535772f9d2c1f38d$var$isElementInChildScope(element, $535772f9d2c1f38d$var$activeScope);\n}\nfunction $535772f9d2c1f38d$var$isAncestorScope(ancestor, scope) {\n let parent = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scope)?.parent;\n while(parent){\n if (parent.scopeRef === ancestor) return true;\n parent = parent.parent;\n }\n return false;\n}\nfunction $535772f9d2c1f38d$var$focusElement(element, scroll = false) {\n if (element != null && !scroll) try {\n (0, $f192c2f16961cbe0$export$80f3e147d781571c)(element);\n } catch {\n // ignore\n }\n else if (element != null) try {\n element.focus();\n } catch {\n // ignore\n }\n}\nfunction $535772f9d2c1f38d$var$getFirstInScope(scope, tabbable = true) {\n let sentinel = scope[0].previousElementSibling;\n let scopeRoot = $535772f9d2c1f38d$var$getScopeRoot(scope);\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(scopeRoot, {\n tabbable: tabbable\n }, scope);\n walker.currentNode = sentinel;\n let nextNode = walker.nextNode();\n // If the scope does not contain a tabbable element, use the first focusable element.\n if (tabbable && !nextNode) {\n scopeRoot = $535772f9d2c1f38d$var$getScopeRoot(scope);\n walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(scopeRoot, {\n tabbable: false\n }, scope);\n walker.currentNode = sentinel;\n nextNode = walker.nextNode();\n }\n return nextNode;\n}\nfunction $535772f9d2c1f38d$var$focusFirstInScope(scope, tabbable = true) {\n $535772f9d2c1f38d$var$focusElement($535772f9d2c1f38d$var$getFirstInScope(scope, tabbable));\n}\nfunction $535772f9d2c1f38d$var$useAutoFocus(scopeRef, autoFocus) {\n const autoFocusRef = (0, $jmfRy$react).useRef(autoFocus);\n (0, $jmfRy$useEffect)(()=>{\n if (autoFocusRef.current) {\n $535772f9d2c1f38d$var$activeScope = scopeRef;\n const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(scopeRef.current ? scopeRef.current[0] : undefined);\n if (!$535772f9d2c1f38d$var$isElementInScope((0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument), $535772f9d2c1f38d$var$activeScope.current) && scopeRef.current) $535772f9d2c1f38d$var$focusFirstInScope(scopeRef.current);\n }\n autoFocusRef.current = false;\n }, [\n scopeRef\n ]);\n}\nfunction $535772f9d2c1f38d$var$useActiveScopeTracker(scopeRef, restore, contain) {\n // tracks the active scope, in case restore and contain are both false.\n // if either are true, this is tracked in useRestoreFocus or useFocusContainment.\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n if (restore || contain) return;\n let scope = scopeRef.current;\n const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(scope ? scope[0] : undefined);\n let onFocus = (e)=>{\n let target = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n if ($535772f9d2c1f38d$var$isElementInScope(target, scopeRef.current)) $535772f9d2c1f38d$var$activeScope = scopeRef;\n else if (!$535772f9d2c1f38d$var$isElementInAnyScope(target)) $535772f9d2c1f38d$var$activeScope = null;\n };\n ownerDocument.addEventListener('focusin', onFocus, false);\n scope?.forEach((element)=>element.addEventListener('focusin', onFocus, false));\n return ()=>{\n ownerDocument.removeEventListener('focusin', onFocus, false);\n scope?.forEach((element)=>element.removeEventListener('focusin', onFocus, false));\n };\n }, [\n scopeRef,\n restore,\n contain\n ]);\n}\nfunction $535772f9d2c1f38d$var$shouldRestoreFocus(scopeRef) {\n let scope = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode($535772f9d2c1f38d$var$activeScope);\n while(scope && scope.scopeRef !== scopeRef){\n if (scope.nodeToRestore) return false;\n scope = scope.parent;\n }\n return scope?.scopeRef === scopeRef;\n}\nfunction $535772f9d2c1f38d$var$useRestoreFocus(scopeRef, restoreFocus, contain) {\n // create a ref during render instead of useLayoutEffect so the active element is saved before a child with autoFocus=true mounts.\n const nodeToRestoreRef = (0, $jmfRy$useRef)(typeof document !== 'undefined' ? (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)((0, $d447af545b77c9f1$export$b204af158042fbac)(scopeRef.current ? scopeRef.current[0] : undefined)) : null);\n // restoring scopes should all track if they are active regardless of contain, but contain already tracks it plus logic to contain the focus\n // restoring-non-containing scopes should only care if they become active so they can perform the restore\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n let scope = scopeRef.current;\n const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(scope ? scope[0] : undefined);\n if (!restoreFocus || contain) return;\n let onFocus = ()=>{\n // If focusing an element in a child scope of the currently active scope, the child becomes active.\n // Moving out of the active scope to an ancestor is not allowed.\n if ((!$535772f9d2c1f38d$var$activeScope || $535772f9d2c1f38d$var$isAncestorScope($535772f9d2c1f38d$var$activeScope, scopeRef)) && $535772f9d2c1f38d$var$isElementInScope((0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument), scopeRef.current)) $535772f9d2c1f38d$var$activeScope = scopeRef;\n };\n ownerDocument.addEventListener('focusin', onFocus, false);\n scope?.forEach((element)=>element.addEventListener('focusin', onFocus, false));\n return ()=>{\n ownerDocument.removeEventListener('focusin', onFocus, false);\n scope?.forEach((element)=>element.removeEventListener('focusin', onFocus, false));\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n scopeRef,\n contain\n ]);\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(scopeRef.current ? scopeRef.current[0] : undefined);\n if (!restoreFocus) return;\n // Handle the Tab key so that tabbing out of the scope goes to the next element\n // after the node that had focus when the scope mounted. This is important when\n // using portals for overlays, so that focus goes to the expected element when\n // tabbing out of the overlay.\n let onKeyDown = (e)=>{\n if (e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey || !$535772f9d2c1f38d$var$shouldContainFocus(scopeRef) || e.isComposing) return;\n let focusedElement = ownerDocument.activeElement;\n if (!$535772f9d2c1f38d$var$isElementInChildScope(focusedElement, scopeRef) || !$535772f9d2c1f38d$var$shouldRestoreFocus(scopeRef)) return;\n let treeNode = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scopeRef);\n if (!treeNode) return;\n let nodeToRestore = treeNode.nodeToRestore;\n // Create a DOM tree walker that matches all tabbable elements\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(ownerDocument.body, {\n tabbable: true\n });\n // Find the next tabbable element after the currently focused element\n walker.currentNode = focusedElement;\n let nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n if (!nodeToRestore || !nodeToRestore.isConnected || nodeToRestore === ownerDocument.body) {\n nodeToRestore = undefined;\n treeNode.nodeToRestore = undefined;\n }\n // If there is no next element, or it is outside the current scope, move focus to the\n // next element after the node to restore to instead.\n if ((!nextElement || !$535772f9d2c1f38d$var$isElementInChildScope(nextElement, scopeRef)) && nodeToRestore) {\n walker.currentNode = nodeToRestore;\n // Skip over elements within the scope, in case the scope immediately follows the node to restore.\n do nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n while ($535772f9d2c1f38d$var$isElementInChildScope(nextElement, scopeRef));\n e.preventDefault();\n e.stopPropagation();\n if (nextElement) $535772f9d2c1f38d$var$focusElement(nextElement, true);\n else // If there is no next element and the nodeToRestore isn't within a FocusScope (i.e. we are leaving the top level focus scope)\n // then move focus to the body.\n // Otherwise restore focus to the nodeToRestore (e.g menu within a popover -> tabbing to close the menu should move focus to menu trigger)\n if (!$535772f9d2c1f38d$var$isElementInAnyScope(nodeToRestore)) focusedElement.blur();\n else $535772f9d2c1f38d$var$focusElement(nodeToRestore, true);\n }\n };\n if (!contain) ownerDocument.addEventListener('keydown', onKeyDown, true);\n return ()=>{\n if (!contain) ownerDocument.removeEventListener('keydown', onKeyDown, true);\n };\n }, [\n scopeRef,\n restoreFocus,\n contain\n ]);\n // useLayoutEffect instead of useEffect so the active element is saved synchronously instead of asynchronously.\n (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(scopeRef.current ? scopeRef.current[0] : undefined);\n if (!restoreFocus) return;\n let treeNode = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scopeRef);\n if (!treeNode) return;\n treeNode.nodeToRestore = nodeToRestoreRef.current ?? undefined;\n return ()=>{\n let treeNode = $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(scopeRef);\n if (!treeNode) return;\n let nodeToRestore = treeNode.nodeToRestore;\n // if we already lost focus to the body and this was the active scope, then we should attempt to restore\n let activeElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument);\n if (restoreFocus && nodeToRestore && (activeElement && $535772f9d2c1f38d$var$isElementInChildScope(activeElement, scopeRef) || activeElement === ownerDocument.body && $535772f9d2c1f38d$var$shouldRestoreFocus(scopeRef))) {\n // freeze the focusScopeTree so it persists after the raf, otherwise during unmount nodes are removed from it\n let clonedTree = $535772f9d2c1f38d$export$d06fae2ee68b101e.clone();\n requestAnimationFrame(()=>{\n // Only restore focus if we've lost focus to the body, the alternative is that focus has been purposefully moved elsewhere\n if (ownerDocument.activeElement === ownerDocument.body) {\n // look up the tree starting with our scope to find a nodeToRestore still in the DOM\n let treeNode = clonedTree.getTreeNode(scopeRef);\n while(treeNode){\n if (treeNode.nodeToRestore && treeNode.nodeToRestore.isConnected) {\n $535772f9d2c1f38d$var$restoreFocusToElement(treeNode.nodeToRestore);\n return;\n }\n treeNode = treeNode.parent;\n }\n // If no nodeToRestore was found, focus the first element in the nearest\n // ancestor scope that is still in the tree.\n treeNode = clonedTree.getTreeNode(scopeRef);\n while(treeNode){\n if (treeNode.scopeRef && treeNode.scopeRef.current && $535772f9d2c1f38d$export$d06fae2ee68b101e.getTreeNode(treeNode.scopeRef)) {\n let node = $535772f9d2c1f38d$var$getFirstInScope(treeNode.scopeRef.current, true);\n $535772f9d2c1f38d$var$restoreFocusToElement(node);\n return;\n }\n treeNode = treeNode.parent;\n }\n }\n });\n }\n };\n }, [\n scopeRef,\n restoreFocus\n ]);\n}\nfunction $535772f9d2c1f38d$var$restoreFocusToElement(node) {\n // Dispatch a custom event that parent elements can intercept to customize focus restoration.\n // For example, virtualized collection components reuse DOM elements, so the original element\n // might still exist in the DOM but representing a different item.\n if (node.dispatchEvent(new CustomEvent($535772f9d2c1f38d$var$RESTORE_FOCUS_EVENT, {\n bubbles: true,\n cancelable: true\n }))) $535772f9d2c1f38d$var$focusElement(node);\n}\nfunction $535772f9d2c1f38d$export$2d6ec8fc375ceafa(root, opts, scope) {\n let filter = opts?.tabbable ? (0, $3b8b240c1bf84ab9$export$bebd5a1431fec25d) : (0, $3b8b240c1bf84ab9$export$4c063cf1350e6fed);\n // Ensure that root is an Element or fall back appropriately\n let rootElement = root?.nodeType === Node.ELEMENT_NODE ? root : null;\n // Determine the document to use\n let doc = (0, $d447af545b77c9f1$export$b204af158042fbac)(rootElement);\n // Create a TreeWalker, ensuring the root is an Element or Document\n let walker = (0, $654b97e09f2a30c1$export$4d0f8be8b12a7ef6)(doc, root || doc, NodeFilter.SHOW_ELEMENT, {\n acceptNode (node) {\n // Skip nodes inside the starting node.\n if ((0, $23f2114a1b82827e$export$4282f70798064fe0)(opts?.from, node)) return NodeFilter.FILTER_REJECT;\n if (opts?.tabbable && node.tagName === 'INPUT' && node.getAttribute('type') === 'radio') {\n // If the radio is in a form, we can get all the other radios by name\n if (!$535772f9d2c1f38d$var$isTabbableRadio(node)) return NodeFilter.FILTER_REJECT;\n // If the radio is in the same group as the current node and none are selected, we can skip it\n if (walker.currentNode.tagName === 'INPUT' && walker.currentNode.type === 'radio' && walker.currentNode.name === node.name) return NodeFilter.FILTER_REJECT;\n }\n if (filter(node) && (!scope || $535772f9d2c1f38d$var$isElementInScope(node, scope)) && (!opts?.accept || opts.accept(node))) return NodeFilter.FILTER_ACCEPT;\n return NodeFilter.FILTER_SKIP;\n }\n });\n if (opts?.from) walker.currentNode = opts.from;\n return walker;\n}\nfunction $535772f9d2c1f38d$export$c5251b9e124bf29(ref, defaultOptions = {}) {\n return {\n focusNext (opts = {}) {\n let root = ref.current;\n if (!root) return null;\n let { from: from, tabbable: tabbable = defaultOptions.tabbable, wrap: wrap = defaultOptions.wrap, accept: accept = defaultOptions.accept } = opts;\n let node = from || (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)((0, $d447af545b77c9f1$export$b204af158042fbac)(root));\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n if ((0, $23f2114a1b82827e$export$4282f70798064fe0)(root, node)) walker.currentNode = node;\n let nextNode = walker.nextNode();\n if (!nextNode && wrap) {\n walker.currentNode = root;\n nextNode = walker.nextNode();\n }\n if (nextNode) $535772f9d2c1f38d$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusPrevious (opts = defaultOptions) {\n let root = ref.current;\n if (!root) return null;\n let { from: from, tabbable: tabbable = defaultOptions.tabbable, wrap: wrap = defaultOptions.wrap, accept: accept = defaultOptions.accept } = opts;\n let node = from || (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)((0, $d447af545b77c9f1$export$b204af158042fbac)(root));\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n if ((0, $23f2114a1b82827e$export$4282f70798064fe0)(root, node)) walker.currentNode = node;\n else {\n let next = $535772f9d2c1f38d$var$last(walker);\n if (next) $535772f9d2c1f38d$var$focusElement(next, true);\n return next ?? null;\n }\n let previousNode = walker.previousNode();\n if (!previousNode && wrap) {\n walker.currentNode = root;\n let lastNode = $535772f9d2c1f38d$var$last(walker);\n if (!lastNode) // couldn't wrap\n return null;\n previousNode = lastNode;\n }\n if (previousNode) $535772f9d2c1f38d$var$focusElement(previousNode, true);\n return previousNode ?? null;\n },\n focusFirst (opts = defaultOptions) {\n let root = ref.current;\n if (!root) return null;\n let { tabbable: tabbable = defaultOptions.tabbable, accept: accept = defaultOptions.accept } = opts;\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n let nextNode = walker.nextNode();\n if (nextNode) $535772f9d2c1f38d$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusLast (opts = defaultOptions) {\n let root = ref.current;\n if (!root) return null;\n let { tabbable: tabbable = defaultOptions.tabbable, accept: accept = defaultOptions.accept } = opts;\n let walker = $535772f9d2c1f38d$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n let next = $535772f9d2c1f38d$var$last(walker);\n if (next) $535772f9d2c1f38d$var$focusElement(next, true);\n return next ?? null;\n }\n };\n}\nfunction $535772f9d2c1f38d$var$last(walker) {\n let next = undefined;\n let last;\n do {\n last = walker.lastChild();\n if (last) next = last;\n }while (last);\n return next;\n}\nclass $535772f9d2c1f38d$var$Tree {\n constructor(){\n this.fastMap = new Map();\n this.root = new $535772f9d2c1f38d$var$TreeNode({\n scopeRef: null\n });\n this.fastMap.set(null, this.root);\n }\n get size() {\n return this.fastMap.size;\n }\n getTreeNode(data) {\n return this.fastMap.get(data);\n }\n addTreeNode(scopeRef, parent, nodeToRestore) {\n let parentNode = this.fastMap.get(parent ?? null);\n if (!parentNode) return;\n let node = new $535772f9d2c1f38d$var$TreeNode({\n scopeRef: scopeRef\n });\n parentNode.addChild(node);\n node.parent = parentNode;\n this.fastMap.set(scopeRef, node);\n if (nodeToRestore) node.nodeToRestore = nodeToRestore;\n }\n addNode(node) {\n this.fastMap.set(node.scopeRef, node);\n }\n removeTreeNode(scopeRef) {\n // never remove the root\n if (scopeRef === null) return;\n let node = this.fastMap.get(scopeRef);\n if (!node) return;\n let parentNode = node.parent;\n // when we remove a scope, check if any sibling scopes are trying to restore focus to something inside the scope we're removing\n // if we are, then replace the siblings restore with the restore from the scope we're removing\n for (let current of this.traverse())if (current !== node && node.nodeToRestore && current.nodeToRestore && node.scopeRef && node.scopeRef.current && $535772f9d2c1f38d$var$isElementInScope(current.nodeToRestore, node.scopeRef.current)) current.nodeToRestore = node.nodeToRestore;\n let children = node.children;\n if (parentNode) {\n parentNode.removeChild(node);\n if (children.size > 0) children.forEach((child)=>parentNode && parentNode.addChild(child));\n }\n this.fastMap.delete(node.scopeRef);\n }\n // Pre Order Depth First\n *traverse(node = this.root) {\n if (node.scopeRef != null) yield node;\n if (node.children.size > 0) for (let child of node.children)yield* this.traverse(child);\n }\n clone() {\n let newTree = new $535772f9d2c1f38d$var$Tree();\n for (let node of this.traverse())newTree.addTreeNode(node.scopeRef, node.parent?.scopeRef ?? null, node.nodeToRestore);\n return newTree;\n }\n}\nclass $535772f9d2c1f38d$var$TreeNode {\n constructor(props){\n this.children = new Set();\n this.contain = false;\n this.scopeRef = props.scopeRef;\n }\n addChild(node) {\n this.children.add(node);\n node.parent = this;\n }\n removeChild(node) {\n this.children.delete(node);\n node.parent = undefined;\n }\n}\nlet $535772f9d2c1f38d$export$d06fae2ee68b101e = new $535772f9d2c1f38d$var$Tree();\n\n\nexport {$535772f9d2c1f38d$export$20e40289641fbbb6 as FocusScope, $535772f9d2c1f38d$export$d06fae2ee68b101e as focusScopeTree, $535772f9d2c1f38d$export$10c5169755ce7bd7 as useFocusManager, $535772f9d2c1f38d$export$2d6ec8fc375ceafa as getFocusableTreeWalker, $535772f9d2c1f38d$export$1258395f99bf9cbf as isElementInChildOfActiveScope, $535772f9d2c1f38d$export$c5251b9e124bf29 as createFocusManager};\n//# sourceMappingURL=FocusScope.mjs.map\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents';\n}\nfunction isTableElement(element) {\n return /^(table|td|th)$/.test(getNodeName(element));\n}\nfunction isTopLayer(element) {\n try {\n if (element.matches(':popover-open')) {\n return true;\n }\n } catch (_e) {\n // no-op\n }\n try {\n return element.matches(':modal');\n } catch (_e) {\n return false;\n }\n}\nconst willChangeRe = /transform|translate|scale|rotate|perspective|filter/;\nconst containRe = /paint|layout|strict|content/;\nconst isNotNone = value => !!value && value !== 'none';\nlet isWebKitValue;\nfunction isContainingBlock(elementOrCss) {\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (isWebKitValue == null) {\n isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');\n }\n return isWebKitValue;\n}\nfunction isLastTraversableNode(node) {\n return /^(html|body|#document)$/.test(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n } else {\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n }\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n const firstChar = placement[0];\n return firstChar === 't' || firstChar === 'b' ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n const side = getSide(placement);\n return oppositeSideMap[side] + placement.slice(side.length);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { isShadowRoot, isHTMLElement } from '@floating-ui/utils/dom';\nimport * as React from 'react';\nimport { useLayoutEffect } from 'react';\nimport { floor } from '@floating-ui/utils';\nimport { tabbable } from 'tabbable';\n\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n const uaData = navigator.userAgentData;\n if (uaData != null && uaData.platform) {\n return uaData.platform;\n }\n return navigator.platform;\n}\nfunction getUserAgent() {\n const uaData = navigator.userAgentData;\n if (uaData && Array.isArray(uaData.brands)) {\n return uaData.brands.map(_ref => {\n let {\n brand,\n version\n } = _ref;\n return brand + \"/\" + version;\n }).join(' ');\n }\n return navigator.userAgent;\n}\nfunction isSafari() {\n // Chrome DevTools does not complain about navigator.vendor\n return /apple/i.test(navigator.vendor);\n}\nfunction isAndroid() {\n const re = /android/i;\n return re.test(getPlatform()) || re.test(getUserAgent());\n}\nfunction isMac() {\n return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n return getUserAgent().includes('jsdom/');\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction activeElement(doc) {\n let activeElement = doc.activeElement;\n while (((_activeElement = activeElement) == null || (_activeElement = _activeElement.shadowRoot) == null ? void 0 : _activeElement.activeElement) != null) {\n var _activeElement;\n activeElement = activeElement.shadowRoot.activeElement;\n }\n return activeElement;\n}\nfunction contains(parent, child) {\n if (!parent || !child) {\n return false;\n }\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n // First, attempt with faster native method\n if (parent.contains(child)) {\n return true;\n }\n\n // then fallback to custom implementation with Shadow DOM support\n if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n while (next) {\n if (parent === next) {\n return true;\n }\n // @ts-ignore\n next = next.parentNode || next.host;\n }\n }\n\n // Give up, the result is false\n return false;\n}\nfunction getTarget(event) {\n if ('composedPath' in event) {\n return event.composedPath()[0];\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support\n // `composedPath()`, but browsers without shadow DOM don't.\n return event.target;\n}\nfunction isEventTargetWithin(event, node) {\n if (node == null) {\n return false;\n }\n if ('composedPath' in event) {\n return event.composedPath().includes(node);\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n const e = event;\n return e.target != null && node.contains(e.target);\n}\nfunction isRootElement(element) {\n return element.matches('html,body');\n}\nfunction getDocument(node) {\n return (node == null ? void 0 : node.ownerDocument) || document;\n}\nfunction isTypeableElement(element) {\n return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction isTypeableCombobox(element) {\n if (!element) return false;\n return element.getAttribute('role') === 'combobox' && isTypeableElement(element);\n}\nfunction matchesFocusVisible(element) {\n // We don't want to block focus from working with `visibleOnly`\n // (JSDOM doesn't match `:focus-visible` when the element has `:focus`)\n if (!element || isJSDOM()) return true;\n try {\n return element.matches(':focus-visible');\n } catch (_e) {\n return true;\n }\n}\nfunction getFloatingFocusElement(floatingElement) {\n if (!floatingElement) {\n return null;\n }\n // Try to find the element that has `{...getFloatingProps()}` spread on it.\n // This indicates the floating element is acting as a positioning wrapper, and\n // so focus should be managed on the child element with the event handlers and\n // aria props.\n return floatingElement.hasAttribute(FOCUSABLE_ATTRIBUTE) ? floatingElement : floatingElement.querySelector(\"[\" + FOCUSABLE_ATTRIBUTE + \"]\") || floatingElement;\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n if (onlyOpenChildren === void 0) {\n onlyOpenChildren = true;\n }\n const directChildren = nodes.filter(node => {\n var _node$context;\n return node.parentId === id && (!onlyOpenChildren || ((_node$context = node.context) == null ? void 0 : _node$context.open));\n });\n return directChildren.flatMap(child => [child, ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);\n}\nfunction getDeepestNode(nodes, id) {\n let deepestNodeId;\n let maxDepth = -1;\n function findDeepest(nodeId, depth) {\n if (depth > maxDepth) {\n deepestNodeId = nodeId;\n maxDepth = depth;\n }\n const children = getNodeChildren(nodes, nodeId);\n children.forEach(child => {\n findDeepest(child.id, depth + 1);\n });\n }\n findDeepest(id, 0);\n return nodes.find(node => node.id === deepestNodeId);\n}\nfunction getNodeAncestors(nodes, id) {\n var _nodes$find;\n let allAncestors = [];\n let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n while (currentParentId) {\n const currentNode = nodes.find(node => node.id === currentParentId);\n currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n if (currentNode) {\n allAncestors = allAncestors.concat(currentNode);\n }\n }\n return allAncestors;\n}\n\nfunction stopEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\nfunction isReactEvent(event) {\n return 'nativeEvent' in event;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n // FIXME: Firefox is now emitting a deprecation warning for `mozInputSource`.\n // Try to find a workaround for this. `react-aria` source still has the check.\n if (event.mozInputSource === 0 && event.isTrusted) {\n return true;\n }\n if (isAndroid() && event.pointerType) {\n return event.type === 'click' && event.buttons === 1;\n }\n return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n if (isJSDOM()) return false;\n return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse' ||\n // iOS VoiceOver returns 0.333• for width/height.\n event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'touch';\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n const values = ['mouse', 'pen'];\n if (!strict) {\n values.push('', undefined);\n }\n return values.includes(pointerType);\n}\n\nvar isClient = typeof document !== 'undefined';\n\nvar noop = function noop() {};\nvar index = isClient ? useLayoutEffect : noop;\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n ...React\n};\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\nconst useInsertionEffect = SafeReact.useInsertionEffect;\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEffectEvent(callback) {\n const ref = React.useRef(() => {\n if (process.env.NODE_ENV !== \"production\") {\n throw new Error('Cannot call an event handler while rendering.');\n }\n });\n useSafeInsertionEffect(() => {\n ref.current = callback;\n });\n return React.useCallback(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return ref.current == null ? void 0 : ref.current(...args);\n }, []);\n}\n\nfunction isDifferentGridRow(index, cols, prevRow) {\n return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfListBounds(listRef, index) {\n return index < 0 || index >= listRef.current.length;\n}\nfunction getMinListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n disabledIndices\n });\n}\nfunction getMaxListIndex(listRef, disabledIndices) {\n return findNonDisabledListIndex(listRef, {\n decrement: true,\n startingIndex: listRef.current.length,\n disabledIndices\n });\n}\nfunction findNonDisabledListIndex(listRef, _temp) {\n let {\n startingIndex = -1,\n decrement = false,\n disabledIndices,\n amount = 1\n } = _temp === void 0 ? {} : _temp;\n let index = startingIndex;\n do {\n index += decrement ? -amount : amount;\n } while (index >= 0 && index <= listRef.current.length - 1 && isListIndexDisabled(listRef, index, disabledIndices));\n return index;\n}\nfunction getGridNavigatedIndex(listRef, _ref) {\n let {\n event,\n orientation,\n loop,\n rtl,\n cols,\n disabledIndices,\n minIndex,\n maxIndex,\n prevIndex,\n stopEvent: stop = false\n } = _ref;\n let nextIndex = prevIndex;\n if (event.key === ARROW_UP) {\n stop && stopEvent(event);\n if (prevIndex === -1) {\n nextIndex = maxIndex;\n } else {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: nextIndex,\n amount: cols,\n decrement: true,\n disabledIndices\n });\n if (loop && (prevIndex - cols < minIndex || nextIndex < 0)) {\n const col = prevIndex % cols;\n const maxCol = maxIndex % cols;\n const offset = maxIndex - (maxCol - col);\n if (maxCol === col) {\n nextIndex = maxIndex;\n } else {\n nextIndex = maxCol > col ? offset : offset - cols;\n }\n }\n }\n if (isIndexOutOfListBounds(listRef, nextIndex)) {\n nextIndex = prevIndex;\n }\n }\n if (event.key === ARROW_DOWN) {\n stop && stopEvent(event);\n if (prevIndex === -1) {\n nextIndex = minIndex;\n } else {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex,\n amount: cols,\n disabledIndices\n });\n if (loop && prevIndex + cols > maxIndex) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex % cols - cols,\n amount: cols,\n disabledIndices\n });\n }\n }\n if (isIndexOutOfListBounds(listRef, nextIndex)) {\n nextIndex = prevIndex;\n }\n }\n\n // Remains on the same row/column.\n if (orientation === 'both') {\n const prevRow = floor(prevIndex / cols);\n if (event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT)) {\n stop && stopEvent(event);\n if (prevIndex % cols !== cols - 1) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex,\n disabledIndices\n });\n if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n }\n } else if (loop) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n }\n if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = prevIndex;\n }\n }\n if (event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT)) {\n stop && stopEvent(event);\n if (prevIndex % cols !== 0) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex,\n decrement: true,\n disabledIndices\n });\n if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex + (cols - prevIndex % cols),\n decrement: true,\n disabledIndices\n });\n }\n } else if (loop) {\n nextIndex = findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex + (cols - prevIndex % cols),\n decrement: true,\n disabledIndices\n });\n }\n if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n nextIndex = prevIndex;\n }\n }\n const lastRow = floor(maxIndex / cols) === prevRow;\n if (isIndexOutOfListBounds(listRef, nextIndex)) {\n if (loop && lastRow) {\n nextIndex = event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT) ? maxIndex : findNonDisabledListIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n } else {\n nextIndex = prevIndex;\n }\n }\n }\n return nextIndex;\n}\n\n/** For each cell index, gets the item index that occupies that cell */\nfunction createGridCellMap(sizes, cols, dense) {\n const cellMap = [];\n let startIndex = 0;\n sizes.forEach((_ref2, index) => {\n let {\n width,\n height\n } = _ref2;\n if (width > cols) {\n if (process.env.NODE_ENV !== \"production\") {\n throw new Error(\"[Floating UI]: Invalid grid - item width at index \" + index + \" is greater than grid columns\");\n }\n }\n let itemPlaced = false;\n if (dense) {\n startIndex = 0;\n }\n while (!itemPlaced) {\n const targetCells = [];\n for (let i = 0; i < width; i++) {\n for (let j = 0; j < height; j++) {\n targetCells.push(startIndex + i + j * cols);\n }\n }\n if (startIndex % cols + width <= cols && targetCells.every(cell => cellMap[cell] == null)) {\n targetCells.forEach(cell => {\n cellMap[cell] = index;\n });\n itemPlaced = true;\n } else {\n startIndex++;\n }\n }\n });\n\n // convert into a non-sparse array\n return [...cellMap];\n}\n\n/** Gets cell index of an item's corner or -1 when index is -1. */\nfunction getGridCellIndexOfCorner(index, sizes, cellMap, cols, corner) {\n if (index === -1) return -1;\n const firstCellIndex = cellMap.indexOf(index);\n const sizeItem = sizes[index];\n switch (corner) {\n case 'tl':\n return firstCellIndex;\n case 'tr':\n if (!sizeItem) {\n return firstCellIndex;\n }\n return firstCellIndex + sizeItem.width - 1;\n case 'bl':\n if (!sizeItem) {\n return firstCellIndex;\n }\n return firstCellIndex + (sizeItem.height - 1) * cols;\n case 'br':\n return cellMap.lastIndexOf(index);\n }\n}\n\n/** Gets all cell indices that correspond to the specified indices */\nfunction getGridCellIndices(indices, cellMap) {\n return cellMap.flatMap((index, cellIndex) => indices.includes(index) ? [cellIndex] : []);\n}\nfunction isListIndexDisabled(listRef, index, disabledIndices) {\n if (typeof disabledIndices === 'function') {\n return disabledIndices(index);\n } else if (disabledIndices) {\n return disabledIndices.includes(index);\n }\n const element = listRef.current[index];\n return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nconst getTabbableOptions = () => ({\n getShadowRoot: true,\n displayCheck:\n // JSDOM does not support the `tabbable` library. To solve this we can\n // check if `ResizeObserver` is a real function (not polyfilled), which\n // determines if the current environment is JSDOM-like.\n typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, dir) {\n const list = tabbable(container, getTabbableOptions());\n const len = list.length;\n if (len === 0) return;\n const active = activeElement(getDocument(container));\n const index = list.indexOf(active);\n const nextIndex = index === -1 ? dir === 1 ? 0 : len - 1 : index + dir;\n return list[nextIndex];\n}\nfunction getNextTabbable(referenceElement) {\n return getTabbableIn(getDocument(referenceElement).body, 1) || referenceElement;\n}\nfunction getPreviousTabbable(referenceElement) {\n return getTabbableIn(getDocument(referenceElement).body, -1) || referenceElement;\n}\nfunction isOutsideEvent(event, container) {\n const containerElement = container || event.currentTarget;\n const relatedTarget = event.relatedTarget;\n return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n const tabbableElements = tabbable(container, getTabbableOptions());\n tabbableElements.forEach(element => {\n element.dataset.tabindex = element.getAttribute('tabindex') || '';\n element.setAttribute('tabindex', '-1');\n });\n}\nfunction enableFocusInside(container) {\n const elements = container.querySelectorAll('[data-tabindex]');\n elements.forEach(element => {\n const tabindex = element.dataset.tabindex;\n delete element.dataset.tabindex;\n if (tabindex) {\n element.setAttribute('tabindex', tabindex);\n } else {\n element.removeAttribute('tabindex');\n }\n });\n}\n\nexport { activeElement, contains, createGridCellMap, disableFocusInside, enableFocusInside, findNonDisabledListIndex, getDeepestNode, getDocument, getFloatingFocusElement, getGridCellIndexOfCorner, getGridCellIndices, getGridNavigatedIndex, getMaxListIndex, getMinListIndex, getNextTabbable, getNodeAncestors, getNodeChildren, getPlatform, getPreviousTabbable, getTabbableOptions, getTarget, getUserAgent, isAndroid, isDifferentGridRow, isEventTargetWithin, isIndexOutOfListBounds, isJSDOM, isListIndexDisabled, isMac, isMouseLikePointerType, isOutsideEvent, isReactEvent, isRootElement, isSafari, isTypeableCombobox, isTypeableElement, isVirtualClick, isVirtualPointerEvent, matchesFocusVisible, stopEvent, useEffectEvent, useLatestRef, index as useModernLayoutEffect };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n// Maximum number of resets that can occur before bailing to avoid infinite reset loops.\nconst MAX_RESET_COUNT = 50;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const platformWithDetectOverflow = platform.detectOverflow ? platform : {\n ...platform,\n detectOverflow\n };\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let resetCount = 0;\n const middlewareData = {};\n for (let i = 0; i < middleware.length; i++) {\n const currentMiddleware = middleware[i];\n if (!currentMiddleware) {\n continue;\n }\n const {\n name,\n fn\n } = currentMiddleware;\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform: platformWithDetectOverflow,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData[name] = {\n ...middlewareData[name],\n ...data\n };\n if (reset && resetCount < MAX_RESET_COUNT) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects,\n platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n platform\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === 'absolute' || currentContainingBlockComputedStyle.position === 'fixed') || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);\n let top = firstRect.top;\n let right = firstRect.right;\n let bottom = firstRect.bottom;\n let left = firstRect.left;\n for (let i = 1; i < clippingAncestors.length; i++) {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);\n top = max(rect.top, top);\n right = min(rect.right, right);\n bottom = min(rect.bottom, bottom);\n left = max(rect.left, left);\n }\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...(floating ? getOverflowAncestors(floating) : [])] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n if (floating) {\n resizeObserver.observe(floating);\n }\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { computePosition, arrow as arrow$2, autoPlacement as autoPlacement$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar isClient = typeof document !== 'undefined';\n\nvar noop = function noop() {};\nvar index = isClient ? useLayoutEffect : noop;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (typeof a === 'function' && a.toString() === b.toString()) {\n return true;\n }\n let length;\n let i;\n let keys;\n if (a && b && typeof a === 'object') {\n if (Array.isArray(a)) {\n length = a.length;\n if (length !== b.length) return false;\n for (i = length; i-- !== 0;) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0;) {\n if (!{}.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0;) {\n const key = keys[i];\n if (key === '_owner' && a.$$typeof) {\n continue;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n if (typeof window === 'undefined') {\n return 1;\n }\n const win = element.ownerDocument.defaultView || window;\n return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n const dpr = getDPR(element);\n return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform,\n elements: {\n reference: externalReference,\n floating: externalFloating\n } = {},\n transform = true,\n whileElementsMounted,\n open\n } = options;\n const [data, setData] = React.useState({\n x: 0,\n y: 0,\n strategy,\n placement,\n middlewareData: {},\n isPositioned: false\n });\n const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n if (!deepEqual(latestMiddleware, middleware)) {\n setLatestMiddleware(middleware);\n }\n const [_reference, _setReference] = React.useState(null);\n const [_floating, _setFloating] = React.useState(null);\n const setReference = React.useCallback(node => {\n if (node !== referenceRef.current) {\n referenceRef.current = node;\n _setReference(node);\n }\n }, []);\n const setFloating = React.useCallback(node => {\n if (node !== floatingRef.current) {\n floatingRef.current = node;\n _setFloating(node);\n }\n }, []);\n const referenceEl = externalReference || _reference;\n const floatingEl = externalFloating || _floating;\n const referenceRef = React.useRef(null);\n const floatingRef = React.useRef(null);\n const dataRef = React.useRef(data);\n const hasWhileElementsMounted = whileElementsMounted != null;\n const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n const platformRef = useLatestRef(platform);\n const openRef = useLatestRef(open);\n const update = React.useCallback(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n const config = {\n placement,\n strategy,\n middleware: latestMiddleware\n };\n if (platformRef.current) {\n config.platform = platformRef.current;\n }\n computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n const fullData = {\n ...data,\n // The floating element's position may be recomputed while it's closed\n // but still mounted (such as when transitioning out). To ensure\n // `isPositioned` will be `false` initially on the next open, avoid\n // setting it to `true` when `open === false` (must be specified).\n isPositioned: openRef.current !== false\n };\n if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n dataRef.current = fullData;\n ReactDOM.flushSync(() => {\n setData(fullData);\n });\n }\n });\n }, [latestMiddleware, placement, strategy, platformRef, openRef]);\n index(() => {\n if (open === false && dataRef.current.isPositioned) {\n dataRef.current.isPositioned = false;\n setData(data => ({\n ...data,\n isPositioned: false\n }));\n }\n }, [open]);\n const isMountedRef = React.useRef(false);\n index(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n index(() => {\n if (referenceEl) referenceRef.current = referenceEl;\n if (floatingEl) floatingRef.current = floatingEl;\n if (referenceEl && floatingEl) {\n if (whileElementsMountedRef.current) {\n return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n }\n update();\n }\n }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n const refs = React.useMemo(() => ({\n reference: referenceRef,\n floating: floatingRef,\n setReference,\n setFloating\n }), [setReference, setFloating]);\n const elements = React.useMemo(() => ({\n reference: referenceEl,\n floating: floatingEl\n }), [referenceEl, floatingEl]);\n const floatingStyles = React.useMemo(() => {\n const initialStyles = {\n position: strategy,\n left: 0,\n top: 0\n };\n if (!elements.floating) {\n return initialStyles;\n }\n const x = roundByDPR(elements.floating, data.x);\n const y = roundByDPR(elements.floating, data.y);\n if (transform) {\n return {\n ...initialStyles,\n transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n ...(getDPR(elements.floating) >= 1.5 && {\n willChange: 'transform'\n })\n };\n }\n return {\n position: strategy,\n left: x,\n top: y\n };\n }, [strategy, transform, elements.floating, data.x, data.y]);\n return React.useMemo(() => ({\n ...data,\n update,\n refs,\n elements,\n floatingStyles\n }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n function isRef(value) {\n return {}.hasOwnProperty.call(value, 'current');\n }\n return {\n name: 'arrow',\n options,\n fn(state) {\n const {\n element,\n padding\n } = typeof options === 'function' ? options(state) : options;\n if (element && isRef(element)) {\n if (element.current != null) {\n return arrow$2({\n element: element.current,\n padding\n }).fn(state);\n }\n return {};\n }\n if (element) {\n return arrow$2({\n element,\n padding\n }).fn(state);\n }\n return {};\n }\n };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => {\n const result = offset$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => {\n const result = shift$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => {\n const result = limitShift$1(options);\n return {\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => {\n const result = flip$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => {\n const result = size$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => {\n const result = autoPlacement$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => {\n const result = hide$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => {\n const result = inline$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => {\n const result = arrow$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","import * as React from 'react';\nimport { useModernLayoutEffect, useEffectEvent, getMinListIndex, getMaxListIndex, createGridCellMap, isListIndexDisabled, getGridNavigatedIndex, getGridCellIndexOfCorner, getGridCellIndices, findNonDisabledListIndex, isIndexOutOfListBounds, useLatestRef, getDocument as getDocument$1, isMouseLikePointerType, contains as contains$1, isSafari, enableFocusInside, isOutsideEvent, getPreviousTabbable, getNextTabbable, disableFocusInside, isTypeableCombobox, getFloatingFocusElement, getTabbableOptions, getNodeAncestors, activeElement, getNodeChildren as getNodeChildren$1, stopEvent, getTarget as getTarget$1, isVirtualClick, isVirtualPointerEvent, getPlatform, isTypeableElement, isReactEvent, isRootElement, isEventTargetWithin, matchesFocusVisible, isMac, getDeepestNode, getUserAgent } from '@floating-ui/react/utils';\nimport { jsx, jsxs, Fragment } from 'react/jsx-runtime';\nimport { getComputedStyle, isElement, isShadowRoot, getNodeName, isNode, isHTMLElement, getWindow, isLastTraversableNode, getParentNode, isWebKit } from '@floating-ui/utils/dom';\nimport { tabbable, isTabbable, focusable } from 'tabbable';\nimport * as ReactDOM from 'react-dom';\nimport { getOverflowAncestors, useFloating as useFloating$1, offset } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\nimport { evaluate, max, min, round } from '@floating-ui/utils';\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n */\nfunction useMergeRefs(refs) {\n const cleanupRef = React.useRef(undefined);\n const refEffect = React.useCallback(instance => {\n const cleanups = refs.map(ref => {\n if (ref == null) {\n return;\n }\n if (typeof ref === 'function') {\n const refCallback = ref;\n const refCleanup = refCallback(instance);\n return typeof refCleanup === 'function' ? refCleanup : () => {\n refCallback(null);\n };\n }\n ref.current = instance;\n return () => {\n ref.current = null;\n };\n });\n return () => {\n cleanups.forEach(refCleanup => refCleanup == null ? void 0 : refCleanup());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n return React.useMemo(() => {\n if (refs.every(ref => ref == null)) {\n return null;\n }\n return value => {\n if (cleanupRef.current) {\n cleanupRef.current();\n cleanupRef.current = undefined;\n }\n if (value != null) {\n cleanupRef.current = refEffect(value);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n\nfunction sortByDocumentPosition(a, b) {\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n return 1;\n }\n return 0;\n}\nconst FloatingListContext = /*#__PURE__*/React.createContext({\n register: () => {},\n unregister: () => {},\n map: /*#__PURE__*/new Map(),\n elementsRef: {\n current: []\n }\n});\n/**\n * Provides context for a list of items within the floating element.\n * @see https://floating-ui.com/docs/FloatingList\n */\nfunction FloatingList(props) {\n const {\n children,\n elementsRef,\n labelsRef\n } = props;\n const [nodes, setNodes] = React.useState(() => new Set());\n const register = React.useCallback(node => {\n setNodes(prevSet => new Set(prevSet).add(node));\n }, []);\n const unregister = React.useCallback(node => {\n setNodes(prevSet => {\n const set = new Set(prevSet);\n set.delete(node);\n return set;\n });\n }, []);\n const map = React.useMemo(() => {\n const newMap = new Map();\n const sortedNodes = Array.from(nodes.keys()).sort(sortByDocumentPosition);\n sortedNodes.forEach((node, index) => {\n newMap.set(node, index);\n });\n return newMap;\n }, [nodes]);\n return /*#__PURE__*/jsx(FloatingListContext.Provider, {\n value: React.useMemo(() => ({\n register,\n unregister,\n map,\n elementsRef,\n labelsRef\n }), [register, unregister, map, elementsRef, labelsRef]),\n children: children\n });\n}\n/**\n * Used to register a list item and its index (DOM position) in the\n * `FloatingList`.\n * @see https://floating-ui.com/docs/FloatingList#uselistitem\n */\nfunction useListItem(props) {\n if (props === void 0) {\n props = {};\n }\n const {\n label\n } = props;\n const {\n register,\n unregister,\n map,\n elementsRef,\n labelsRef\n } = React.useContext(FloatingListContext);\n const [index, setIndex] = React.useState(null);\n const componentRef = React.useRef(null);\n const ref = React.useCallback(node => {\n componentRef.current = node;\n if (index !== null) {\n elementsRef.current[index] = node;\n if (labelsRef) {\n var _node$textContent;\n const isLabelDefined = label !== undefined;\n labelsRef.current[index] = isLabelDefined ? label : (_node$textContent = node == null ? void 0 : node.textContent) != null ? _node$textContent : null;\n }\n }\n }, [index, elementsRef, labelsRef, label]);\n useModernLayoutEffect(() => {\n const node = componentRef.current;\n if (node) {\n register(node);\n return () => {\n unregister(node);\n };\n }\n }, [register, unregister]);\n useModernLayoutEffect(() => {\n const index = componentRef.current ? map.get(componentRef.current) : null;\n if (index != null) {\n setIndex(index);\n }\n }, [map]);\n return React.useMemo(() => ({\n ref,\n index: index == null ? -1 : index\n }), [index, ref]);\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst ACTIVE_KEY = 'active';\nconst SELECTED_KEY = 'selected';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction renderJsx(render, computedProps) {\n if (typeof render === 'function') {\n return render(computedProps);\n }\n if (render) {\n return /*#__PURE__*/React.cloneElement(render, computedProps);\n }\n return /*#__PURE__*/jsx(\"div\", {\n ...computedProps\n });\n}\nconst CompositeContext = /*#__PURE__*/React.createContext({\n activeIndex: 0,\n onNavigate: () => {}\n});\nconst horizontalKeys = [ARROW_LEFT, ARROW_RIGHT];\nconst verticalKeys = [ARROW_UP, ARROW_DOWN];\nconst allKeys = [...horizontalKeys, ...verticalKeys];\n\n/**\n * Creates a single tab stop whose items are navigated by arrow keys, which\n * provides list navigation outside of floating element contexts.\n *\n * This is useful to enable navigation of a list of items that aren’t part of a\n * floating element. A menubar is an example of a composite, with each reference\n * element being an item.\n * @see https://floating-ui.com/docs/Composite\n */\nconst Composite = /*#__PURE__*/React.forwardRef(function Composite(props, forwardedRef) {\n const {\n render,\n orientation = 'both',\n loop = true,\n rtl = false,\n cols = 1,\n disabledIndices,\n activeIndex: externalActiveIndex,\n onNavigate: externalSetActiveIndex,\n itemSizes,\n dense = false,\n ...domProps\n } = props;\n const [internalActiveIndex, internalSetActiveIndex] = React.useState(0);\n const activeIndex = externalActiveIndex != null ? externalActiveIndex : internalActiveIndex;\n const onNavigate = useEffectEvent(externalSetActiveIndex != null ? externalSetActiveIndex : internalSetActiveIndex);\n const elementsRef = React.useRef([]);\n const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n const contextValue = React.useMemo(() => ({\n activeIndex,\n onNavigate\n }), [activeIndex, onNavigate]);\n const isGrid = cols > 1;\n function handleKeyDown(event) {\n if (!allKeys.includes(event.key)) return;\n let nextIndex = activeIndex;\n const minIndex = getMinListIndex(elementsRef, disabledIndices);\n const maxIndex = getMaxListIndex(elementsRef, disabledIndices);\n const horizontalEndKey = rtl ? ARROW_LEFT : ARROW_RIGHT;\n const horizontalStartKey = rtl ? ARROW_RIGHT : ARROW_LEFT;\n if (isGrid) {\n const sizes = itemSizes || Array.from({\n length: elementsRef.current.length\n }, () => ({\n width: 1,\n height: 1\n }));\n // To calculate movements on the grid, we use hypothetical cell indices\n // as if every item was 1x1, then convert back to real indices.\n const cellMap = createGridCellMap(sizes, cols, dense);\n const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices));\n // last enabled index\n const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n const maybeNextIndex = cellMap[getGridNavigatedIndex({\n current: cellMap.map(itemIndex => itemIndex ? elementsRef.current[itemIndex] : null)\n }, {\n event,\n orientation,\n loop,\n rtl,\n cols,\n // treat undefined (empty grid spaces) as disabled indices so we\n // don't end up in them\n disabledIndices: getGridCellIndices([...((typeof disabledIndices !== 'function' ? disabledIndices : null) || elementsRef.current.map((_, index) => isListIndexDisabled(elementsRef, index, disabledIndices) ? index : undefined)), undefined], cellMap),\n minIndex: minGridIndex,\n maxIndex: maxGridIndex,\n prevIndex: getGridCellIndexOfCorner(activeIndex > maxIndex ? minIndex : activeIndex, sizes, cellMap, cols,\n // use a corner matching the edge closest to the direction we're\n // moving in so we don't end up in the same item. Prefer\n // top/left over bottom/right.\n event.key === ARROW_DOWN ? 'bl' : event.key === horizontalEndKey ? 'tr' : 'tl')\n })];\n if (maybeNextIndex != null) {\n nextIndex = maybeNextIndex;\n }\n }\n const toEndKeys = {\n horizontal: [horizontalEndKey],\n vertical: [ARROW_DOWN],\n both: [horizontalEndKey, ARROW_DOWN]\n }[orientation];\n const toStartKeys = {\n horizontal: [horizontalStartKey],\n vertical: [ARROW_UP],\n both: [horizontalStartKey, ARROW_UP]\n }[orientation];\n const preventedKeys = isGrid ? allKeys : {\n horizontal: horizontalKeys,\n vertical: verticalKeys,\n both: allKeys\n }[orientation];\n if (nextIndex === activeIndex && [...toEndKeys, ...toStartKeys].includes(event.key)) {\n if (loop && nextIndex === maxIndex && toEndKeys.includes(event.key)) {\n nextIndex = minIndex;\n } else if (loop && nextIndex === minIndex && toStartKeys.includes(event.key)) {\n nextIndex = maxIndex;\n } else {\n nextIndex = findNonDisabledListIndex(elementsRef, {\n startingIndex: nextIndex,\n decrement: toStartKeys.includes(event.key),\n disabledIndices\n });\n }\n }\n if (nextIndex !== activeIndex && !isIndexOutOfListBounds(elementsRef, nextIndex)) {\n var _elementsRef$current$;\n event.stopPropagation();\n if (preventedKeys.includes(event.key)) {\n event.preventDefault();\n }\n onNavigate(nextIndex);\n (_elementsRef$current$ = elementsRef.current[nextIndex]) == null || _elementsRef$current$.focus();\n }\n }\n const computedProps = {\n ...domProps,\n ...renderElementProps,\n ref: forwardedRef,\n 'aria-orientation': orientation === 'both' ? undefined : orientation,\n onKeyDown(e) {\n domProps.onKeyDown == null || domProps.onKeyDown(e);\n renderElementProps.onKeyDown == null || renderElementProps.onKeyDown(e);\n handleKeyDown(e);\n }\n };\n return /*#__PURE__*/jsx(CompositeContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/jsx(FloatingList, {\n elementsRef: elementsRef,\n children: renderJsx(render, computedProps)\n })\n });\n});\n/**\n * @see https://floating-ui.com/docs/Composite\n */\nconst CompositeItem = /*#__PURE__*/React.forwardRef(function CompositeItem(props, forwardedRef) {\n const {\n render,\n ...domProps\n } = props;\n const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n const {\n activeIndex,\n onNavigate\n } = React.useContext(CompositeContext);\n const {\n ref,\n index\n } = useListItem();\n const mergedRef = useMergeRefs([ref, forwardedRef, renderElementProps.ref]);\n const isActive = activeIndex === index;\n const computedProps = {\n ...domProps,\n ...renderElementProps,\n ref: mergedRef,\n tabIndex: isActive ? 0 : -1,\n 'data-active': isActive ? '' : undefined,\n onFocus(e) {\n domProps.onFocus == null || domProps.onFocus(e);\n renderElementProps.onFocus == null || renderElementProps.onFocus(e);\n onNavigate(index);\n }\n };\n return renderJsx(render, computedProps);\n});\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n ...React\n};\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => // Ensure the id is unique with multiple independent versions of Floating UI\n// on <React 18\n\"floating-ui-\" + Math.random().toString(36).slice(2, 6) + count++;\nfunction useFloatingId() {\n const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n useModernLayoutEffect(() => {\n if (id == null) {\n setId(genId());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n React.useEffect(() => {\n serverHandoffComplete = true;\n }, []);\n return id;\n}\nconst useReactId = SafeReact.useId;\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/react-utils#useid\n */\nconst useId = useReactId || useFloatingId;\n\nlet devMessageSet;\nif (process.env.NODE_ENV !== \"production\") {\n devMessageSet = /*#__PURE__*/new Set();\n}\nfunction warn() {\n var _devMessageSet;\n for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {\n messages[_key] = arguments[_key];\n }\n const message = \"Floating UI: \" + messages.join(' ');\n if (!((_devMessageSet = devMessageSet) != null && _devMessageSet.has(message))) {\n var _devMessageSet2;\n (_devMessageSet2 = devMessageSet) == null || _devMessageSet2.add(message);\n console.warn(message);\n }\n}\nfunction error() {\n var _devMessageSet3;\n for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n messages[_key2] = arguments[_key2];\n }\n const message = \"Floating UI: \" + messages.join(' ');\n if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {\n var _devMessageSet4;\n (_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);\n console.error(message);\n }\n}\n\n/**\n * Renders a pointing arrow triangle.\n * @see https://floating-ui.com/docs/FloatingArrow\n */\nconst FloatingArrow = /*#__PURE__*/React.forwardRef(function FloatingArrow(props, ref) {\n const {\n context: {\n placement,\n elements: {\n floating\n },\n middlewareData: {\n arrow,\n shift\n }\n },\n width = 14,\n height = 7,\n tipRadius = 0,\n strokeWidth = 0,\n staticOffset,\n stroke,\n d,\n style: {\n transform,\n ...restStyle\n } = {},\n ...rest\n } = props;\n if (process.env.NODE_ENV !== \"production\") {\n if (!ref) {\n warn('The `ref` prop is required for `FloatingArrow`.');\n }\n }\n const clipPathId = useId();\n const [isRTL, setIsRTL] = React.useState(false);\n\n // https://github.com/floating-ui/floating-ui/issues/2932\n useModernLayoutEffect(() => {\n if (!floating) return;\n const isRTL = getComputedStyle(floating).direction === 'rtl';\n if (isRTL) {\n setIsRTL(true);\n }\n }, [floating]);\n if (!floating) {\n return null;\n }\n const [side, alignment] = placement.split('-');\n const isVerticalSide = side === 'top' || side === 'bottom';\n let computedStaticOffset = staticOffset;\n if (isVerticalSide && shift != null && shift.x || !isVerticalSide && shift != null && shift.y) {\n computedStaticOffset = null;\n }\n\n // Strokes must be double the border width, this ensures the stroke's width\n // works as you'd expect.\n const computedStrokeWidth = strokeWidth * 2;\n const halfStrokeWidth = computedStrokeWidth / 2;\n const svgX = width / 2 * (tipRadius / -8 + 1);\n const svgY = height / 2 * tipRadius / 4;\n const isCustomShape = !!d;\n const yOffsetProp = computedStaticOffset && alignment === 'end' ? 'bottom' : 'top';\n let xOffsetProp = computedStaticOffset && alignment === 'end' ? 'right' : 'left';\n if (computedStaticOffset && isRTL) {\n xOffsetProp = alignment === 'end' ? 'left' : 'right';\n }\n const arrowX = (arrow == null ? void 0 : arrow.x) != null ? computedStaticOffset || arrow.x : '';\n const arrowY = (arrow == null ? void 0 : arrow.y) != null ? computedStaticOffset || arrow.y : '';\n const dValue = d || 'M0,0' + (\" H\" + width) + (\" L\" + (width - svgX) + \",\" + (height - svgY)) + (\" Q\" + width / 2 + \",\" + height + \" \" + svgX + \",\" + (height - svgY)) + ' Z';\n const rotation = {\n top: isCustomShape ? 'rotate(180deg)' : '',\n left: isCustomShape ? 'rotate(90deg)' : 'rotate(-90deg)',\n bottom: isCustomShape ? '' : 'rotate(180deg)',\n right: isCustomShape ? 'rotate(-90deg)' : 'rotate(90deg)'\n }[side];\n return /*#__PURE__*/jsxs(\"svg\", {\n ...rest,\n \"aria-hidden\": true,\n ref: ref,\n width: isCustomShape ? width : width + computedStrokeWidth,\n height: width,\n viewBox: \"0 0 \" + width + \" \" + (height > width ? height : width),\n style: {\n position: 'absolute',\n pointerEvents: 'none',\n [xOffsetProp]: arrowX,\n [yOffsetProp]: arrowY,\n [side]: isVerticalSide || isCustomShape ? '100%' : \"calc(100% - \" + computedStrokeWidth / 2 + \"px)\",\n transform: [rotation, transform].filter(t => !!t).join(' '),\n ...restStyle\n },\n children: [computedStrokeWidth > 0 && /*#__PURE__*/jsx(\"path\", {\n clipPath: \"url(#\" + clipPathId + \")\",\n fill: \"none\",\n stroke: stroke\n // Account for the stroke on the fill path rendered below.\n ,\n strokeWidth: computedStrokeWidth + (d ? 0 : 1),\n d: dValue\n }), /*#__PURE__*/jsx(\"path\", {\n stroke: computedStrokeWidth && !d ? rest.fill : 'none',\n d: dValue\n }), /*#__PURE__*/jsx(\"clipPath\", {\n id: clipPathId,\n children: /*#__PURE__*/jsx(\"rect\", {\n x: -halfStrokeWidth,\n y: halfStrokeWidth * (isCustomShape ? -1 : 1),\n width: width + computedStrokeWidth,\n height: width\n })\n })]\n });\n});\n\nfunction createEventEmitter() {\n const map = new Map();\n return {\n emit(event, data) {\n var _map$get;\n (_map$get = map.get(event)) == null || _map$get.forEach(listener => listener(data));\n },\n on(event, listener) {\n if (!map.has(event)) {\n map.set(event, new Set());\n }\n map.get(event).add(listener);\n },\n off(event, listener) {\n var _map$get2;\n (_map$get2 = map.get(event)) == null || _map$get2.delete(listener);\n }\n };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the parent node id for nested floating elements, if available.\n * Returns `null` for top-level floating elements.\n */\nconst useFloatingParentNodeId = () => {\n var _React$useContext;\n return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\n\n/**\n * Returns the nearest floating tree context, if available.\n */\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the `FloatingTree`, returning its id.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction useFloatingNodeId(customParentId) {\n const id = useId();\n const tree = useFloatingTree();\n const reactParentId = useFloatingParentNodeId();\n const parentId = customParentId || reactParentId;\n useModernLayoutEffect(() => {\n if (!id) return;\n const node = {\n id,\n parentId\n };\n tree == null || tree.addNode(node);\n return () => {\n tree == null || tree.removeNode(node);\n };\n }, [tree, id, parentId]);\n return id;\n}\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingNode(props) {\n const {\n children,\n id\n } = props;\n const parentId = useFloatingParentNodeId();\n return /*#__PURE__*/jsx(FloatingNodeContext.Provider, {\n value: React.useMemo(() => ({\n id,\n parentId\n }), [id, parentId]),\n children: children\n });\n}\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM.\n * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:\n * - The `bubbles` option in the `useDismiss()` Hook\n * - Nested virtual list navigation\n * - Nested floating elements that each open on hover\n * - Custom communication between parent and child floating elements\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingTree(props) {\n const {\n children\n } = props;\n const nodesRef = React.useRef([]);\n const addNode = React.useCallback(node => {\n nodesRef.current = [...nodesRef.current, node];\n }, []);\n const removeNode = React.useCallback(node => {\n nodesRef.current = nodesRef.current.filter(n => n !== node);\n }, []);\n const [events] = React.useState(() => createEventEmitter());\n return /*#__PURE__*/jsx(FloatingTreeContext.Provider, {\n value: React.useMemo(() => ({\n nodesRef,\n addNode,\n removeNode,\n events\n }), [addNode, removeNode, events]),\n children: children\n });\n}\n\nfunction createAttribute(name) {\n return \"data-floating-ui-\" + name;\n}\n\nfunction clearTimeoutIfSet(timeoutRef) {\n if (timeoutRef.current !== -1) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = -1;\n }\n}\n\nconst safePolygonIdentifier = /*#__PURE__*/createAttribute('safe-polygon');\nfunction getDelay(value, prop, pointerType) {\n if (pointerType && !isMouseLikePointerType(pointerType)) {\n return 0;\n }\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'function') {\n const result = value();\n if (typeof result === 'number') {\n return result;\n }\n return result == null ? void 0 : result[prop];\n }\n return value == null ? void 0 : value[prop];\n}\nfunction getRestMs(value) {\n if (typeof value === 'function') {\n return value();\n }\n return value;\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nfunction useHover(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n dataRef,\n events,\n elements\n } = context;\n const {\n enabled = true,\n delay = 0,\n handleClose = null,\n mouseOnly = false,\n restMs = 0,\n move = true\n } = props;\n const tree = useFloatingTree();\n const parentId = useFloatingParentNodeId();\n const handleCloseRef = useLatestRef(handleClose);\n const delayRef = useLatestRef(delay);\n const openRef = useLatestRef(open);\n const restMsRef = useLatestRef(restMs);\n const pointerTypeRef = React.useRef();\n const timeoutRef = React.useRef(-1);\n const handlerRef = React.useRef();\n const restTimeoutRef = React.useRef(-1);\n const blockMouseMoveRef = React.useRef(true);\n const performedPointerEventsMutationRef = React.useRef(false);\n const unbindMouseMoveRef = React.useRef(() => {});\n const restTimeoutPendingRef = React.useRef(false);\n const isHoverOpen = useEffectEvent(() => {\n var _dataRef$current$open;\n const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n });\n\n // When closing before opening, clear the delay timeouts to cancel it\n // from showing.\n React.useEffect(() => {\n if (!enabled) return;\n function onOpenChange(_ref) {\n let {\n open\n } = _ref;\n if (!open) {\n clearTimeoutIfSet(timeoutRef);\n clearTimeoutIfSet(restTimeoutRef);\n blockMouseMoveRef.current = true;\n restTimeoutPendingRef.current = false;\n }\n }\n events.on('openchange', onOpenChange);\n return () => {\n events.off('openchange', onOpenChange);\n };\n }, [enabled, events]);\n React.useEffect(() => {\n if (!enabled) return;\n if (!handleCloseRef.current) return;\n if (!open) return;\n function onLeave(event) {\n if (isHoverOpen()) {\n onOpenChange(false, event, 'hover');\n }\n }\n const html = getDocument$1(elements.floating).documentElement;\n html.addEventListener('mouseleave', onLeave);\n return () => {\n html.removeEventListener('mouseleave', onLeave);\n };\n }, [elements.floating, open, onOpenChange, enabled, handleCloseRef, isHoverOpen]);\n const closeWithDelay = React.useCallback(function (event, runElseBranch, reason) {\n if (runElseBranch === void 0) {\n runElseBranch = true;\n }\n if (reason === void 0) {\n reason = 'hover';\n }\n const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n if (closeDelay && !handlerRef.current) {\n clearTimeoutIfSet(timeoutRef);\n timeoutRef.current = window.setTimeout(() => onOpenChange(false, event, reason), closeDelay);\n } else if (runElseBranch) {\n clearTimeoutIfSet(timeoutRef);\n onOpenChange(false, event, reason);\n }\n }, [delayRef, onOpenChange]);\n const cleanupMouseMoveHandler = useEffectEvent(() => {\n unbindMouseMoveRef.current();\n handlerRef.current = undefined;\n });\n const clearPointerEvents = useEffectEvent(() => {\n if (performedPointerEventsMutationRef.current) {\n const body = getDocument$1(elements.floating).body;\n body.style.pointerEvents = '';\n body.removeAttribute(safePolygonIdentifier);\n performedPointerEventsMutationRef.current = false;\n }\n });\n const isClickLikeOpenEvent = useEffectEvent(() => {\n return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n });\n\n // Registering the mouse events on the reference directly to bypass React's\n // delegation system. If the cursor was on a disabled element and then entered\n // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n React.useEffect(() => {\n if (!enabled) return;\n function onReferenceMouseEnter(event) {\n clearTimeoutIfSet(timeoutRef);\n blockMouseMoveRef.current = false;\n if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || getRestMs(restMsRef.current) > 0 && !getDelay(delayRef.current, 'open')) {\n return;\n }\n const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n if (openDelay) {\n timeoutRef.current = window.setTimeout(() => {\n if (!openRef.current) {\n onOpenChange(true, event, 'hover');\n }\n }, openDelay);\n } else if (!open) {\n onOpenChange(true, event, 'hover');\n }\n }\n function onReferenceMouseLeave(event) {\n if (isClickLikeOpenEvent()) {\n clearPointerEvents();\n return;\n }\n unbindMouseMoveRef.current();\n const doc = getDocument$1(elements.floating);\n clearTimeoutIfSet(restTimeoutRef);\n restTimeoutPendingRef.current = false;\n if (handleCloseRef.current && dataRef.current.floatingContext) {\n // Prevent clearing `onScrollMouseLeave` timeout.\n if (!open) {\n clearTimeoutIfSet(timeoutRef);\n }\n handlerRef.current = handleCloseRef.current({\n ...dataRef.current.floatingContext,\n tree,\n x: event.clientX,\n y: event.clientY,\n onClose() {\n clearPointerEvents();\n cleanupMouseMoveHandler();\n if (!isClickLikeOpenEvent()) {\n closeWithDelay(event, true, 'safe-polygon');\n }\n }\n });\n const handler = handlerRef.current;\n doc.addEventListener('mousemove', handler);\n unbindMouseMoveRef.current = () => {\n doc.removeEventListener('mousemove', handler);\n };\n return;\n }\n\n // Allow interactivity without `safePolygon` on touch devices. With a\n // pointer, a short close delay is an alternative, so it should work\n // consistently.\n const shouldClose = pointerTypeRef.current === 'touch' ? !contains$1(elements.floating, event.relatedTarget) : true;\n if (shouldClose) {\n closeWithDelay(event);\n }\n }\n\n // Ensure the floating element closes after scrolling even if the pointer\n // did not move.\n // https://github.com/floating-ui/floating-ui/discussions/1692\n function onScrollMouseLeave(event) {\n if (isClickLikeOpenEvent()) return;\n if (!dataRef.current.floatingContext) return;\n handleCloseRef.current == null || handleCloseRef.current({\n ...dataRef.current.floatingContext,\n tree,\n x: event.clientX,\n y: event.clientY,\n onClose() {\n clearPointerEvents();\n cleanupMouseMoveHandler();\n if (!isClickLikeOpenEvent()) {\n closeWithDelay(event);\n }\n }\n })(event);\n }\n function onFloatingMouseEnter() {\n clearTimeoutIfSet(timeoutRef);\n }\n function onFloatingMouseLeave(event) {\n if (!isClickLikeOpenEvent()) {\n closeWithDelay(event, false);\n }\n }\n if (isElement(elements.domReference)) {\n const reference = elements.domReference;\n const floating = elements.floating;\n if (open) {\n reference.addEventListener('mouseleave', onScrollMouseLeave);\n }\n if (move) {\n reference.addEventListener('mousemove', onReferenceMouseEnter, {\n once: true\n });\n }\n reference.addEventListener('mouseenter', onReferenceMouseEnter);\n reference.addEventListener('mouseleave', onReferenceMouseLeave);\n if (floating) {\n floating.addEventListener('mouseleave', onScrollMouseLeave);\n floating.addEventListener('mouseenter', onFloatingMouseEnter);\n floating.addEventListener('mouseleave', onFloatingMouseLeave);\n }\n return () => {\n if (open) {\n reference.removeEventListener('mouseleave', onScrollMouseLeave);\n }\n if (move) {\n reference.removeEventListener('mousemove', onReferenceMouseEnter);\n }\n reference.removeEventListener('mouseenter', onReferenceMouseEnter);\n reference.removeEventListener('mouseleave', onReferenceMouseLeave);\n if (floating) {\n floating.removeEventListener('mouseleave', onScrollMouseLeave);\n floating.removeEventListener('mouseenter', onFloatingMouseEnter);\n floating.removeEventListener('mouseleave', onFloatingMouseLeave);\n }\n };\n }\n }, [elements, enabled, context, mouseOnly, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, openRef, tree, delayRef, handleCloseRef, dataRef, isClickLikeOpenEvent, restMsRef]);\n\n // Block pointer-events of every element other than the reference and floating\n // while the floating element is open and has a `handleClose` handler. Also\n // handles nested floating elements.\n // https://github.com/floating-ui/floating-ui/issues/1722\n useModernLayoutEffect(() => {\n var _handleCloseRef$curre;\n if (!enabled) return;\n if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && (_handleCloseRef$curre = _handleCloseRef$curre.__options) != null && _handleCloseRef$curre.blockPointerEvents && isHoverOpen()) {\n performedPointerEventsMutationRef.current = true;\n const floatingEl = elements.floating;\n if (isElement(elements.domReference) && floatingEl) {\n var _tree$nodesRef$curren;\n const body = getDocument$1(elements.floating).body;\n body.setAttribute(safePolygonIdentifier, '');\n const ref = elements.domReference;\n const parentFloating = tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren.elements.floating;\n if (parentFloating) {\n parentFloating.style.pointerEvents = '';\n }\n body.style.pointerEvents = 'none';\n ref.style.pointerEvents = 'auto';\n floatingEl.style.pointerEvents = 'auto';\n return () => {\n body.style.pointerEvents = '';\n ref.style.pointerEvents = '';\n floatingEl.style.pointerEvents = '';\n };\n }\n }\n }, [enabled, open, parentId, elements, tree, handleCloseRef, isHoverOpen]);\n useModernLayoutEffect(() => {\n if (!open) {\n pointerTypeRef.current = undefined;\n restTimeoutPendingRef.current = false;\n cleanupMouseMoveHandler();\n clearPointerEvents();\n }\n }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n React.useEffect(() => {\n return () => {\n cleanupMouseMoveHandler();\n clearTimeoutIfSet(timeoutRef);\n clearTimeoutIfSet(restTimeoutRef);\n clearPointerEvents();\n };\n }, [enabled, elements.domReference, cleanupMouseMoveHandler, clearPointerEvents]);\n const reference = React.useMemo(() => {\n function setPointerRef(event) {\n pointerTypeRef.current = event.pointerType;\n }\n return {\n onPointerDown: setPointerRef,\n onPointerEnter: setPointerRef,\n onMouseMove(event) {\n const {\n nativeEvent\n } = event;\n function handleMouseMove() {\n if (!blockMouseMoveRef.current && !openRef.current) {\n onOpenChange(true, nativeEvent, 'hover');\n }\n }\n if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {\n return;\n }\n if (open || getRestMs(restMsRef.current) === 0) {\n return;\n }\n\n // Ignore insignificant movements to account for tremors.\n if (restTimeoutPendingRef.current && event.movementX ** 2 + event.movementY ** 2 < 2) {\n return;\n }\n clearTimeoutIfSet(restTimeoutRef);\n if (pointerTypeRef.current === 'touch') {\n handleMouseMove();\n } else {\n restTimeoutPendingRef.current = true;\n restTimeoutRef.current = window.setTimeout(handleMouseMove, getRestMs(restMsRef.current));\n }\n }\n };\n }, [mouseOnly, onOpenChange, open, openRef, restMsRef]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nconst NOOP = () => {};\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n delay: 0,\n initialDelay: 0,\n timeoutMs: 0,\n currentId: null,\n setCurrentId: NOOP,\n setState: NOOP,\n isInstantPhase: false\n});\n\n/**\n * @deprecated\n * Use the return value of `useDelayGroup()` instead.\n */\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction FloatingDelayGroup(props) {\n const {\n children,\n delay,\n timeoutMs = 0\n } = props;\n const [state, setState] = React.useReducer((prev, next) => ({\n ...prev,\n ...next\n }), {\n delay,\n timeoutMs,\n initialDelay: delay,\n currentId: null,\n isInstantPhase: false\n });\n const initialCurrentIdRef = React.useRef(null);\n const setCurrentId = React.useCallback(currentId => {\n setState({\n currentId\n });\n }, []);\n useModernLayoutEffect(() => {\n if (state.currentId) {\n if (initialCurrentIdRef.current === null) {\n initialCurrentIdRef.current = state.currentId;\n } else if (!state.isInstantPhase) {\n setState({\n isInstantPhase: true\n });\n }\n } else {\n if (state.isInstantPhase) {\n setState({\n isInstantPhase: false\n });\n }\n initialCurrentIdRef.current = null;\n }\n }, [state.currentId, state.isInstantPhase]);\n return /*#__PURE__*/jsx(FloatingDelayGroupContext.Provider, {\n value: React.useMemo(() => ({\n ...state,\n setState,\n setCurrentId\n }), [state, setCurrentId]),\n children: children\n });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `FloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useDelayGroup(context, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n open,\n onOpenChange,\n floatingId\n } = context;\n const {\n id: optionId,\n enabled = true\n } = options;\n const id = optionId != null ? optionId : floatingId;\n const groupContext = useDelayGroupContext();\n const {\n currentId,\n setCurrentId,\n initialDelay,\n setState,\n timeoutMs\n } = groupContext;\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!currentId) return;\n setState({\n delay: {\n open: 1,\n close: getDelay(initialDelay, 'close')\n }\n });\n if (currentId !== id) {\n onOpenChange(false);\n }\n }, [enabled, id, onOpenChange, setState, currentId, initialDelay]);\n useModernLayoutEffect(() => {\n function unset() {\n onOpenChange(false);\n setState({\n delay: initialDelay,\n currentId: null\n });\n }\n if (!enabled) return;\n if (!currentId) return;\n if (!open && currentId === id) {\n if (timeoutMs) {\n const timeout = window.setTimeout(unset, timeoutMs);\n return () => {\n clearTimeout(timeout);\n };\n }\n unset();\n }\n }, [enabled, open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (setCurrentId === NOOP || !open) return;\n setCurrentId(id);\n }, [enabled, open, setCurrentId, id]);\n return groupContext;\n}\n\nconst NextFloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n hasProvider: false,\n timeoutMs: 0,\n delayRef: {\n current: 0\n },\n initialDelayRef: {\n current: 0\n },\n timeoutIdRef: {\n current: -1\n },\n currentIdRef: {\n current: null\n },\n currentContextRef: {\n current: null\n }\n});\n/**\n * Experimental next version of `FloatingDelayGroup` to become the default\n * in the future. This component is not yet stable.\n * Provides context for a group of floating elements that should share a\n * `delay`. Unlike `FloatingDelayGroup`, `useNextDelayGroup` with this\n * component does not cause a re-render of unrelated consumers of the\n * context when the delay changes.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction NextFloatingDelayGroup(props) {\n const {\n children,\n delay,\n timeoutMs = 0\n } = props;\n const delayRef = React.useRef(delay);\n const initialDelayRef = React.useRef(delay);\n const currentIdRef = React.useRef(null);\n const currentContextRef = React.useRef(null);\n const timeoutIdRef = React.useRef(-1);\n return /*#__PURE__*/jsx(NextFloatingDelayGroupContext.Provider, {\n value: React.useMemo(() => ({\n hasProvider: true,\n delayRef,\n initialDelayRef,\n currentIdRef,\n timeoutMs,\n currentContextRef,\n timeoutIdRef\n }), [timeoutMs]),\n children: children\n });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `NextFloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useNextDelayGroup(context, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n open,\n onOpenChange,\n floatingId\n } = context;\n const {\n enabled = true\n } = options;\n const groupContext = React.useContext(NextFloatingDelayGroupContext);\n const {\n currentIdRef,\n delayRef,\n timeoutMs,\n initialDelayRef,\n currentContextRef,\n hasProvider,\n timeoutIdRef\n } = groupContext;\n const [isInstantPhase, setIsInstantPhase] = React.useState(false);\n useModernLayoutEffect(() => {\n function unset() {\n var _currentContextRef$cu;\n setIsInstantPhase(false);\n (_currentContextRef$cu = currentContextRef.current) == null || _currentContextRef$cu.setIsInstantPhase(false);\n currentIdRef.current = null;\n currentContextRef.current = null;\n delayRef.current = initialDelayRef.current;\n }\n if (!enabled) return;\n if (!currentIdRef.current) return;\n if (!open && currentIdRef.current === floatingId) {\n setIsInstantPhase(false);\n if (timeoutMs) {\n timeoutIdRef.current = window.setTimeout(unset, timeoutMs);\n return () => {\n clearTimeout(timeoutIdRef.current);\n };\n }\n unset();\n }\n }, [enabled, open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!open) return;\n const prevContext = currentContextRef.current;\n const prevId = currentIdRef.current;\n currentContextRef.current = {\n onOpenChange,\n setIsInstantPhase\n };\n currentIdRef.current = floatingId;\n delayRef.current = {\n open: 0,\n close: getDelay(initialDelayRef.current, 'close')\n };\n if (prevId !== null && prevId !== floatingId) {\n clearTimeoutIfSet(timeoutIdRef);\n setIsInstantPhase(true);\n prevContext == null || prevContext.setIsInstantPhase(true);\n prevContext == null || prevContext.onOpenChange(false);\n } else {\n setIsInstantPhase(false);\n prevContext == null || prevContext.setIsInstantPhase(false);\n }\n }, [enabled, open, floatingId, onOpenChange, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n useModernLayoutEffect(() => {\n return () => {\n currentContextRef.current = null;\n };\n }, [currentContextRef]);\n return React.useMemo(() => ({\n hasProvider,\n delayRef,\n isInstantPhase\n }), [hasProvider, delayRef, isInstantPhase]);\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n preventScroll = false,\n cancelPrevious = true,\n sync = false\n } = options;\n cancelPrevious && cancelAnimationFrame(rafId);\n const exec = () => el == null ? void 0 : el.focus({\n preventScroll\n });\n if (sync) {\n exec();\n } else {\n rafId = requestAnimationFrame(exec);\n }\n}\n\nfunction contains(parent, child) {\n if (!parent || !child) {\n return false;\n }\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n // First, attempt with faster native method\n if (parent.contains(child)) {\n return true;\n }\n\n // then fallback to custom implementation with Shadow DOM support\n if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n while (next) {\n if (parent === next) {\n return true;\n }\n // @ts-ignore\n next = next.parentNode || next.host;\n }\n }\n\n // Give up, the result is false\n return false;\n}\nfunction getTarget(event) {\n if ('composedPath' in event) {\n return event.composedPath()[0];\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support\n // `composedPath()`, but browsers without shadow DOM don't.\n return event.target;\n}\nfunction getDocument(node) {\n return (node == null ? void 0 : node.ownerDocument) || document;\n}\n\n// Modified to add conditional `aria-hidden` support:\n// https://github.com/theKashey/aria-hidden/blob/9220c8f4a4fd35f63bee5510a9f41a37264382d4/src/index.ts\nconst counters = {\n inert: /*#__PURE__*/new WeakMap(),\n 'aria-hidden': /*#__PURE__*/new WeakMap(),\n none: /*#__PURE__*/new WeakMap()\n};\nfunction getCounterMap(control) {\n if (control === 'inert') return counters.inert;\n if (control === 'aria-hidden') return counters['aria-hidden'];\n return counters.none;\n}\nlet uncontrolledElementsSet = /*#__PURE__*/new WeakSet();\nlet markerMap = {};\nlet lockCount$1 = 0;\nconst supportsInert = () => typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\nfunction unwrapHost(node) {\n if (!node) {\n return null;\n }\n return isShadowRoot(node) ? node.host : unwrapHost(node.parentNode);\n}\nconst correctElements = (parent, targets) => targets.map(target => {\n if (parent.contains(target)) {\n return target;\n }\n const correctedTarget = unwrapHost(target);\n if (parent.contains(correctedTarget)) {\n return correctedTarget;\n }\n return null;\n}).filter(x => x != null);\nfunction applyAttributeToOthers(uncorrectedAvoidElements, body, ariaHidden, inert) {\n const markerName = 'data-floating-ui-inert';\n const controlAttribute = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n const avoidElements = correctElements(body, uncorrectedAvoidElements);\n const elementsToKeep = new Set();\n const elementsToStop = new Set(avoidElements);\n const hiddenElements = [];\n if (!markerMap[markerName]) {\n markerMap[markerName] = new WeakMap();\n }\n const markerCounter = markerMap[markerName];\n avoidElements.forEach(keep);\n deep(body);\n elementsToKeep.clear();\n function keep(el) {\n if (!el || elementsToKeep.has(el)) {\n return;\n }\n elementsToKeep.add(el);\n el.parentNode && keep(el.parentNode);\n }\n function deep(parent) {\n if (!parent || elementsToStop.has(parent)) {\n return;\n }\n [].forEach.call(parent.children, node => {\n if (getNodeName(node) === 'script') return;\n if (elementsToKeep.has(node)) {\n deep(node);\n } else {\n const attr = controlAttribute ? node.getAttribute(controlAttribute) : null;\n const alreadyHidden = attr !== null && attr !== 'false';\n const counterMap = getCounterMap(controlAttribute);\n const counterValue = (counterMap.get(node) || 0) + 1;\n const markerValue = (markerCounter.get(node) || 0) + 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n hiddenElements.push(node);\n if (counterValue === 1 && alreadyHidden) {\n uncontrolledElementsSet.add(node);\n }\n if (markerValue === 1) {\n node.setAttribute(markerName, '');\n }\n if (!alreadyHidden && controlAttribute) {\n node.setAttribute(controlAttribute, controlAttribute === 'inert' ? '' : 'true');\n }\n }\n });\n }\n lockCount$1++;\n return () => {\n hiddenElements.forEach(element => {\n const counterMap = getCounterMap(controlAttribute);\n const currentCounterValue = counterMap.get(element) || 0;\n const counterValue = currentCounterValue - 1;\n const markerValue = (markerCounter.get(element) || 0) - 1;\n counterMap.set(element, counterValue);\n markerCounter.set(element, markerValue);\n if (!counterValue) {\n if (!uncontrolledElementsSet.has(element) && controlAttribute) {\n element.removeAttribute(controlAttribute);\n }\n uncontrolledElementsSet.delete(element);\n }\n if (!markerValue) {\n element.removeAttribute(markerName);\n }\n });\n lockCount$1--;\n if (!lockCount$1) {\n counters.inert = new WeakMap();\n counters['aria-hidden'] = new WeakMap();\n counters.none = new WeakMap();\n uncontrolledElementsSet = new WeakSet();\n markerMap = {};\n }\n };\n}\nfunction markOthers(avoidElements, ariaHidden, inert) {\n if (ariaHidden === void 0) {\n ariaHidden = false;\n }\n if (inert === void 0) {\n inert = false;\n }\n const body = getDocument(avoidElements[0]).body;\n return applyAttributeToOthers(avoidElements.concat(Array.from(body.querySelectorAll('[aria-live],[role=\"status\"],output'))), body, ariaHidden, inert);\n}\n\nconst HIDDEN_STYLES = {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: '-1px',\n overflow: 'hidden',\n padding: 0,\n position: 'fixed',\n whiteSpace: 'nowrap',\n width: '1px',\n top: 0,\n left: 0\n};\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n const [role, setRole] = React.useState();\n useModernLayoutEffect(() => {\n if (isSafari()) {\n // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n // on VoiceOver does trigger the onFocus event, so we can use the focus\n // trap element. On Safari, only buttons trigger the onFocus event.\n // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n // button role.\n setRole('button');\n }\n }, []);\n const restProps = {\n ref,\n tabIndex: 0,\n // Role is only for VoiceOver\n role,\n 'aria-hidden': role ? undefined : true,\n [createAttribute('focus-guard')]: '',\n style: HIDDEN_STYLES\n };\n return /*#__PURE__*/jsx(\"span\", {\n ...props,\n ...restProps\n });\n});\n\nconst HIDDEN_OWNER_STYLES = {\n clipPath: 'inset(50%)',\n position: 'fixed',\n top: 0,\n left: 0\n};\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst attr = /*#__PURE__*/createAttribute('portal');\n/**\n * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode\n */\nfunction useFloatingPortalNode(props) {\n if (props === void 0) {\n props = {};\n }\n const {\n id,\n root\n } = props;\n const uniqueId = useId();\n const portalContext = usePortalContext();\n const [portalNode, setPortalNode] = React.useState(null);\n const portalNodeRef = React.useRef(null);\n useModernLayoutEffect(() => {\n return () => {\n portalNode == null || portalNode.remove();\n // Allow the subsequent layout effects to create a new node on updates.\n // The portal node will still be cleaned up on unmount.\n // https://github.com/floating-ui/floating-ui/issues/2454\n queueMicrotask(() => {\n portalNodeRef.current = null;\n });\n };\n }, [portalNode]);\n useModernLayoutEffect(() => {\n // Wait for the uniqueId to be generated before creating the portal node in\n // React <18 (using `useFloatingId` instead of the native `useId`).\n // https://github.com/floating-ui/floating-ui/issues/2778\n if (!uniqueId) return;\n if (portalNodeRef.current) return;\n const existingIdRoot = id ? document.getElementById(id) : null;\n if (!existingIdRoot) return;\n const subRoot = document.createElement('div');\n subRoot.id = uniqueId;\n subRoot.setAttribute(attr, '');\n existingIdRoot.appendChild(subRoot);\n portalNodeRef.current = subRoot;\n setPortalNode(subRoot);\n }, [id, uniqueId]);\n useModernLayoutEffect(() => {\n // Wait for the root to exist before creating the portal node. The root must\n // be stored in state, not a ref, for this to work reactively.\n if (root === null) return;\n if (!uniqueId) return;\n if (portalNodeRef.current) return;\n let container = root || (portalContext == null ? void 0 : portalContext.portalNode);\n if (container && !isNode(container)) container = container.current;\n container = container || document.body;\n let idWrapper = null;\n if (id) {\n idWrapper = document.createElement('div');\n idWrapper.id = id;\n container.appendChild(idWrapper);\n }\n const subRoot = document.createElement('div');\n subRoot.id = uniqueId;\n subRoot.setAttribute(attr, '');\n container = idWrapper || container;\n container.appendChild(subRoot);\n portalNodeRef.current = subRoot;\n setPortalNode(subRoot);\n }, [id, root, uniqueId, portalContext]);\n return portalNode;\n}\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * This is necessary to ensure the floating element can appear outside any\n * potential parent containers that cause clipping (such as `overflow: hidden`),\n * while retaining its location in the React tree.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nfunction FloatingPortal(props) {\n const {\n children,\n id,\n root,\n preserveTabOrder = true\n } = props;\n const portalNode = useFloatingPortalNode({\n id,\n root\n });\n const [focusManagerState, setFocusManagerState] = React.useState(null);\n const beforeOutsideRef = React.useRef(null);\n const afterOutsideRef = React.useRef(null);\n const beforeInsideRef = React.useRef(null);\n const afterInsideRef = React.useRef(null);\n const modal = focusManagerState == null ? void 0 : focusManagerState.modal;\n const open = focusManagerState == null ? void 0 : focusManagerState.open;\n const shouldRenderGuards =\n // The FocusManager and therefore floating element are currently open/\n // rendered.\n !!focusManagerState &&\n // Guards are only for non-modal focus management.\n !focusManagerState.modal &&\n // Don't render if unmount is transitioning.\n focusManagerState.open && preserveTabOrder && !!(root || portalNode);\n\n // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n React.useEffect(() => {\n if (!portalNode || !preserveTabOrder || modal) {\n return;\n }\n\n // Make sure elements inside the portal element are tabbable only when the\n // portal has already been focused, either by tabbing into a focus trap\n // element outside or using the mouse.\n function onFocus(event) {\n if (portalNode && isOutsideEvent(event)) {\n const focusing = event.type === 'focusin';\n const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n manageFocus(portalNode);\n }\n }\n // Listen to the event on the capture phase so they run before the focus\n // trap elements onFocus prop is called.\n portalNode.addEventListener('focusin', onFocus, true);\n portalNode.addEventListener('focusout', onFocus, true);\n return () => {\n portalNode.removeEventListener('focusin', onFocus, true);\n portalNode.removeEventListener('focusout', onFocus, true);\n };\n }, [portalNode, preserveTabOrder, modal]);\n React.useEffect(() => {\n if (!portalNode) return;\n if (open) return;\n enableFocusInside(portalNode);\n }, [open, portalNode]);\n return /*#__PURE__*/jsxs(PortalContext.Provider, {\n value: React.useMemo(() => ({\n preserveTabOrder,\n beforeOutsideRef,\n afterOutsideRef,\n beforeInsideRef,\n afterInsideRef,\n portalNode,\n setFocusManagerState\n }), [preserveTabOrder, portalNode]),\n children: [shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"outside\",\n ref: beforeOutsideRef,\n onFocus: event => {\n if (isOutsideEvent(event, portalNode)) {\n var _beforeInsideRef$curr;\n (_beforeInsideRef$curr = beforeInsideRef.current) == null || _beforeInsideRef$curr.focus();\n } else {\n const domReference = focusManagerState ? focusManagerState.domReference : null;\n const prevTabbable = getPreviousTabbable(domReference);\n prevTabbable == null || prevTabbable.focus();\n }\n }\n }), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(\"span\", {\n \"aria-owns\": portalNode.id,\n style: HIDDEN_OWNER_STYLES\n }), portalNode && /*#__PURE__*/ReactDOM.createPortal(children, portalNode), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"outside\",\n ref: afterOutsideRef,\n onFocus: event => {\n if (isOutsideEvent(event, portalNode)) {\n var _afterInsideRef$curre;\n (_afterInsideRef$curre = afterInsideRef.current) == null || _afterInsideRef$curre.focus();\n } else {\n const domReference = focusManagerState ? focusManagerState.domReference : null;\n const nextTabbable = getNextTabbable(domReference);\n nextTabbable == null || nextTabbable.focus();\n (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, event.nativeEvent, 'focus-out'));\n }\n }\n })]\n });\n}\nconst usePortalContext = () => React.useContext(PortalContext);\n\nfunction useLiteMergeRefs(refs) {\n return React.useMemo(() => {\n return value => {\n refs.forEach(ref => {\n if (ref) {\n ref.current = value;\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n\nconst LIST_LIMIT = 20;\nlet previouslyFocusedElements = [];\nfunction clearDisconnectedPreviouslyFocusedElements() {\n previouslyFocusedElements = previouslyFocusedElements.filter(elementRef => {\n var _elementRef$deref;\n return (_elementRef$deref = elementRef.deref()) == null ? void 0 : _elementRef$deref.isConnected;\n });\n}\nfunction addPreviouslyFocusedElement(element) {\n clearDisconnectedPreviouslyFocusedElements();\n if (element && getNodeName(element) !== 'body') {\n previouslyFocusedElements.push(new WeakRef(element));\n if (previouslyFocusedElements.length > LIST_LIMIT) {\n previouslyFocusedElements = previouslyFocusedElements.slice(-LIST_LIMIT);\n }\n }\n}\nfunction getPreviouslyFocusedElement() {\n clearDisconnectedPreviouslyFocusedElements();\n const elementRef = previouslyFocusedElements[previouslyFocusedElements.length - 1];\n return elementRef == null ? void 0 : elementRef.deref();\n}\nfunction getFirstTabbableElement(container) {\n const tabbableOptions = getTabbableOptions();\n if (isTabbable(container, tabbableOptions)) {\n return container;\n }\n return tabbable(container, tabbableOptions)[0] || container;\n}\nfunction handleTabIndex(floatingFocusElement, orderRef) {\n var _floatingFocusElement;\n if (!orderRef.current.includes('floating') && !((_floatingFocusElement = floatingFocusElement.getAttribute('role')) != null && _floatingFocusElement.includes('dialog'))) {\n return;\n }\n const options = getTabbableOptions();\n const focusableElements = focusable(floatingFocusElement, options);\n const tabbableContent = focusableElements.filter(element => {\n const dataTabIndex = element.getAttribute('data-tabindex') || '';\n return isTabbable(element, options) || element.hasAttribute('data-tabindex') && !dataTabIndex.startsWith('-');\n });\n const tabIndex = floatingFocusElement.getAttribute('tabindex');\n if (orderRef.current.includes('floating') || tabbableContent.length === 0) {\n if (tabIndex !== '0') {\n floatingFocusElement.setAttribute('tabindex', '0');\n }\n } else if (tabIndex !== '-1' || floatingFocusElement.hasAttribute('data-tabindex') && floatingFocusElement.getAttribute('data-tabindex') !== '-1') {\n floatingFocusElement.setAttribute('tabindex', '-1');\n floatingFocusElement.setAttribute('data-tabindex', '-1');\n }\n}\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n return /*#__PURE__*/jsx(\"button\", {\n ...props,\n type: \"button\",\n ref: ref,\n tabIndex: -1,\n style: HIDDEN_STYLES\n });\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(props) {\n const {\n context,\n children,\n disabled = false,\n order = ['content'],\n guards: _guards = true,\n initialFocus = 0,\n returnFocus = true,\n restoreFocus = false,\n modal = true,\n visuallyHiddenDismiss = false,\n closeOnFocusOut = true,\n outsideElementsInert = false,\n getInsideElements: _getInsideElements = () => []\n } = props;\n const {\n open,\n onOpenChange,\n events,\n dataRef,\n elements: {\n domReference,\n floating\n }\n } = context;\n const getNodeId = useEffectEvent(() => {\n var _dataRef$current$floa;\n return (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n });\n const getInsideElements = useEffectEvent(_getInsideElements);\n const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n // If the reference is a combobox and is typeable (e.g. input/textarea),\n // there are different focus semantics. The guards should not be rendered, but\n // aria-hidden should be applied to all nodes still. Further, the visually\n // hidden dismiss button should only appear at the end of the list, not the\n // start.\n const isUntrappedTypeableCombobox = isTypeableCombobox(domReference) && ignoreInitialFocus;\n\n // Force the guards to be rendered if the `inert` attribute is not supported.\n const inertSupported = supportsInert();\n const guards = inertSupported ? _guards : true;\n const useInert = !guards || inertSupported && outsideElementsInert;\n const orderRef = useLatestRef(order);\n const initialFocusRef = useLatestRef(initialFocus);\n const returnFocusRef = useLatestRef(returnFocus);\n const tree = useFloatingTree();\n const portalContext = usePortalContext();\n const startDismissButtonRef = React.useRef(null);\n const endDismissButtonRef = React.useRef(null);\n const preventReturnFocusRef = React.useRef(false);\n const isPointerDownRef = React.useRef(false);\n const tabbableIndexRef = React.useRef(-1);\n const blurTimeoutRef = React.useRef(-1);\n const isInsidePortal = portalContext != null;\n const floatingFocusElement = getFloatingFocusElement(floating);\n const getTabbableContent = useEffectEvent(function (container) {\n if (container === void 0) {\n container = floatingFocusElement;\n }\n return container ? tabbable(container, getTabbableOptions()) : [];\n });\n const getTabbableElements = useEffectEvent(container => {\n const content = getTabbableContent(container);\n return orderRef.current.map(type => {\n if (domReference && type === 'reference') {\n return domReference;\n }\n if (floatingFocusElement && type === 'floating') {\n return floatingFocusElement;\n }\n return content;\n }).filter(Boolean).flat();\n });\n React.useEffect(() => {\n if (disabled) return;\n if (!modal) return;\n function onKeyDown(event) {\n if (event.key === 'Tab') {\n // The focus guards have nothing to focus, so we need to stop the event.\n if (contains$1(floatingFocusElement, activeElement(getDocument$1(floatingFocusElement))) && getTabbableContent().length === 0 && !isUntrappedTypeableCombobox) {\n stopEvent(event);\n }\n const els = getTabbableElements();\n const target = getTarget$1(event);\n if (orderRef.current[0] === 'reference' && target === domReference) {\n stopEvent(event);\n if (event.shiftKey) {\n enqueueFocus(els[els.length - 1]);\n } else {\n enqueueFocus(els[1]);\n }\n }\n if (orderRef.current[1] === 'floating' && target === floatingFocusElement && event.shiftKey) {\n stopEvent(event);\n enqueueFocus(els[0]);\n }\n }\n }\n const doc = getDocument$1(floatingFocusElement);\n doc.addEventListener('keydown', onKeyDown);\n return () => {\n doc.removeEventListener('keydown', onKeyDown);\n };\n }, [disabled, domReference, floatingFocusElement, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent, getTabbableElements]);\n React.useEffect(() => {\n if (disabled) return;\n if (!floating) return;\n function handleFocusIn(event) {\n const target = getTarget$1(event);\n const tabbableContent = getTabbableContent();\n const tabbableIndex = tabbableContent.indexOf(target);\n if (tabbableIndex !== -1) {\n tabbableIndexRef.current = tabbableIndex;\n }\n }\n floating.addEventListener('focusin', handleFocusIn);\n return () => {\n floating.removeEventListener('focusin', handleFocusIn);\n };\n }, [disabled, floating, getTabbableContent]);\n React.useEffect(() => {\n if (disabled) return;\n if (!closeOnFocusOut) return;\n\n // In Safari, buttons lose focus when pressing them.\n function handlePointerDown() {\n isPointerDownRef.current = true;\n setTimeout(() => {\n isPointerDownRef.current = false;\n });\n }\n function handleFocusOutside(event) {\n const relatedTarget = event.relatedTarget;\n const currentTarget = event.currentTarget;\n const target = getTarget$1(event);\n queueMicrotask(() => {\n const nodeId = getNodeId();\n const movedToUnrelatedNode = !(contains$1(domReference, relatedTarget) || contains$1(floating, relatedTarget) || contains$1(relatedTarget, floating) || contains$1(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute(createAttribute('focus-guard')) || tree && (getNodeChildren$1(tree.nodesRef.current, nodeId).find(node => {\n var _node$context, _node$context2;\n return contains$1((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains$1((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n }) || getNodeAncestors(tree.nodesRef.current, nodeId).find(node => {\n var _node$context3, _node$context4, _node$context5;\n return [(_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating, getFloatingFocusElement((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.floating)].includes(relatedTarget) || ((_node$context5 = node.context) == null ? void 0 : _node$context5.elements.domReference) === relatedTarget;\n })));\n if (currentTarget === domReference && floatingFocusElement) {\n handleTabIndex(floatingFocusElement, orderRef);\n }\n\n // Restore focus to the previous tabbable element index to prevent\n // focus from being lost outside the floating tree.\n if (restoreFocus && currentTarget !== domReference && !(target != null && target.isConnected) && activeElement(getDocument$1(floatingFocusElement)) === getDocument$1(floatingFocusElement).body) {\n // Let `FloatingPortal` effect knows that focus is still inside the\n // floating tree.\n if (isHTMLElement(floatingFocusElement)) {\n floatingFocusElement.focus();\n }\n const prevTabbableIndex = tabbableIndexRef.current;\n const tabbableContent = getTabbableContent();\n const nodeToFocus = tabbableContent[prevTabbableIndex] || tabbableContent[tabbableContent.length - 1] || floatingFocusElement;\n if (isHTMLElement(nodeToFocus)) {\n nodeToFocus.focus();\n }\n }\n\n // https://github.com/floating-ui/floating-ui/issues/3060\n if (dataRef.current.insideReactTree) {\n dataRef.current.insideReactTree = false;\n return;\n }\n\n // Focus did not move inside the floating tree, and there are no tabbable\n // portal guards to handle closing.\n if ((isUntrappedTypeableCombobox ? true : !modal) && relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n // Fix React 18 Strict Mode returnFocus due to double rendering.\n relatedTarget !== getPreviouslyFocusedElement()) {\n preventReturnFocusRef.current = true;\n onOpenChange(false, event, 'focus-out');\n }\n });\n }\n const shouldHandleBlurCapture = Boolean(!tree && portalContext);\n function markInsideReactTree() {\n clearTimeoutIfSet(blurTimeoutRef);\n dataRef.current.insideReactTree = true;\n blurTimeoutRef.current = window.setTimeout(() => {\n dataRef.current.insideReactTree = false;\n });\n }\n if (floating && isHTMLElement(domReference)) {\n domReference.addEventListener('focusout', handleFocusOutside);\n domReference.addEventListener('pointerdown', handlePointerDown);\n floating.addEventListener('focusout', handleFocusOutside);\n if (shouldHandleBlurCapture) {\n floating.addEventListener('focusout', markInsideReactTree, true);\n }\n return () => {\n domReference.removeEventListener('focusout', handleFocusOutside);\n domReference.removeEventListener('pointerdown', handlePointerDown);\n floating.removeEventListener('focusout', handleFocusOutside);\n if (shouldHandleBlurCapture) {\n floating.removeEventListener('focusout', markInsideReactTree, true);\n }\n };\n }\n }, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, onOpenChange, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef, dataRef]);\n const beforeGuardRef = React.useRef(null);\n const afterGuardRef = React.useRef(null);\n const mergedBeforeGuardRef = useLiteMergeRefs([beforeGuardRef, portalContext == null ? void 0 : portalContext.beforeInsideRef]);\n const mergedAfterGuardRef = useLiteMergeRefs([afterGuardRef, portalContext == null ? void 0 : portalContext.afterInsideRef]);\n React.useEffect(() => {\n var _portalContext$portal, _ancestors$find;\n if (disabled) return;\n if (!floating) return;\n\n // Don't hide portals nested within the parent portal.\n const portalNodes = Array.from((portalContext == null || (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll(\"[\" + createAttribute('portal') + \"]\")) || []);\n const ancestors = tree ? getNodeAncestors(tree.nodesRef.current, getNodeId()) : [];\n const rootAncestorComboboxDomReference = (_ancestors$find = ancestors.find(node => {\n var _node$context6;\n return isTypeableCombobox(((_node$context6 = node.context) == null ? void 0 : _node$context6.elements.domReference) || null);\n })) == null || (_ancestors$find = _ancestors$find.context) == null ? void 0 : _ancestors$find.elements.domReference;\n const insideElements = [floating, rootAncestorComboboxDomReference, ...portalNodes, ...getInsideElements(), startDismissButtonRef.current, endDismissButtonRef.current, beforeGuardRef.current, afterGuardRef.current, portalContext == null ? void 0 : portalContext.beforeOutsideRef.current, portalContext == null ? void 0 : portalContext.afterOutsideRef.current, orderRef.current.includes('reference') || isUntrappedTypeableCombobox ? domReference : null].filter(x => x != null);\n const cleanup = modal || isUntrappedTypeableCombobox ? markOthers(insideElements, !useInert, useInert) : markOthers(insideElements);\n return () => {\n cleanup();\n };\n }, [disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, guards, useInert, tree, getNodeId, getInsideElements]);\n useModernLayoutEffect(() => {\n if (disabled || !isHTMLElement(floatingFocusElement)) return;\n const doc = getDocument$1(floatingFocusElement);\n const previouslyFocusedElement = activeElement(doc);\n\n // Wait for any layout effect state setters to execute to set `tabIndex`.\n queueMicrotask(() => {\n const focusableElements = getTabbableElements(floatingFocusElement);\n const initialFocusValue = initialFocusRef.current;\n const elToFocus = (typeof initialFocusValue === 'number' ? focusableElements[initialFocusValue] : initialFocusValue.current) || floatingFocusElement;\n const focusAlreadyInsideFloatingEl = contains$1(floatingFocusElement, previouslyFocusedElement);\n if (!ignoreInitialFocus && !focusAlreadyInsideFloatingEl && open) {\n enqueueFocus(elToFocus, {\n preventScroll: elToFocus === floatingFocusElement\n });\n }\n });\n }, [disabled, open, floatingFocusElement, ignoreInitialFocus, getTabbableElements, initialFocusRef]);\n useModernLayoutEffect(() => {\n if (disabled || !floatingFocusElement) return;\n const doc = getDocument$1(floatingFocusElement);\n const previouslyFocusedElement = activeElement(doc);\n addPreviouslyFocusedElement(previouslyFocusedElement);\n\n // Dismissing via outside press should always ignore `returnFocus` to\n // prevent unwanted scrolling.\n function onOpenChange(_ref) {\n let {\n reason,\n event,\n nested\n } = _ref;\n if (['hover', 'safe-polygon'].includes(reason) && event.type === 'mouseleave') {\n preventReturnFocusRef.current = true;\n }\n if (reason !== 'outside-press') return;\n if (nested) {\n preventReturnFocusRef.current = false;\n } else if (isVirtualClick(event) || isVirtualPointerEvent(event)) {\n preventReturnFocusRef.current = false;\n } else {\n let isPreventScrollSupported = false;\n document.createElement('div').focus({\n get preventScroll() {\n isPreventScrollSupported = true;\n return false;\n }\n });\n if (isPreventScrollSupported) {\n preventReturnFocusRef.current = false;\n } else {\n preventReturnFocusRef.current = true;\n }\n }\n }\n events.on('openchange', onOpenChange);\n const fallbackEl = doc.createElement('span');\n fallbackEl.setAttribute('tabindex', '-1');\n fallbackEl.setAttribute('aria-hidden', 'true');\n Object.assign(fallbackEl.style, HIDDEN_STYLES);\n if (isInsidePortal && domReference) {\n domReference.insertAdjacentElement('afterend', fallbackEl);\n }\n function getReturnElement() {\n if (typeof returnFocusRef.current === 'boolean') {\n const el = domReference || getPreviouslyFocusedElement();\n return el && el.isConnected ? el : fallbackEl;\n }\n return returnFocusRef.current.current || fallbackEl;\n }\n return () => {\n events.off('openchange', onOpenChange);\n const activeEl = activeElement(doc);\n const isFocusInsideFloatingTree = contains$1(floating, activeEl) || tree && getNodeChildren$1(tree.nodesRef.current, getNodeId(), false).some(node => {\n var _node$context7;\n return contains$1((_node$context7 = node.context) == null ? void 0 : _node$context7.elements.floating, activeEl);\n });\n const returnElement = getReturnElement();\n queueMicrotask(() => {\n // This is `returnElement`, if it's tabbable, or its first tabbable child.\n const tabbableReturnElement = getFirstTabbableElement(returnElement);\n if (\n // eslint-disable-next-line react-hooks/exhaustive-deps\n returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(tabbableReturnElement) && (\n // If the focus moved somewhere else after mount, avoid returning focus\n // since it likely entered a different element which should be\n // respected: https://github.com/floating-ui/floating-ui/issues/2607\n tabbableReturnElement !== activeEl && activeEl !== doc.body ? isFocusInsideFloatingTree : true)) {\n tabbableReturnElement.focus({\n preventScroll: true\n });\n }\n fallbackEl.remove();\n });\n };\n }, [disabled, floating, floatingFocusElement, returnFocusRef, dataRef, events, tree, isInsidePortal, domReference, getNodeId]);\n React.useEffect(() => {\n // The `returnFocus` cleanup behavior is inside a microtask; ensure we\n // wait for it to complete before resetting the flag.\n queueMicrotask(() => {\n preventReturnFocusRef.current = false;\n });\n return () => {\n queueMicrotask(clearDisconnectedPreviouslyFocusedElements);\n };\n }, [disabled]);\n\n // Synchronize the `context` & `modal` value to the FloatingPortal context.\n // It will decide whether or not it needs to render its own guards.\n useModernLayoutEffect(() => {\n if (disabled) return;\n if (!portalContext) return;\n portalContext.setFocusManagerState({\n modal,\n closeOnFocusOut,\n open,\n onOpenChange,\n domReference\n });\n return () => {\n portalContext.setFocusManagerState(null);\n };\n }, [disabled, portalContext, modal, open, onOpenChange, closeOnFocusOut, domReference]);\n useModernLayoutEffect(() => {\n if (disabled) return;\n if (!floatingFocusElement) return;\n handleTabIndex(floatingFocusElement, orderRef);\n }, [disabled, floatingFocusElement, orderRef]);\n function renderDismissButton(location) {\n if (disabled || !visuallyHiddenDismiss || !modal) {\n return null;\n }\n return /*#__PURE__*/jsx(VisuallyHiddenDismiss, {\n ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n onClick: event => onOpenChange(false, event.nativeEvent),\n children: typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss'\n });\n }\n const shouldRenderGuards = !disabled && guards && (modal ? !isUntrappedTypeableCombobox : true) && (isInsidePortal || modal);\n return /*#__PURE__*/jsxs(Fragment, {\n children: [shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"inside\",\n ref: mergedBeforeGuardRef,\n onFocus: event => {\n if (modal) {\n const els = getTabbableElements();\n enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n preventReturnFocusRef.current = false;\n if (isOutsideEvent(event, portalContext.portalNode)) {\n const nextTabbable = getNextTabbable(domReference);\n nextTabbable == null || nextTabbable.focus();\n } else {\n var _portalContext$before;\n (_portalContext$before = portalContext.beforeOutsideRef.current) == null || _portalContext$before.focus();\n }\n }\n }\n }), !isUntrappedTypeableCombobox && renderDismissButton('start'), children, renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n \"data-type\": \"inside\",\n ref: mergedAfterGuardRef,\n onFocus: event => {\n if (modal) {\n enqueueFocus(getTabbableElements()[0]);\n } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n if (closeOnFocusOut) {\n preventReturnFocusRef.current = true;\n }\n if (isOutsideEvent(event, portalContext.portalNode)) {\n const prevTabbable = getPreviousTabbable(domReference);\n prevTabbable == null || prevTabbable.focus();\n } else {\n var _portalContext$afterO;\n (_portalContext$afterO = portalContext.afterOutsideRef.current) == null || _portalContext$afterO.focus();\n }\n }\n }\n })]\n });\n}\n\nlet lockCount = 0;\nconst scrollbarProperty = '--floating-ui-scrollbar-width';\nfunction enableScrollLock() {\n const platform = getPlatform();\n const isIOS = /iP(hone|ad|od)|iOS/.test(platform) ||\n // iPads can claim to be MacIntel\n platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n const bodyStyle = document.body.style;\n // RTL <body> scrollbar\n const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n const scrollX = bodyStyle.left ? parseFloat(bodyStyle.left) : window.scrollX;\n const scrollY = bodyStyle.top ? parseFloat(bodyStyle.top) : window.scrollY;\n bodyStyle.overflow = 'hidden';\n bodyStyle.setProperty(scrollbarProperty, scrollbarWidth + \"px\");\n if (scrollbarWidth) {\n bodyStyle[paddingProp] = scrollbarWidth + \"px\";\n }\n\n // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n // technique has fewer side effects.\n if (isIOS) {\n var _window$visualViewpor, _window$visualViewpor2;\n // iOS 12 does not support `visualViewport`.\n const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n Object.assign(bodyStyle, {\n position: 'fixed',\n top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n right: '0'\n });\n }\n return () => {\n Object.assign(bodyStyle, {\n overflow: '',\n [paddingProp]: ''\n });\n bodyStyle.removeProperty(scrollbarProperty);\n if (isIOS) {\n Object.assign(bodyStyle, {\n position: '',\n top: '',\n left: '',\n right: ''\n });\n window.scrollTo(scrollX, scrollY);\n }\n };\n}\nlet cleanup = () => {};\n\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(props, ref) {\n const {\n lockScroll = false,\n ...rest\n } = props;\n useModernLayoutEffect(() => {\n if (!lockScroll) return;\n lockCount++;\n if (lockCount === 1) {\n cleanup = enableScrollLock();\n }\n return () => {\n lockCount--;\n if (lockCount === 0) {\n cleanup();\n }\n };\n }, [lockScroll]);\n return /*#__PURE__*/jsx(\"div\", {\n ref: ref,\n ...rest,\n style: {\n position: 'fixed',\n overflow: 'auto',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...rest.style\n }\n });\n});\n\nfunction isButtonTarget(event) {\n return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isAnchorTarget(event) {\n return isHTMLElement(event.target) && event.target.tagName === 'A';\n}\nfunction isSpaceIgnored(element) {\n return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nfunction useClick(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n dataRef,\n elements: {\n domReference\n }\n } = context;\n const {\n enabled = true,\n event: eventOption = 'click',\n toggle = true,\n ignoreMouse = false,\n keyboardHandlers = true,\n stickIfOpen = true\n } = props;\n const pointerTypeRef = React.useRef();\n const didKeyDownRef = React.useRef(false);\n const reference = React.useMemo(() => ({\n onPointerDown(event) {\n pointerTypeRef.current = event.pointerType;\n },\n onMouseDown(event) {\n const pointerType = pointerTypeRef.current;\n\n // Ignore all buttons except for the \"main\" button.\n // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n if (event.button !== 0) return;\n if (eventOption === 'click') return;\n if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n // Prevent stealing focus from the floating element\n event.preventDefault();\n onOpenChange(true, event.nativeEvent, 'click');\n }\n },\n onClick(event) {\n const pointerType = pointerTypeRef.current;\n if (eventOption === 'mousedown' && pointerTypeRef.current) {\n pointerTypeRef.current = undefined;\n return;\n }\n if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'click' : true)) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n onOpenChange(true, event.nativeEvent, 'click');\n }\n },\n onKeyDown(event) {\n pointerTypeRef.current = undefined;\n if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {\n return;\n }\n if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n // Prevent scrolling\n event.preventDefault();\n didKeyDownRef.current = true;\n }\n if (isAnchorTarget(event)) {\n return;\n }\n if (event.key === 'Enter') {\n if (open && toggle) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n onOpenChange(true, event.nativeEvent, 'click');\n }\n }\n },\n onKeyUp(event) {\n if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event) || isSpaceIgnored(domReference)) {\n return;\n }\n if (event.key === ' ' && didKeyDownRef.current) {\n didKeyDownRef.current = false;\n if (open && toggle) {\n onOpenChange(false, event.nativeEvent, 'click');\n } else {\n onOpenChange(true, event.nativeEvent, 'click');\n }\n }\n }\n }), [dataRef, domReference, eventOption, ignoreMouse, keyboardHandlers, onOpenChange, open, stickIfOpen, toggle]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nfunction createVirtualElement(domElement, data) {\n let offsetX = null;\n let offsetY = null;\n let isAutoUpdateEvent = false;\n return {\n contextElement: domElement || undefined,\n getBoundingClientRect() {\n var _data$dataRef$current;\n const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n };\n const isXAxis = data.axis === 'x' || data.axis === 'both';\n const isYAxis = data.axis === 'y' || data.axis === 'both';\n const canTrackCursorOnAutoUpdate = ['mouseenter', 'mousemove'].includes(((_data$dataRef$current = data.dataRef.current.openEvent) == null ? void 0 : _data$dataRef$current.type) || '') && data.pointerType !== 'touch';\n let width = domRect.width;\n let height = domRect.height;\n let x = domRect.x;\n let y = domRect.y;\n if (offsetX == null && data.x && isXAxis) {\n offsetX = domRect.x - data.x;\n }\n if (offsetY == null && data.y && isYAxis) {\n offsetY = domRect.y - data.y;\n }\n x -= offsetX || 0;\n y -= offsetY || 0;\n width = 0;\n height = 0;\n if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {\n width = data.axis === 'y' ? domRect.width : 0;\n height = data.axis === 'x' ? domRect.height : 0;\n x = isXAxis && data.x != null ? data.x : x;\n y = isYAxis && data.y != null ? data.y : y;\n } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {\n height = data.axis === 'x' ? domRect.height : height;\n width = data.axis === 'y' ? domRect.width : width;\n }\n isAutoUpdateEvent = true;\n return {\n width,\n height,\n x,\n y,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x\n };\n }\n };\n}\nfunction isMouseBasedEvent(event) {\n return event != null && event.clientX != null;\n}\n/**\n * Positions the floating element relative to a client point (in the viewport),\n * such as the mouse position. By default, it follows the mouse cursor.\n * @see https://floating-ui.com/docs/useClientPoint\n */\nfunction useClientPoint(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n dataRef,\n elements: {\n floating,\n domReference\n },\n refs\n } = context;\n const {\n enabled = true,\n axis = 'both',\n x = null,\n y = null\n } = props;\n const initialRef = React.useRef(false);\n const cleanupListenerRef = React.useRef(null);\n const [pointerType, setPointerType] = React.useState();\n const [reactive, setReactive] = React.useState([]);\n const setReference = useEffectEvent((x, y) => {\n if (initialRef.current) return;\n\n // Prevent setting if the open event was not a mouse-like one\n // (e.g. focus to open, then hover over the reference element).\n // Only apply if the event exists.\n if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {\n return;\n }\n refs.setPositionReference(createVirtualElement(domReference, {\n x,\n y,\n axis,\n dataRef,\n pointerType\n }));\n });\n const handleReferenceEnterOrMove = useEffectEvent(event => {\n if (x != null || y != null) return;\n if (!open) {\n setReference(event.clientX, event.clientY);\n } else if (!cleanupListenerRef.current) {\n // If there's no cleanup, there's no listener, but we want to ensure\n // we add the listener if the cursor landed on the floating element and\n // then back on the reference (i.e. it's interactive).\n setReactive([]);\n }\n });\n\n // If the pointer is a mouse-like pointer, we want to continue following the\n // mouse even if the floating element is transitioning out. On touch\n // devices, this is undesirable because the floating element will move to\n // the dismissal touch point.\n const openCheck = isMouseLikePointerType(pointerType) ? floating : open;\n const addListener = React.useCallback(() => {\n // Explicitly specified `x`/`y` coordinates shouldn't add a listener.\n if (!openCheck || !enabled || x != null || y != null) return;\n const win = getWindow(floating);\n function handleMouseMove(event) {\n const target = getTarget$1(event);\n if (!contains$1(floating, target)) {\n setReference(event.clientX, event.clientY);\n } else {\n win.removeEventListener('mousemove', handleMouseMove);\n cleanupListenerRef.current = null;\n }\n }\n if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {\n win.addEventListener('mousemove', handleMouseMove);\n const cleanup = () => {\n win.removeEventListener('mousemove', handleMouseMove);\n cleanupListenerRef.current = null;\n };\n cleanupListenerRef.current = cleanup;\n return cleanup;\n }\n refs.setPositionReference(domReference);\n }, [openCheck, enabled, x, y, floating, dataRef, refs, domReference, setReference]);\n React.useEffect(() => {\n return addListener();\n }, [addListener, reactive]);\n React.useEffect(() => {\n if (enabled && !floating) {\n initialRef.current = false;\n }\n }, [enabled, floating]);\n React.useEffect(() => {\n if (!enabled && open) {\n initialRef.current = true;\n }\n }, [enabled, open]);\n useModernLayoutEffect(() => {\n if (enabled && (x != null || y != null)) {\n initialRef.current = false;\n setReference(x, y);\n }\n }, [enabled, x, y, setReference]);\n const reference = React.useMemo(() => {\n function setPointerTypeRef(_ref) {\n let {\n pointerType\n } = _ref;\n setPointerType(pointerType);\n }\n return {\n onPointerDown: setPointerTypeRef,\n onPointerEnter: setPointerTypeRef,\n onMouseMove: handleReferenceEnterOrMove,\n onMouseEnter: handleReferenceEnterOrMove\n };\n }, [handleReferenceEnterOrMove]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nconst bubbleHandlerKeys = {\n pointerdown: 'onPointerDown',\n mousedown: 'onMouseDown',\n click: 'onClick'\n};\nconst captureHandlerKeys = {\n pointerdown: 'onPointerDownCapture',\n mousedown: 'onMouseDownCapture',\n click: 'onClickCapture'\n};\nconst normalizeProp = normalizable => {\n var _normalizable$escapeK, _normalizable$outside;\n return {\n escapeKey: typeof normalizable === 'boolean' ? normalizable : (_normalizable$escapeK = normalizable == null ? void 0 : normalizable.escapeKey) != null ? _normalizable$escapeK : false,\n outsidePress: typeof normalizable === 'boolean' ? normalizable : (_normalizable$outside = normalizable == null ? void 0 : normalizable.outsidePress) != null ? _normalizable$outside : true\n };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nfunction useDismiss(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n elements,\n dataRef\n } = context;\n const {\n enabled = true,\n escapeKey = true,\n outsidePress: unstable_outsidePress = true,\n outsidePressEvent = 'pointerdown',\n referencePress = false,\n referencePressEvent = 'pointerdown',\n ancestorScroll = false,\n bubbles,\n capture\n } = props;\n const tree = useFloatingTree();\n const outsidePressFn = useEffectEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n const endedOrStartedInsideRef = React.useRef(false);\n const {\n escapeKey: escapeKeyBubbles,\n outsidePress: outsidePressBubbles\n } = normalizeProp(bubbles);\n const {\n escapeKey: escapeKeyCapture,\n outsidePress: outsidePressCapture\n } = normalizeProp(capture);\n const isComposingRef = React.useRef(false);\n const closeOnEscapeKeyDown = useEffectEvent(event => {\n var _dataRef$current$floa;\n if (!open || !enabled || !escapeKey || event.key !== 'Escape') {\n return;\n }\n\n // Wait until IME is settled. Pressing `Escape` while composing should\n // close the compose menu, but not the floating element.\n if (isComposingRef.current) {\n return;\n }\n const nodeId = (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n if (!escapeKeyBubbles) {\n event.stopPropagation();\n if (children.length > 0) {\n let shouldDismiss = true;\n children.forEach(child => {\n var _child$context;\n if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n shouldDismiss = false;\n return;\n }\n });\n if (!shouldDismiss) {\n return;\n }\n }\n }\n onOpenChange(false, isReactEvent(event) ? event.nativeEvent : event, 'escape-key');\n });\n const closeOnEscapeKeyDownCapture = useEffectEvent(event => {\n var _getTarget2;\n const callback = () => {\n var _getTarget;\n closeOnEscapeKeyDown(event);\n (_getTarget = getTarget$1(event)) == null || _getTarget.removeEventListener('keydown', callback);\n };\n (_getTarget2 = getTarget$1(event)) == null || _getTarget2.addEventListener('keydown', callback);\n });\n const closeOnPressOutside = useEffectEvent(event => {\n var _dataRef$current$floa2;\n // Given developers can stop the propagation of the synthetic event,\n // we can only be confident with a positive value.\n const insideReactTree = dataRef.current.insideReactTree;\n dataRef.current.insideReactTree = false;\n\n // When click outside is lazy (`click` event), handle dragging.\n // Don't close if:\n // - The click started inside the floating element.\n // - The click ended inside the floating element.\n const endedOrStartedInside = endedOrStartedInsideRef.current;\n endedOrStartedInsideRef.current = false;\n if (outsidePressEvent === 'click' && endedOrStartedInside) {\n return;\n }\n if (insideReactTree) {\n return;\n }\n if (typeof outsidePress === 'function' && !outsidePress(event)) {\n return;\n }\n const target = getTarget$1(event);\n const inertSelector = \"[\" + createAttribute('inert') + \"]\";\n const markers = getDocument$1(elements.floating).querySelectorAll(inertSelector);\n let targetRootAncestor = isElement(target) ? target : null;\n while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {\n const nextParent = getParentNode(targetRootAncestor);\n if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {\n break;\n }\n targetRootAncestor = nextParent;\n }\n\n // Check if the click occurred on a third-party element injected after the\n // floating element rendered.\n if (markers.length && isElement(target) && !isRootElement(target) &&\n // Clicked on a direct ancestor (e.g. FloatingOverlay).\n !contains$1(target, elements.floating) &&\n // If the target root element contains none of the markers, then the\n // element was injected after the floating element rendered.\n Array.from(markers).every(marker => !contains$1(targetRootAncestor, marker))) {\n return;\n }\n\n // Check if the click occurred on the scrollbar\n if (isHTMLElement(target) && floating) {\n const lastTraversableNode = isLastTraversableNode(target);\n const style = getComputedStyle(target);\n const scrollRe = /auto|scroll/;\n const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX);\n const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY);\n const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth;\n const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight;\n const isRTL = style.direction === 'rtl';\n\n // Check click position relative to scrollbar.\n // In some browsers it is possible to change the <body> (or window)\n // scrollbar to the left side, but is very rare and is difficult to\n // check for. Plus, for modal dialogs with backdrops, it is more\n // important that the backdrop is checked but not so much the window.\n const pressedVerticalScrollbar = canScrollY && (isRTL ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth);\n const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight;\n if (pressedVerticalScrollbar || pressedHorizontalScrollbar) {\n return;\n }\n }\n const nodeId = (_dataRef$current$floa2 = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa2.nodeId;\n const targetIsInsideChildren = tree && getNodeChildren$1(tree.nodesRef.current, nodeId).some(node => {\n var _node$context;\n return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n });\n if (isEventTargetWithin(event, elements.floating) || isEventTargetWithin(event, elements.domReference) || targetIsInsideChildren) {\n return;\n }\n const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n if (children.length > 0) {\n let shouldDismiss = true;\n children.forEach(child => {\n var _child$context2;\n if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n shouldDismiss = false;\n return;\n }\n });\n if (!shouldDismiss) {\n return;\n }\n }\n onOpenChange(false, event, 'outside-press');\n });\n const closeOnPressOutsideCapture = useEffectEvent(event => {\n var _getTarget4;\n const callback = () => {\n var _getTarget3;\n closeOnPressOutside(event);\n (_getTarget3 = getTarget$1(event)) == null || _getTarget3.removeEventListener(outsidePressEvent, callback);\n };\n (_getTarget4 = getTarget$1(event)) == null || _getTarget4.addEventListener(outsidePressEvent, callback);\n });\n React.useEffect(() => {\n if (!open || !enabled) {\n return;\n }\n dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n let compositionTimeout = -1;\n function onScroll(event) {\n onOpenChange(false, event, 'ancestor-scroll');\n }\n function handleCompositionStart() {\n window.clearTimeout(compositionTimeout);\n isComposingRef.current = true;\n }\n function handleCompositionEnd() {\n // Safari fires `compositionend` before `keydown`, so we need to wait\n // until the next tick to set `isComposing` to `false`.\n // https://bugs.webkit.org/show_bug.cgi?id=165004\n compositionTimeout = window.setTimeout(() => {\n isComposingRef.current = false;\n },\n // 0ms or 1ms don't work in Safari. 5ms appears to consistently work.\n // Only apply to WebKit for the test to remain 0ms.\n isWebKit() ? 5 : 0);\n }\n const doc = getDocument$1(elements.floating);\n if (escapeKey) {\n doc.addEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n doc.addEventListener('compositionstart', handleCompositionStart);\n doc.addEventListener('compositionend', handleCompositionEnd);\n }\n outsidePress && doc.addEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n let ancestors = [];\n if (ancestorScroll) {\n if (isElement(elements.domReference)) {\n ancestors = getOverflowAncestors(elements.domReference);\n }\n if (isElement(elements.floating)) {\n ancestors = ancestors.concat(getOverflowAncestors(elements.floating));\n }\n if (!isElement(elements.reference) && elements.reference && elements.reference.contextElement) {\n ancestors = ancestors.concat(getOverflowAncestors(elements.reference.contextElement));\n }\n }\n\n // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n ancestors = ancestors.filter(ancestor => {\n var _doc$defaultView;\n return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n });\n ancestors.forEach(ancestor => {\n ancestor.addEventListener('scroll', onScroll, {\n passive: true\n });\n });\n return () => {\n if (escapeKey) {\n doc.removeEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n doc.removeEventListener('compositionstart', handleCompositionStart);\n doc.removeEventListener('compositionend', handleCompositionEnd);\n }\n outsidePress && doc.removeEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n ancestors.forEach(ancestor => {\n ancestor.removeEventListener('scroll', onScroll);\n });\n window.clearTimeout(compositionTimeout);\n };\n }, [dataRef, elements, escapeKey, outsidePress, outsidePressEvent, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, escapeKeyCapture, closeOnEscapeKeyDownCapture, closeOnPressOutside, outsidePressCapture, closeOnPressOutsideCapture]);\n React.useEffect(() => {\n dataRef.current.insideReactTree = false;\n }, [dataRef, outsidePress, outsidePressEvent]);\n const reference = React.useMemo(() => ({\n onKeyDown: closeOnEscapeKeyDown,\n ...(referencePress && {\n [bubbleHandlerKeys[referencePressEvent]]: event => {\n onOpenChange(false, event.nativeEvent, 'reference-press');\n },\n ...(referencePressEvent !== 'click' && {\n onClick(event) {\n onOpenChange(false, event.nativeEvent, 'reference-press');\n }\n })\n })\n }), [closeOnEscapeKeyDown, onOpenChange, referencePress, referencePressEvent]);\n const floating = React.useMemo(() => {\n function setMouseDownOrUpInside(event) {\n if (event.button !== 0) {\n return;\n }\n endedOrStartedInsideRef.current = true;\n }\n return {\n onKeyDown: closeOnEscapeKeyDown,\n onMouseDown: setMouseDownOrUpInside,\n onMouseUp: setMouseDownOrUpInside,\n [captureHandlerKeys[outsidePressEvent]]: () => {\n dataRef.current.insideReactTree = true;\n }\n };\n }, [closeOnEscapeKeyDown, outsidePressEvent, dataRef]);\n return React.useMemo(() => enabled ? {\n reference,\n floating\n } : {}, [enabled, reference, floating]);\n}\n\nfunction useFloatingRootContext(options) {\n const {\n open = false,\n onOpenChange: onOpenChangeProp,\n elements: elementsProp\n } = options;\n const floatingId = useId();\n const dataRef = React.useRef({});\n const [events] = React.useState(() => createEventEmitter());\n const nested = useFloatingParentNodeId() != null;\n if (process.env.NODE_ENV !== \"production\") {\n const optionDomReference = elementsProp.reference;\n if (optionDomReference && !isElement(optionDomReference)) {\n error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');\n }\n }\n const [positionReference, setPositionReference] = React.useState(elementsProp.reference);\n const onOpenChange = useEffectEvent((open, event, reason) => {\n dataRef.current.openEvent = open ? event : undefined;\n events.emit('openchange', {\n open,\n event,\n reason,\n nested\n });\n onOpenChangeProp == null || onOpenChangeProp(open, event, reason);\n });\n const refs = React.useMemo(() => ({\n setPositionReference\n }), []);\n const elements = React.useMemo(() => ({\n reference: positionReference || elementsProp.reference || null,\n floating: elementsProp.floating || null,\n domReference: elementsProp.reference\n }), [positionReference, elementsProp.reference, elementsProp.floating]);\n return React.useMemo(() => ({\n dataRef,\n open,\n onOpenChange,\n elements,\n events,\n floatingId,\n refs\n }), [open, onOpenChange, elements, events, floatingId, refs]);\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n nodeId\n } = options;\n const internalRootContext = useFloatingRootContext({\n ...options,\n elements: {\n reference: null,\n floating: null,\n ...options.elements\n }\n });\n const rootContext = options.rootContext || internalRootContext;\n const computedElements = rootContext.elements;\n const [_domReference, setDomReference] = React.useState(null);\n const [positionReference, _setPositionReference] = React.useState(null);\n const optionDomReference = computedElements == null ? void 0 : computedElements.domReference;\n const domReference = optionDomReference || _domReference;\n const domReferenceRef = React.useRef(null);\n const tree = useFloatingTree();\n useModernLayoutEffect(() => {\n if (domReference) {\n domReferenceRef.current = domReference;\n }\n }, [domReference]);\n const position = useFloating$1({\n ...options,\n elements: {\n ...computedElements,\n ...(positionReference && {\n reference: positionReference\n })\n }\n });\n const setPositionReference = React.useCallback(node => {\n const computedPositionReference = isElement(node) ? {\n getBoundingClientRect: () => node.getBoundingClientRect(),\n getClientRects: () => node.getClientRects(),\n contextElement: node\n } : node;\n // Store the positionReference in state if the DOM reference is specified externally via the\n // `elements.reference` option. This ensures that it won't be overridden on future renders.\n _setPositionReference(computedPositionReference);\n position.refs.setReference(computedPositionReference);\n }, [position.refs]);\n const setReference = React.useCallback(node => {\n if (isElement(node) || node === null) {\n domReferenceRef.current = node;\n setDomReference(node);\n }\n\n // Backwards-compatibility for passing a virtual element to `reference`\n // after it has set the DOM reference.\n if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n // Don't allow setting virtual elements using the old technique back to\n // `null` to support `positionReference` + an unstable `reference`\n // callback ref.\n node !== null && !isElement(node)) {\n position.refs.setReference(node);\n }\n }, [position.refs]);\n const refs = React.useMemo(() => ({\n ...position.refs,\n setReference,\n setPositionReference,\n domReference: domReferenceRef\n }), [position.refs, setReference, setPositionReference]);\n const elements = React.useMemo(() => ({\n ...position.elements,\n domReference: domReference\n }), [position.elements, domReference]);\n const context = React.useMemo(() => ({\n ...position,\n ...rootContext,\n refs,\n elements,\n nodeId\n }), [position, refs, elements, nodeId, rootContext]);\n useModernLayoutEffect(() => {\n rootContext.dataRef.current.floatingContext = context;\n const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n if (node) {\n node.context = context;\n }\n });\n return React.useMemo(() => ({\n ...position,\n context,\n refs,\n elements\n }), [position, refs, elements, context]);\n}\n\nfunction isMacSafari() {\n return isMac() && isSafari();\n}\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nfunction useFocus(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n onOpenChange,\n events,\n dataRef,\n elements\n } = context;\n const {\n enabled = true,\n visibleOnly = true\n } = props;\n const blockFocusRef = React.useRef(false);\n const timeoutRef = React.useRef(-1);\n const keyboardModalityRef = React.useRef(true);\n React.useEffect(() => {\n if (!enabled) return;\n const win = getWindow(elements.domReference);\n\n // If the reference was focused and the user left the tab/window, and the\n // floating element was not open, the focus should be blocked when they\n // return to the tab/window.\n function onBlur() {\n if (!open && isHTMLElement(elements.domReference) && elements.domReference === activeElement(getDocument$1(elements.domReference))) {\n blockFocusRef.current = true;\n }\n }\n function onKeyDown() {\n keyboardModalityRef.current = true;\n }\n function onPointerDown() {\n keyboardModalityRef.current = false;\n }\n win.addEventListener('blur', onBlur);\n if (isMacSafari()) {\n win.addEventListener('keydown', onKeyDown, true);\n win.addEventListener('pointerdown', onPointerDown, true);\n }\n return () => {\n win.removeEventListener('blur', onBlur);\n if (isMacSafari()) {\n win.removeEventListener('keydown', onKeyDown, true);\n win.removeEventListener('pointerdown', onPointerDown, true);\n }\n };\n }, [elements.domReference, open, enabled]);\n React.useEffect(() => {\n if (!enabled) return;\n function onOpenChange(_ref) {\n let {\n reason\n } = _ref;\n if (reason === 'reference-press' || reason === 'escape-key') {\n blockFocusRef.current = true;\n }\n }\n events.on('openchange', onOpenChange);\n return () => {\n events.off('openchange', onOpenChange);\n };\n }, [events, enabled]);\n React.useEffect(() => {\n return () => {\n clearTimeoutIfSet(timeoutRef);\n };\n }, []);\n const reference = React.useMemo(() => ({\n onMouseLeave() {\n blockFocusRef.current = false;\n },\n onFocus(event) {\n if (blockFocusRef.current) return;\n const target = getTarget$1(event.nativeEvent);\n if (visibleOnly && isElement(target)) {\n // Safari fails to match `:focus-visible` if focus was initially\n // outside the document.\n if (isMacSafari() && !event.relatedTarget) {\n if (!keyboardModalityRef.current && !isTypeableElement(target)) {\n return;\n }\n } else if (!matchesFocusVisible(target)) {\n return;\n }\n }\n onOpenChange(true, event.nativeEvent, 'focus');\n },\n onBlur(event) {\n blockFocusRef.current = false;\n const relatedTarget = event.relatedTarget;\n const nativeEvent = event.nativeEvent;\n\n // Hit the non-modal focus management portal guard. Focus will be\n // moved into the floating element immediately after.\n const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute('focus-guard')) && relatedTarget.getAttribute('data-type') === 'outside';\n\n // Wait for the window blur listener to fire.\n timeoutRef.current = window.setTimeout(() => {\n var _dataRef$current$floa;\n const activeEl = activeElement(elements.domReference ? elements.domReference.ownerDocument : document);\n\n // Focus left the page, keep it open.\n if (!relatedTarget && activeEl === elements.domReference) return;\n\n // When focusing the reference element (e.g. regular click), then\n // clicking into the floating element, prevent it from hiding.\n // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n // We can not rely on relatedTarget to point to the correct element\n // as it will only point to the shadow host of the newly focused element\n // and not the element that actually has received focus if it is located\n // inside a shadow root.\n if (contains$1((_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.refs.floating.current, activeEl) || contains$1(elements.domReference, activeEl) || movedToFocusGuard) {\n return;\n }\n onOpenChange(false, nativeEvent, 'focus');\n });\n }\n }), [dataRef, elements.domReference, onOpenChange, visibleOnly]);\n return React.useMemo(() => enabled ? {\n reference\n } : {}, [enabled, reference]);\n}\n\nfunction mergeProps(userProps, propsList, elementKey) {\n const map = new Map();\n const isItem = elementKey === 'item';\n let domUserProps = userProps;\n if (isItem && userProps) {\n const {\n [ACTIVE_KEY]: _,\n [SELECTED_KEY]: __,\n ...validProps\n } = userProps;\n domUserProps = validProps;\n }\n return {\n ...(elementKey === 'floating' && {\n tabIndex: -1,\n [FOCUSABLE_ATTRIBUTE]: ''\n }),\n ...domUserProps,\n ...propsList.map(value => {\n const propsOrGetProps = value ? value[elementKey] : null;\n if (typeof propsOrGetProps === 'function') {\n return userProps ? propsOrGetProps(userProps) : null;\n }\n return propsOrGetProps;\n }).concat(userProps).reduce((acc, props) => {\n if (!props) {\n return acc;\n }\n Object.entries(props).forEach(_ref => {\n let [key, value] = _ref;\n if (isItem && [ACTIVE_KEY, SELECTED_KEY].includes(key)) {\n return;\n }\n if (key.indexOf('on') === 0) {\n if (!map.has(key)) {\n map.set(key, []);\n }\n if (typeof value === 'function') {\n var _map$get;\n (_map$get = map.get(key)) == null || _map$get.push(value);\n acc[key] = function () {\n var _map$get2;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.map(fn => fn(...args)).find(val => val !== undefined);\n };\n }\n } else {\n acc[key] = value;\n }\n });\n return acc;\n }, {})\n };\n}\n/**\n * Merges an array of interaction hooks' props into prop getters, allowing\n * event handler functions to be composed together without overwriting one\n * another.\n * @see https://floating-ui.com/docs/useInteractions\n */\nfunction useInteractions(propsList) {\n if (propsList === void 0) {\n propsList = [];\n }\n const referenceDeps = propsList.map(key => key == null ? void 0 : key.reference);\n const floatingDeps = propsList.map(key => key == null ? void 0 : key.floating);\n const itemDeps = propsList.map(key => key == null ? void 0 : key.item);\n const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n referenceDeps);\n const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n floatingDeps);\n const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n itemDeps);\n return React.useMemo(() => ({\n getReferenceProps,\n getFloatingProps,\n getItemProps\n }), [getReferenceProps, getFloatingProps, getItemProps]);\n}\n\nconst ESCAPE = 'Escape';\nfunction doSwitch(orientation, vertical, horizontal) {\n switch (orientation) {\n case 'vertical':\n return vertical;\n case 'horizontal':\n return horizontal;\n default:\n return vertical || horizontal;\n }\n}\nfunction isMainOrientationKey(key, orientation) {\n const vertical = key === ARROW_UP || key === ARROW_DOWN;\n const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n const vertical = key === ARROW_DOWN;\n const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key === ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n const horizontal = key === ARROW_DOWN;\n return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl, cols) {\n const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n const horizontal = key === ARROW_UP;\n if (orientation === 'both' || orientation === 'horizontal' && cols && cols > 1) {\n return key === ESCAPE;\n }\n return doSwitch(orientation, vertical, horizontal);\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nfunction useListNavigation(context, props) {\n const {\n open,\n onOpenChange,\n elements,\n floatingId\n } = context;\n const {\n listRef,\n activeIndex,\n onNavigate: unstable_onNavigate = () => {},\n enabled = true,\n selectedIndex = null,\n allowEscape = false,\n loop = false,\n nested = false,\n rtl = false,\n virtual = false,\n focusItemOnOpen = 'auto',\n focusItemOnHover = true,\n openOnArrowKeyDown = true,\n disabledIndices = undefined,\n orientation = 'vertical',\n parentOrientation,\n cols = 1,\n scrollItemIntoView = true,\n virtualItemRef,\n itemSizes,\n dense = false\n } = props;\n if (process.env.NODE_ENV !== \"production\") {\n if (allowEscape) {\n if (!loop) {\n warn('`useListNavigation` looping must be enabled to allow escaping.');\n }\n if (!virtual) {\n warn('`useListNavigation` must be virtual to allow escaping.');\n }\n }\n if (orientation === 'vertical' && cols > 1) {\n warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either \"horizontal\" or \"both\".');\n }\n }\n const floatingFocusElement = getFloatingFocusElement(elements.floating);\n const floatingFocusElementRef = useLatestRef(floatingFocusElement);\n const parentId = useFloatingParentNodeId();\n const tree = useFloatingTree();\n useModernLayoutEffect(() => {\n context.dataRef.current.orientation = orientation;\n }, [context, orientation]);\n const onNavigate = useEffectEvent(() => {\n unstable_onNavigate(indexRef.current === -1 ? null : indexRef.current);\n });\n const typeableComboboxReference = isTypeableCombobox(elements.domReference);\n const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n const keyRef = React.useRef(null);\n const isPointerModalityRef = React.useRef(true);\n const previousOnNavigateRef = React.useRef(onNavigate);\n const previousMountedRef = React.useRef(!!elements.floating);\n const previousOpenRef = React.useRef(open);\n const forceSyncFocusRef = React.useRef(false);\n const forceScrollIntoViewRef = React.useRef(false);\n const disabledIndicesRef = useLatestRef(disabledIndices);\n const latestOpenRef = useLatestRef(open);\n const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n const selectedIndexRef = useLatestRef(selectedIndex);\n const [activeId, setActiveId] = React.useState();\n const [virtualId, setVirtualId] = React.useState();\n const focusItem = useEffectEvent(() => {\n function runFocus(item) {\n if (virtual) {\n var _item$id;\n if ((_item$id = item.id) != null && _item$id.endsWith('-fui-option')) {\n item.id = floatingId + \"-\" + Math.random().toString(16).slice(2, 10);\n }\n setActiveId(item.id);\n tree == null || tree.events.emit('virtualfocus', item);\n if (virtualItemRef) {\n virtualItemRef.current = item;\n }\n } else {\n enqueueFocus(item, {\n sync: forceSyncFocusRef.current,\n preventScroll: true\n });\n }\n }\n const initialItem = listRef.current[indexRef.current];\n const forceScrollIntoView = forceScrollIntoViewRef.current;\n if (initialItem) {\n runFocus(initialItem);\n }\n const scheduler = forceSyncFocusRef.current ? v => v() : requestAnimationFrame;\n scheduler(() => {\n const waitedItem = listRef.current[indexRef.current] || initialItem;\n if (!waitedItem) return;\n if (!initialItem) {\n runFocus(waitedItem);\n }\n const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n if (shouldScrollIntoView) {\n // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n // by all browsers.\n waitedItem.scrollIntoView == null || waitedItem.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n block: 'nearest',\n inline: 'nearest'\n } : scrollIntoViewOptions);\n }\n });\n });\n\n // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n // element. Also, reset `activeIndex` upon closing the floating element.\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (open && elements.floating) {\n if (focusItemOnOpenRef.current && selectedIndex != null) {\n // Regardless of the pointer modality, we want to ensure the selected\n // item comes into view when the floating element is opened.\n forceScrollIntoViewRef.current = true;\n indexRef.current = selectedIndex;\n onNavigate();\n }\n } else if (previousMountedRef.current) {\n // Since the user can specify `onNavigate` conditionally\n // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n // we store and call the previous function.\n indexRef.current = -1;\n previousOnNavigateRef.current();\n }\n }, [enabled, open, elements.floating, selectedIndex, onNavigate]);\n\n // Sync `activeIndex` to be the focused item while the floating element is\n // open.\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!open) return;\n if (!elements.floating) return;\n if (activeIndex == null) {\n forceSyncFocusRef.current = false;\n if (selectedIndexRef.current != null) {\n return;\n }\n\n // Reset while the floating element was open (e.g. the list changed).\n if (previousMountedRef.current) {\n indexRef.current = -1;\n focusItem();\n }\n\n // Initial sync.\n if ((!previousOpenRef.current || !previousMountedRef.current) && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n let runs = 0;\n const waitForListPopulated = () => {\n if (listRef.current[0] == null) {\n // Avoid letting the browser paint if possible on the first try,\n // otherwise use rAF. Don't try more than twice, since something\n // is wrong otherwise.\n if (runs < 2) {\n const scheduler = runs ? requestAnimationFrame : queueMicrotask;\n scheduler(waitForListPopulated);\n }\n runs++;\n } else {\n indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinListIndex(listRef, disabledIndicesRef.current) : getMaxListIndex(listRef, disabledIndicesRef.current);\n keyRef.current = null;\n onNavigate();\n }\n };\n waitForListPopulated();\n }\n } else if (!isIndexOutOfListBounds(listRef, activeIndex)) {\n indexRef.current = activeIndex;\n focusItem();\n forceScrollIntoViewRef.current = false;\n }\n }, [enabled, open, elements.floating, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n // Ensure the parent floating element has focus when a nested child closes\n // to allow arrow key navigation to work after the pointer leaves the child.\n useModernLayoutEffect(() => {\n var _nodes$find;\n if (!enabled || elements.floating || !tree || virtual || !previousMountedRef.current) {\n return;\n }\n const nodes = tree.nodesRef.current;\n const parent = (_nodes$find = nodes.find(node => node.id === parentId)) == null || (_nodes$find = _nodes$find.context) == null ? void 0 : _nodes$find.elements.floating;\n const activeEl = activeElement(getDocument$1(elements.floating));\n const treeContainsActiveEl = nodes.some(node => node.context && contains$1(node.context.elements.floating, activeEl));\n if (parent && !treeContainsActiveEl && isPointerModalityRef.current) {\n parent.focus({\n preventScroll: true\n });\n }\n }, [enabled, elements.floating, tree, parentId, virtual]);\n useModernLayoutEffect(() => {\n if (!enabled) return;\n if (!tree) return;\n if (!virtual) return;\n if (parentId) return;\n function handleVirtualFocus(item) {\n setVirtualId(item.id);\n if (virtualItemRef) {\n virtualItemRef.current = item;\n }\n }\n tree.events.on('virtualfocus', handleVirtualFocus);\n return () => {\n tree.events.off('virtualfocus', handleVirtualFocus);\n };\n }, [enabled, tree, virtual, parentId, virtualItemRef]);\n useModernLayoutEffect(() => {\n previousOnNavigateRef.current = onNavigate;\n previousOpenRef.current = open;\n previousMountedRef.current = !!elements.floating;\n });\n useModernLayoutEffect(() => {\n if (!open) {\n keyRef.current = null;\n focusItemOnOpenRef.current = focusItemOnOpen;\n }\n }, [open, focusItemOnOpen]);\n const hasActiveIndex = activeIndex != null;\n const item = React.useMemo(() => {\n function syncCurrentTarget(currentTarget) {\n if (!latestOpenRef.current) return;\n const index = listRef.current.indexOf(currentTarget);\n if (index !== -1 && indexRef.current !== index) {\n indexRef.current = index;\n onNavigate();\n }\n }\n const props = {\n onFocus(_ref) {\n let {\n currentTarget\n } = _ref;\n forceSyncFocusRef.current = true;\n syncCurrentTarget(currentTarget);\n },\n onClick: _ref2 => {\n let {\n currentTarget\n } = _ref2;\n return currentTarget.focus({\n preventScroll: true\n });\n },\n // Safari\n onMouseMove(_ref3) {\n let {\n currentTarget\n } = _ref3;\n forceSyncFocusRef.current = true;\n forceScrollIntoViewRef.current = false;\n if (focusItemOnHover) {\n syncCurrentTarget(currentTarget);\n }\n },\n onPointerLeave(_ref4) {\n let {\n pointerType\n } = _ref4;\n if (!isPointerModalityRef.current || pointerType === 'touch') {\n return;\n }\n forceSyncFocusRef.current = true;\n if (!focusItemOnHover) {\n return;\n }\n indexRef.current = -1;\n onNavigate();\n if (!virtual) {\n var _floatingFocusElement;\n (_floatingFocusElement = floatingFocusElementRef.current) == null || _floatingFocusElement.focus({\n preventScroll: true\n });\n }\n }\n };\n return props;\n }, [latestOpenRef, floatingFocusElementRef, focusItemOnHover, listRef, onNavigate, virtual]);\n const getParentOrientation = React.useCallback(() => {\n var _tree$nodesRef$curren;\n return parentOrientation != null ? parentOrientation : tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.dataRef) == null ? void 0 : _tree$nodesRef$curren.current.orientation;\n }, [parentId, tree, parentOrientation]);\n const commonOnKeyDown = useEffectEvent(event => {\n isPointerModalityRef.current = false;\n forceSyncFocusRef.current = true;\n\n // When composing a character, Chrome fires ArrowDown twice. Firefox/Safari\n // don't appear to suffer from this. `event.isComposing` is avoided due to\n // Safari not supporting it properly (although it's not needed in the first\n // place for Safari, just avoiding any possible issues).\n if (event.which === 229) {\n return;\n }\n\n // If the floating element is animating out, ignore navigation. Otherwise,\n // the `activeIndex` gets set to 0 despite not being open so the next time\n // the user ArrowDowns, the first item won't be focused.\n if (!latestOpenRef.current && event.currentTarget === floatingFocusElementRef.current) {\n return;\n }\n if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl, cols)) {\n // If the nested list's close key is also the parent navigation key,\n // let the parent navigate. Otherwise, stop propagating the event.\n if (!isMainOrientationKey(event.key, getParentOrientation())) {\n stopEvent(event);\n }\n onOpenChange(false, event.nativeEvent, 'list-navigation');\n if (isHTMLElement(elements.domReference)) {\n if (virtual) {\n tree == null || tree.events.emit('virtualfocus', elements.domReference);\n } else {\n elements.domReference.focus();\n }\n }\n return;\n }\n const currentIndex = indexRef.current;\n const minIndex = getMinListIndex(listRef, disabledIndices);\n const maxIndex = getMaxListIndex(listRef, disabledIndices);\n if (!typeableComboboxReference) {\n if (event.key === 'Home') {\n stopEvent(event);\n indexRef.current = minIndex;\n onNavigate();\n }\n if (event.key === 'End') {\n stopEvent(event);\n indexRef.current = maxIndex;\n onNavigate();\n }\n }\n\n // Grid navigation.\n if (cols > 1) {\n const sizes = itemSizes || Array.from({\n length: listRef.current.length\n }, () => ({\n width: 1,\n height: 1\n }));\n // To calculate movements on the grid, we use hypothetical cell indices\n // as if every item was 1x1, then convert back to real indices.\n const cellMap = createGridCellMap(sizes, cols, dense);\n const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(listRef, index, disabledIndices));\n // last enabled index\n const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(listRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n const index = cellMap[getGridNavigatedIndex({\n current: cellMap.map(itemIndex => itemIndex != null ? listRef.current[itemIndex] : null)\n }, {\n event,\n orientation,\n loop,\n rtl,\n cols,\n // treat undefined (empty grid spaces) as disabled indices so we\n // don't end up in them\n disabledIndices: getGridCellIndices([...((typeof disabledIndices !== 'function' ? disabledIndices : null) || listRef.current.map((_, index) => isListIndexDisabled(listRef, index, disabledIndices) ? index : undefined)), undefined], cellMap),\n minIndex: minGridIndex,\n maxIndex: maxGridIndex,\n prevIndex: getGridCellIndexOfCorner(indexRef.current > maxIndex ? minIndex : indexRef.current, sizes, cellMap, cols,\n // use a corner matching the edge closest to the direction\n // we're moving in so we don't end up in the same item. Prefer\n // top/left over bottom/right.\n event.key === ARROW_DOWN ? 'bl' : event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT) ? 'tr' : 'tl'),\n stopEvent: true\n })];\n if (index != null) {\n indexRef.current = index;\n onNavigate();\n }\n if (orientation === 'both') {\n return;\n }\n }\n if (isMainOrientationKey(event.key, orientation)) {\n stopEvent(event);\n\n // Reset the index if no item is focused.\n if (open && !virtual && activeElement(event.currentTarget.ownerDocument) === event.currentTarget) {\n indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n onNavigate();\n return;\n }\n if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n if (loop) {\n indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n disabledIndices\n });\n } else {\n indexRef.current = Math.min(maxIndex, findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n disabledIndices\n }));\n }\n } else {\n if (loop) {\n indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n decrement: true,\n disabledIndices\n });\n } else {\n indexRef.current = Math.max(minIndex, findNonDisabledListIndex(listRef, {\n startingIndex: currentIndex,\n decrement: true,\n disabledIndices\n }));\n }\n }\n if (isIndexOutOfListBounds(listRef, indexRef.current)) {\n indexRef.current = -1;\n }\n onNavigate();\n }\n });\n const ariaActiveDescendantProp = React.useMemo(() => {\n return virtual && open && hasActiveIndex && {\n 'aria-activedescendant': virtualId || activeId\n };\n }, [virtual, open, hasActiveIndex, virtualId, activeId]);\n const floating = React.useMemo(() => {\n return {\n 'aria-orientation': orientation === 'both' ? undefined : orientation,\n ...(!typeableComboboxReference ? ariaActiveDescendantProp : {}),\n onKeyDown: commonOnKeyDown,\n onPointerMove() {\n isPointerModalityRef.current = true;\n }\n };\n }, [ariaActiveDescendantProp, commonOnKeyDown, orientation, typeableComboboxReference]);\n const reference = React.useMemo(() => {\n function checkVirtualMouse(event) {\n if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n focusItemOnOpenRef.current = true;\n }\n }\n function checkVirtualPointer(event) {\n // `pointerdown` fires first, reset the state then perform the checks.\n focusItemOnOpenRef.current = focusItemOnOpen;\n if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n focusItemOnOpenRef.current = true;\n }\n }\n return {\n ...ariaActiveDescendantProp,\n onKeyDown(event) {\n isPointerModalityRef.current = false;\n const isArrowKey = event.key.startsWith('Arrow');\n const isHomeOrEndKey = ['Home', 'End'].includes(event.key);\n const isMoveKey = isArrowKey || isHomeOrEndKey;\n const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);\n const isCrossCloseKey = isCrossOrientationCloseKey(event.key, orientation, rtl, cols);\n const isParentCrossOpenKey = isCrossOrientationOpenKey(event.key, getParentOrientation(), rtl);\n const isMainKey = isMainOrientationKey(event.key, orientation);\n const isNavigationKey = (nested ? isParentCrossOpenKey : isMainKey) || event.key === 'Enter' || event.key.trim() === '';\n if (virtual && open) {\n const rootNode = tree == null ? void 0 : tree.nodesRef.current.find(node => node.parentId == null);\n const deepestNode = tree && rootNode ? getDeepestNode(tree.nodesRef.current, rootNode.id) : null;\n if (isMoveKey && deepestNode && virtualItemRef) {\n const eventObject = new KeyboardEvent('keydown', {\n key: event.key,\n bubbles: true\n });\n if (isCrossOpenKey || isCrossCloseKey) {\n var _deepestNode$context, _deepestNode$context2;\n const isCurrentTarget = ((_deepestNode$context = deepestNode.context) == null ? void 0 : _deepestNode$context.elements.domReference) === event.currentTarget;\n const dispatchItem = isCrossCloseKey && !isCurrentTarget ? (_deepestNode$context2 = deepestNode.context) == null ? void 0 : _deepestNode$context2.elements.domReference : isCrossOpenKey ? listRef.current.find(item => (item == null ? void 0 : item.id) === activeId) : null;\n if (dispatchItem) {\n stopEvent(event);\n dispatchItem.dispatchEvent(eventObject);\n setVirtualId(undefined);\n }\n }\n if ((isMainKey || isHomeOrEndKey) && deepestNode.context) {\n if (deepestNode.context.open && deepestNode.parentId && event.currentTarget !== deepestNode.context.elements.domReference) {\n var _deepestNode$context$;\n stopEvent(event);\n (_deepestNode$context$ = deepestNode.context.elements.domReference) == null || _deepestNode$context$.dispatchEvent(eventObject);\n return;\n }\n }\n }\n return commonOnKeyDown(event);\n }\n // If a floating element should not open on arrow key down, avoid\n // setting `activeIndex` while it's closed.\n if (!open && !openOnArrowKeyDown && isArrowKey) {\n return;\n }\n if (isNavigationKey) {\n const isParentMainKey = isMainOrientationKey(event.key, getParentOrientation());\n keyRef.current = nested && isParentMainKey ? null : event.key;\n }\n if (nested) {\n if (isParentCrossOpenKey) {\n stopEvent(event);\n if (open) {\n indexRef.current = getMinListIndex(listRef, disabledIndicesRef.current);\n onNavigate();\n } else {\n onOpenChange(true, event.nativeEvent, 'list-navigation');\n }\n }\n return;\n }\n if (isMainKey) {\n if (selectedIndex != null) {\n indexRef.current = selectedIndex;\n }\n stopEvent(event);\n if (!open && openOnArrowKeyDown) {\n onOpenChange(true, event.nativeEvent, 'list-navigation');\n } else {\n commonOnKeyDown(event);\n }\n if (open) {\n onNavigate();\n }\n }\n },\n onFocus() {\n if (open && !virtual) {\n indexRef.current = -1;\n onNavigate();\n }\n },\n onPointerDown: checkVirtualPointer,\n onPointerEnter: checkVirtualPointer,\n onMouseDown: checkVirtualMouse,\n onClick: checkVirtualMouse\n };\n }, [activeId, ariaActiveDescendantProp, cols, commonOnKeyDown, disabledIndicesRef, focusItemOnOpen, listRef, nested, onNavigate, onOpenChange, open, openOnArrowKeyDown, orientation, getParentOrientation, rtl, selectedIndex, tree, virtual, virtualItemRef]);\n return React.useMemo(() => enabled ? {\n reference,\n floating,\n item\n } : {}, [enabled, reference, floating, item]);\n}\n\nconst componentRoleToAriaRoleMap = /*#__PURE__*/new Map([['select', 'listbox'], ['combobox', 'listbox'], ['label', false]]);\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nfunction useRole(context, props) {\n var _elements$domReferenc, _componentRoleToAriaR;\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n elements,\n floatingId: defaultFloatingId\n } = context;\n const {\n enabled = true,\n role = 'dialog'\n } = props;\n const defaultReferenceId = useId();\n const referenceId = ((_elements$domReferenc = elements.domReference) == null ? void 0 : _elements$domReferenc.id) || defaultReferenceId;\n const floatingId = React.useMemo(() => {\n var _getFloatingFocusElem;\n return ((_getFloatingFocusElem = getFloatingFocusElement(elements.floating)) == null ? void 0 : _getFloatingFocusElem.id) || defaultFloatingId;\n }, [elements.floating, defaultFloatingId]);\n const ariaRole = (_componentRoleToAriaR = componentRoleToAriaRoleMap.get(role)) != null ? _componentRoleToAriaR : role;\n const parentId = useFloatingParentNodeId();\n const isNested = parentId != null;\n const reference = React.useMemo(() => {\n if (ariaRole === 'tooltip' || role === 'label') {\n return {\n [\"aria-\" + (role === 'label' ? 'labelledby' : 'describedby')]: open ? floatingId : undefined\n };\n }\n return {\n 'aria-expanded': open ? 'true' : 'false',\n 'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,\n 'aria-controls': open ? floatingId : undefined,\n ...(ariaRole === 'listbox' && {\n role: 'combobox'\n }),\n ...(ariaRole === 'menu' && {\n id: referenceId\n }),\n ...(ariaRole === 'menu' && isNested && {\n role: 'menuitem'\n }),\n ...(role === 'select' && {\n 'aria-autocomplete': 'none'\n }),\n ...(role === 'combobox' && {\n 'aria-autocomplete': 'list'\n })\n };\n }, [ariaRole, floatingId, isNested, open, referenceId, role]);\n const floating = React.useMemo(() => {\n const floatingProps = {\n id: floatingId,\n ...(ariaRole && {\n role: ariaRole\n })\n };\n if (ariaRole === 'tooltip' || role === 'label') {\n return floatingProps;\n }\n return {\n ...floatingProps,\n ...(ariaRole === 'menu' && {\n 'aria-labelledby': referenceId\n })\n };\n }, [ariaRole, floatingId, referenceId, role]);\n const item = React.useCallback(_ref => {\n let {\n active,\n selected\n } = _ref;\n const commonProps = {\n role: 'option',\n ...(active && {\n id: floatingId + \"-fui-option\"\n })\n };\n\n // For `menu`, we are unable to tell if the item is a `menuitemradio`\n // or `menuitemcheckbox`. For backwards-compatibility reasons, also\n // avoid defaulting to `menuitem` as it may overwrite custom role props.\n switch (role) {\n case 'select':\n case 'combobox':\n return {\n ...commonProps,\n 'aria-selected': selected\n };\n }\n return {};\n }, [floatingId, role]);\n return React.useMemo(() => enabled ? {\n reference,\n floating,\n item\n } : {}, [enabled, reference, floating, item]);\n}\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction execWithArgsOrReturn(valueOrFn, args) {\n return typeof valueOrFn === 'function' ? valueOrFn(args) : valueOrFn;\n}\nfunction useDelayUnmount(open, durationMs) {\n const [isMounted, setIsMounted] = React.useState(open);\n if (open && !isMounted) {\n setIsMounted(true);\n }\n React.useEffect(() => {\n if (!open && isMounted) {\n const timeout = setTimeout(() => setIsMounted(false), durationMs);\n return () => clearTimeout(timeout);\n }\n }, [open, isMounted, durationMs]);\n return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n open,\n elements: {\n floating\n }\n } = context;\n const {\n duration = 250\n } = props;\n const isNumberDuration = typeof duration === 'number';\n const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n const [status, setStatus] = React.useState('unmounted');\n const isMounted = useDelayUnmount(open, closeDuration);\n if (!isMounted && status === 'close') {\n setStatus('unmounted');\n }\n useModernLayoutEffect(() => {\n if (!floating) return;\n if (open) {\n setStatus('initial');\n const frame = requestAnimationFrame(() => {\n // Ensure it opens before paint. With `FloatingDelayGroup`,\n // this avoids a flicker when moving between floating elements\n // to ensure one is always open with no missing frames.\n ReactDOM.flushSync(() => {\n setStatus('open');\n });\n });\n return () => {\n cancelAnimationFrame(frame);\n };\n }\n setStatus('close');\n }, [open, floating]);\n return {\n isMounted,\n status\n };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, props) {\n if (props === void 0) {\n props = {};\n }\n const {\n initial: unstable_initial = {\n opacity: 0\n },\n open: unstable_open,\n close: unstable_close,\n common: unstable_common,\n duration = 250\n } = props;\n const placement = context.placement;\n const side = placement.split('-')[0];\n const fnArgs = React.useMemo(() => ({\n side,\n placement\n }), [side, placement]);\n const isNumberDuration = typeof duration === 'number';\n const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n const [styles, setStyles] = React.useState(() => ({\n ...execWithArgsOrReturn(unstable_common, fnArgs),\n ...execWithArgsOrReturn(unstable_initial, fnArgs)\n }));\n const {\n isMounted,\n status\n } = useTransitionStatus(context, {\n duration\n });\n const initialRef = useLatestRef(unstable_initial);\n const openRef = useLatestRef(unstable_open);\n const closeRef = useLatestRef(unstable_close);\n const commonRef = useLatestRef(unstable_common);\n useModernLayoutEffect(() => {\n const initialStyles = execWithArgsOrReturn(initialRef.current, fnArgs);\n const closeStyles = execWithArgsOrReturn(closeRef.current, fnArgs);\n const commonStyles = execWithArgsOrReturn(commonRef.current, fnArgs);\n const openStyles = execWithArgsOrReturn(openRef.current, fnArgs) || Object.keys(initialStyles).reduce((acc, key) => {\n acc[key] = '';\n return acc;\n }, {});\n if (status === 'initial') {\n setStyles(styles => ({\n transitionProperty: styles.transitionProperty,\n ...commonStyles,\n ...initialStyles\n }));\n }\n if (status === 'open') {\n setStyles({\n transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n transitionDuration: openDuration + \"ms\",\n ...commonStyles,\n ...openStyles\n });\n }\n if (status === 'close') {\n const styles = closeStyles || initialStyles;\n setStyles({\n transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n transitionDuration: closeDuration + \"ms\",\n ...commonStyles,\n ...styles\n });\n }\n }, [closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status, fnArgs]);\n return {\n isMounted,\n styles\n };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nfunction useTypeahead(context, props) {\n var _ref;\n const {\n open,\n dataRef\n } = context;\n const {\n listRef,\n activeIndex,\n onMatch: unstable_onMatch,\n onTypingChange: unstable_onTypingChange,\n enabled = true,\n findMatch = null,\n resetMs = 750,\n ignoreKeys = [],\n selectedIndex = null\n } = props;\n const timeoutIdRef = React.useRef(-1);\n const stringRef = React.useRef('');\n const prevIndexRef = React.useRef((_ref = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref : -1);\n const matchIndexRef = React.useRef(null);\n const onMatch = useEffectEvent(unstable_onMatch);\n const onTypingChange = useEffectEvent(unstable_onTypingChange);\n const findMatchRef = useLatestRef(findMatch);\n const ignoreKeysRef = useLatestRef(ignoreKeys);\n useModernLayoutEffect(() => {\n if (open) {\n clearTimeoutIfSet(timeoutIdRef);\n matchIndexRef.current = null;\n stringRef.current = '';\n }\n }, [open]);\n useModernLayoutEffect(() => {\n // Sync arrow key navigation but not typeahead navigation.\n if (open && stringRef.current === '') {\n var _ref2;\n prevIndexRef.current = (_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1;\n }\n }, [open, selectedIndex, activeIndex]);\n const setTypingChange = useEffectEvent(value => {\n if (value) {\n if (!dataRef.current.typing) {\n dataRef.current.typing = value;\n onTypingChange(value);\n }\n } else {\n if (dataRef.current.typing) {\n dataRef.current.typing = value;\n onTypingChange(value);\n }\n }\n });\n const onKeyDown = useEffectEvent(event => {\n function getMatchingIndex(list, orderedList, string) {\n const str = findMatchRef.current ? findMatchRef.current(orderedList, string) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(string.toLocaleLowerCase())) === 0);\n return str ? list.indexOf(str) : -1;\n }\n const listContent = listRef.current;\n if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {\n setTypingChange(false);\n } else if (event.key === ' ') {\n stopEvent(event);\n }\n }\n if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n // Character key.\n event.key.length !== 1 ||\n // Modifier key.\n event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n if (open && event.key !== ' ') {\n stopEvent(event);\n setTypingChange(true);\n }\n\n // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n // allow it in this case, too.\n const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n var _text$, _text$2;\n return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n });\n\n // Allows the user to cycle through items that start with the same letter\n // in rapid succession.\n if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n stringRef.current = '';\n prevIndexRef.current = matchIndexRef.current;\n }\n stringRef.current += event.key;\n clearTimeoutIfSet(timeoutIdRef);\n timeoutIdRef.current = window.setTimeout(() => {\n stringRef.current = '';\n prevIndexRef.current = matchIndexRef.current;\n setTypingChange(false);\n }, resetMs);\n const prevIndex = prevIndexRef.current;\n const index = getMatchingIndex(listContent, [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)], stringRef.current);\n if (index !== -1) {\n onMatch(index);\n matchIndexRef.current = index;\n } else if (event.key !== ' ') {\n stringRef.current = '';\n setTypingChange(false);\n }\n });\n const reference = React.useMemo(() => ({\n onKeyDown\n }), [onKeyDown]);\n const floating = React.useMemo(() => {\n return {\n onKeyDown,\n onKeyUp(event) {\n if (event.key === ' ') {\n setTypingChange(false);\n }\n }\n };\n }, [onKeyDown, setTypingChange]);\n return React.useMemo(() => enabled ? {\n reference,\n floating\n } : {}, [enabled, reference, floating]);\n}\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n return {\n ...state,\n rects: {\n ...state.rects,\n floating: {\n ...state.rects.floating,\n height\n }\n }\n };\n}\n/**\n * Positions the floating element such that an inner element inside of it is\n * anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nconst inner = props => ({\n name: 'inner',\n options: props,\n async fn(state) {\n const {\n listRef,\n overflowRef,\n onFallbackChange,\n offset: innerOffset = 0,\n index = 0,\n minItemsVisible = 4,\n referenceOverflowThreshold = 0,\n scrollRef,\n ...detectOverflowOptions\n } = evaluate(props, state);\n const {\n rects,\n platform,\n elements: {\n floating\n }\n } = state;\n const item = listRef.current[index];\n const scrollEl = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n\n // Valid combinations:\n // 1. Floating element is the scrollRef and has a border (default)\n // 2. Floating element is not the scrollRef, floating element has a border\n // 3. Floating element is not the scrollRef, scrollRef has a border\n // Floating > {...getFloatingProps()} wrapper > scrollRef > items is not\n // allowed as VoiceOver doesn't work.\n const clientTop = floating.clientTop || scrollEl.clientTop;\n const floatingIsBordered = floating.clientTop !== 0;\n const scrollElIsBordered = scrollEl.clientTop !== 0;\n const floatingIsScrollEl = floating === scrollEl;\n if (process.env.NODE_ENV !== \"production\") {\n if (!state.placement.startsWith('bottom')) {\n warn('`placement` side must be \"bottom\" when using the `inner`', 'middleware.');\n }\n }\n if (!item) {\n return {};\n }\n const nextArgs = {\n ...state,\n ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n };\n const overflow = await platform.detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, scrollEl.scrollHeight + clientTop + floating.clientTop), detectOverflowOptions);\n const refOverflow = await platform.detectOverflow(nextArgs, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const diffY = max(0, overflow.top);\n const nextY = nextArgs.y + diffY;\n const isScrollable = scrollEl.scrollHeight > scrollEl.clientHeight;\n const rounder = isScrollable ? v => v : round;\n const maxHeight = rounder(max(0, scrollEl.scrollHeight + (floatingIsBordered && floatingIsScrollEl || scrollElIsBordered ? clientTop * 2 : 0) - diffY - max(0, overflow.bottom)));\n scrollEl.style.maxHeight = maxHeight + \"px\";\n scrollEl.scrollTop = diffY;\n\n // There is not enough space, fallback to standard anchored positioning\n if (onFallbackChange) {\n const shouldFallback = scrollEl.offsetHeight < item.offsetHeight * min(minItemsVisible, listRef.current.length) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold;\n ReactDOM.flushSync(() => onFallbackChange(shouldFallback));\n }\n if (overflowRef) {\n overflowRef.current = await platform.detectOverflow(getArgsWithCustomFloatingHeight({\n ...nextArgs,\n y: nextY\n }, scrollEl.offsetHeight + clientTop + floating.clientTop), detectOverflowOptions);\n }\n return {\n y: nextY\n };\n }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nfunction useInnerOffset(context, props) {\n const {\n open,\n elements\n } = context;\n const {\n enabled = true,\n overflowRef,\n scrollRef,\n onChange: unstable_onChange\n } = props;\n const onChange = useEffectEvent(unstable_onChange);\n const controlledScrollingRef = React.useRef(false);\n const prevScrollTopRef = React.useRef(null);\n const initialOverflowRef = React.useRef(null);\n React.useEffect(() => {\n if (!enabled) return;\n function onWheel(e) {\n if (e.ctrlKey || !el || overflowRef.current == null) {\n return;\n }\n const dY = e.deltaY;\n const isAtTop = overflowRef.current.top >= -0.5;\n const isAtBottom = overflowRef.current.bottom >= -0.5;\n const remainingScroll = el.scrollHeight - el.clientHeight;\n const sign = dY < 0 ? -1 : 1;\n const method = dY < 0 ? 'max' : 'min';\n if (el.scrollHeight <= el.clientHeight) {\n return;\n }\n if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n e.preventDefault();\n ReactDOM.flushSync(() => {\n onChange(d => d + Math[method](dY, remainingScroll * sign));\n });\n } else if (/firefox/i.test(getUserAgent())) {\n // Needed to propagate scrolling during momentum scrolling phase once\n // it gets limited by the boundary. UX improvement, not critical.\n el.scrollTop += dY;\n }\n }\n const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n if (open && el) {\n el.addEventListener('wheel', onWheel);\n\n // Wait for the position to be ready.\n requestAnimationFrame(() => {\n prevScrollTopRef.current = el.scrollTop;\n if (overflowRef.current != null) {\n initialOverflowRef.current = {\n ...overflowRef.current\n };\n }\n });\n return () => {\n prevScrollTopRef.current = null;\n initialOverflowRef.current = null;\n el.removeEventListener('wheel', onWheel);\n };\n }\n }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n const floating = React.useMemo(() => ({\n onKeyDown() {\n controlledScrollingRef.current = true;\n },\n onWheel() {\n controlledScrollingRef.current = false;\n },\n onPointerMove() {\n controlledScrollingRef.current = false;\n },\n onScroll() {\n const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n return;\n }\n if (prevScrollTopRef.current !== null) {\n const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n ReactDOM.flushSync(() => onChange(d => d + scrollDiff));\n }\n }\n\n // [Firefox] Wait for the height change to have been applied.\n requestAnimationFrame(() => {\n prevScrollTopRef.current = el.scrollTop;\n });\n }\n }), [elements.floating, onChange, overflowRef, scrollRef]);\n return React.useMemo(() => enabled ? {\n floating\n } : {}, [enabled, floating]);\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n if (onlyOpenChildren === void 0) {\n onlyOpenChildren = true;\n }\n const directChildren = nodes.filter(node => {\n var _node$context;\n return node.parentId === id && (!onlyOpenChildren || ((_node$context = node.context) == null ? void 0 : _node$context.open));\n });\n return directChildren.flatMap(child => [child, ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);\n}\n\nfunction isPointInPolygon(point, polygon) {\n const [x, y] = point;\n let isInside = false;\n const length = polygon.length;\n for (let i = 0, j = length - 1; i < length; j = i++) {\n const [xi, yi] = polygon[i] || [0, 0];\n const [xj, yj] = polygon[j] || [0, 0];\n const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) {\n isInside = !isInside;\n }\n }\n return isInside;\n}\nfunction isInside(point, rect) {\n return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\n/**\n * Generates a safe polygon area that the user can traverse without closing the\n * floating element once leaving the reference element.\n * @see https://floating-ui.com/docs/useHover#safepolygon\n */\nfunction safePolygon(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n buffer = 0.5,\n blockPointerEvents = false,\n requireIntent = true\n } = options;\n const timeoutRef = {\n current: -1\n };\n let hasLanded = false;\n let lastX = null;\n let lastY = null;\n let lastCursorTime = typeof performance !== 'undefined' ? performance.now() : 0;\n function getCursorSpeed(x, y) {\n const currentTime = performance.now();\n const elapsedTime = currentTime - lastCursorTime;\n if (lastX === null || lastY === null || elapsedTime === 0) {\n lastX = x;\n lastY = y;\n lastCursorTime = currentTime;\n return null;\n }\n const deltaX = x - lastX;\n const deltaY = y - lastY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n const speed = distance / elapsedTime; // px / ms\n\n lastX = x;\n lastY = y;\n lastCursorTime = currentTime;\n return speed;\n }\n const fn = _ref => {\n let {\n x,\n y,\n placement,\n elements,\n onClose,\n nodeId,\n tree\n } = _ref;\n return function onMouseMove(event) {\n function close() {\n clearTimeoutIfSet(timeoutRef);\n onClose();\n }\n clearTimeoutIfSet(timeoutRef);\n if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n return;\n }\n const {\n clientX,\n clientY\n } = event;\n const clientPoint = [clientX, clientY];\n const target = getTarget(event);\n const isLeave = event.type === 'mouseleave';\n const isOverFloatingEl = contains(elements.floating, target);\n const isOverReferenceEl = contains(elements.domReference, target);\n const refRect = elements.domReference.getBoundingClientRect();\n const rect = elements.floating.getBoundingClientRect();\n const side = placement.split('-')[0];\n const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n const isOverReferenceRect = isInside(clientPoint, refRect);\n const isFloatingWider = rect.width > refRect.width;\n const isFloatingTaller = rect.height > refRect.height;\n const left = (isFloatingWider ? refRect : rect).left;\n const right = (isFloatingWider ? refRect : rect).right;\n const top = (isFloatingTaller ? refRect : rect).top;\n const bottom = (isFloatingTaller ? refRect : rect).bottom;\n if (isOverFloatingEl) {\n hasLanded = true;\n if (!isLeave) {\n return;\n }\n }\n if (isOverReferenceEl) {\n hasLanded = false;\n }\n if (isOverReferenceEl && !isLeave) {\n hasLanded = true;\n return;\n }\n\n // Prevent overlapping floating element from being stuck in an open-close\n // loop: https://github.com/floating-ui/floating-ui/issues/1910\n if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n return;\n }\n\n // If any nested child is open, abort.\n if (tree && getNodeChildren(tree.nodesRef.current, nodeId).length) {\n return;\n }\n\n // If the pointer is leaving from the opposite side, the \"buffer\" logic\n // creates a point where the floating element remains open, but should be\n // ignored.\n // A constant of 1 handles floating point rounding errors.\n if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n return close();\n }\n\n // Ignore when the cursor is within the rectangular trough between the\n // two elements. Since the triangle is created from the cursor point,\n // which can start beyond the ref element's edge, traversing back and\n // forth from the ref to the floating element can cause it to close. This\n // ensures it always remains open in that case.\n let rectPoly = [];\n switch (side) {\n case 'top':\n rectPoly = [[left, refRect.top + 1], [left, rect.bottom - 1], [right, rect.bottom - 1], [right, refRect.top + 1]];\n break;\n case 'bottom':\n rectPoly = [[left, rect.top + 1], [left, refRect.bottom - 1], [right, refRect.bottom - 1], [right, rect.top + 1]];\n break;\n case 'left':\n rectPoly = [[rect.right - 1, bottom], [rect.right - 1, top], [refRect.left + 1, top], [refRect.left + 1, bottom]];\n break;\n case 'right':\n rectPoly = [[refRect.right - 1, bottom], [refRect.right - 1, top], [rect.left + 1, top], [rect.left + 1, bottom]];\n break;\n }\n function getPolygon(_ref2) {\n let [x, y] = _ref2;\n switch (side) {\n case 'top':\n {\n const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case 'bottom':\n {\n const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case 'left':\n {\n const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n return [...commonPoints, cursorPointOne, cursorPointTwo];\n }\n case 'right':\n {\n const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n }\n }\n if (isPointInPolygon([clientX, clientY], rectPoly)) {\n return;\n }\n if (hasLanded && !isOverReferenceRect) {\n return close();\n }\n if (!isLeave && requireIntent) {\n const cursorSpeed = getCursorSpeed(event.clientX, event.clientY);\n const cursorSpeedThreshold = 0.1;\n if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {\n return close();\n }\n }\n if (!isPointInPolygon([clientX, clientY], getPolygon([x, y]))) {\n close();\n } else if (!hasLanded && requireIntent) {\n timeoutRef.current = window.setTimeout(close, 40);\n }\n };\n };\n fn.__options = {\n blockPointerEvents\n };\n return fn;\n}\n\nexport { Composite, CompositeItem, FloatingArrow, FloatingDelayGroup, FloatingFocusManager, FloatingList, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, NextFloatingDelayGroup, inner, safePolygon, useClick, useClientPoint, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingRootContext, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListItem, useListNavigation, useMergeRefs, useNextDelayGroup, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","import { autoPlacement, autoUpdate, flip as flipMw, offset as offsetMw, shift as shiftMw, size as sizeMw, useFloating, } from '@floating-ui/react';\nconst hasResizeObserver = typeof window !== 'undefined' && 'ResizeObserver' in window;\nfunction autoMiddlewareFor(p) {\n if (!String(p).startsWith('auto'))\n return null;\n const alignment = p === 'auto-start' ? 'start' : p === 'auto-end' ? 'end' : undefined;\n return autoPlacement({ alignment });\n}\nfunction toOffsetMw(opt) {\n if (opt == null)\n return null;\n if (Array.isArray(opt)) {\n const [crossAxis, mainAxis] = opt;\n return offsetMw({ crossAxis, mainAxis });\n }\n if (typeof opt === 'number')\n return offsetMw(opt);\n return offsetMw(opt);\n}\nexport function usePopoverPosition({ allowFlip = true, allowShift = true, autoUpdateOptions, fitAvailableSpace = false, freeze = false, offset, placement = 'bottom-start', }) {\n const autoMw = autoMiddlewareFor(placement);\n const offsetMiddleware = toOffsetMw(offset);\n const isSidePlacement = placement.startsWith('left') || placement.startsWith('right');\n const middleware = [\n // offset first (mirrors common Popper setups)\n ...(offsetMiddleware ? [offsetMiddleware] : []),\n // choose between autoPlacement (Popper's \"auto*\") OR flip()\n // only allow flip when not explicitly 'left*' or 'right*'\n ...(autoMw ? [autoMw] : allowFlip && !isSidePlacement ? [flipMw()] : []),\n // viewport collision adjustments\n ...(allowShift ? [shiftMw({ padding: 8 })] : []),\n // optional size constraining\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n ...(fitAvailableSpace ? [sizeMw({ apply: () => { } })] : []),\n ];\n // if placement is 'auto*', seed with any static placement; autoPlacement will pick the final one\n const seedPlacement = String(placement).startsWith('auto')\n ? 'bottom'\n : placement;\n return useFloating({\n middleware,\n placement: seedPlacement,\n strategy: 'fixed',\n whileElementsMounted: freeze\n ? undefined\n : (reference, floating, update) => autoUpdate(reference, floating, update, {\n ancestorResize: true,\n ancestorScroll: true,\n animationFrame: false,\n elementResize: hasResizeObserver,\n ...autoUpdateOptions,\n }),\n });\n}\n","import clsx from 'clsx';\nimport React, { useEffect, useState } from 'react';\nimport { FocusScope } from '@react-aria/focus';\nimport { DialogPortalEntry } from './DialogPortal';\nimport { useDialog, useDialogIsOpen } from './hooks';\nimport { usePopoverPosition } from './hooks/usePopoverPosition';\nexport function useDialogAnchor({ allowFlip, open, placement, referenceElement, }) {\n const [popperElement, setPopperElement] = useState(null);\n const { refs, strategy, update, x, y } = usePopoverPosition({\n allowFlip,\n freeze: true,\n placement,\n });\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n useEffect(() => {\n refs.setFloating(popperElement);\n }, [popperElement, refs]);\n useEffect(() => {\n if (open && popperElement) {\n // Since the popper's reference element might not be (and usually is not) visible\n // all the time, it's safer to force popper update before showing it.\n // update is non-null only if popperElement is non-null\n update?.();\n }\n }, [open, placement, popperElement, update]);\n if (popperElement && !open) {\n setPopperElement(null);\n }\n return {\n setPopperElement,\n styles: {\n left: x ?? 0,\n position: strategy,\n top: y ?? 0,\n },\n };\n}\nexport const DialogAnchor = ({ allowFlip = true, children, className, dialogManagerId, focus = true, id, placement = 'auto', referenceElement = null, tabIndex, trapFocus, ...restDivProps }) => {\n const dialog = useDialog({ dialogManagerId, id });\n const open = useDialogIsOpen(id, dialogManagerId);\n const { setPopperElement, styles } = useDialogAnchor({\n allowFlip,\n open,\n placement,\n referenceElement,\n });\n useEffect(() => {\n if (!open)\n return;\n const hideOnEscape = (event) => {\n if (event.key !== 'Escape')\n return;\n dialog?.close();\n };\n document.addEventListener('keyup', hideOnEscape);\n return () => {\n document.removeEventListener('keyup', hideOnEscape);\n };\n }, [dialog, open]);\n // prevent rendering the dialog contents if the dialog should not be open / shown\n if (!open) {\n return null;\n }\n return (React.createElement(DialogPortalEntry, { dialogId: id, dialogManagerId: dialogManagerId },\n React.createElement(FocusScope, { autoFocus: focus, contain: trapFocus, restoreFocus: true },\n React.createElement(\"div\", { ...restDivProps, className: clsx('str-chat__dialog-contents', className), \"data-testid\": 'str-chat__dialog-contents', ref: setPopperElement, style: styles, tabIndex: typeof tabIndex !== 'undefined' ? tabIndex : 0 }, children))));\n};\n","import clsx from 'clsx';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useDialogIsOpen, useDialogOnNearestManager } from './hooks';\nimport { useDialogAnchor } from './DialogAnchor';\nexport const ButtonWithSubmenu = ({ children, className, placement, Submenu, submenuContainerProps, ...buttonProps }) => {\n const buttonRef = useRef(null);\n const [dialogContainer, setDialogContainer] = useState(null);\n const keepSubmenuOpen = useRef(false);\n const dialogCloseTimeout = useRef(null);\n const dialogId = useMemo(() => `submenu-${Math.random().toString(36).slice(2)}`, []);\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n const { setPopperElement, styles } = useDialogAnchor({\n open: dialogIsOpen,\n placement,\n referenceElement: buttonRef.current,\n });\n const closeDialogLazily = useCallback(() => {\n if (dialogCloseTimeout.current)\n clearTimeout(dialogCloseTimeout.current);\n dialogCloseTimeout.current = setTimeout(() => {\n if (keepSubmenuOpen.current)\n return;\n dialog.close();\n }, 100);\n }, [dialog]);\n const handleClose = useCallback((event) => {\n const parentButton = buttonRef.current;\n if (!dialogIsOpen || !parentButton)\n return;\n event.stopPropagation();\n closeDialogLazily();\n parentButton.focus();\n }, [closeDialogLazily, dialogIsOpen, buttonRef]);\n const handleFocusParentButton = () => {\n if (dialogIsOpen)\n return;\n dialog.open();\n keepSubmenuOpen.current = true;\n };\n useEffect(() => {\n const parentButton = buttonRef.current;\n if (!dialogIsOpen || !parentButton)\n return;\n const hideOnEscape = (event) => {\n if (event.key !== 'Escape')\n return;\n handleClose(event);\n keepSubmenuOpen.current = false;\n };\n document.addEventListener('keyup', hideOnEscape, { capture: true });\n return () => {\n document.removeEventListener('keyup', hideOnEscape, { capture: true });\n };\n }, [dialogIsOpen, handleClose]);\n return (React.createElement(React.Fragment, null,\n React.createElement(\"button\", { \"aria-selected\": 'false', className: clsx(className, 'str_chat__button-with-submenu', {\n 'str_chat__button-with-submenu--submenu-open': dialogIsOpen,\n }), onBlur: () => {\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }, onClick: (event) => {\n event.stopPropagation();\n dialog.toggle();\n }, onFocus: handleFocusParentButton, onMouseEnter: handleFocusParentButton, onMouseLeave: () => {\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }, ref: buttonRef, role: 'option', ...buttonProps }, children),\n dialogIsOpen && (React.createElement(\"div\", { onBlur: (event) => {\n const isBlurredDescendant = event.relatedTarget instanceof Node &&\n dialogContainer?.contains(event.relatedTarget);\n if (isBlurredDescendant)\n return;\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }, onFocus: () => {\n keepSubmenuOpen.current = true;\n }, onMouseEnter: () => {\n keepSubmenuOpen.current = true;\n }, onMouseLeave: () => {\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }, ref: (element) => {\n setPopperElement(element);\n setDialogContainer(element);\n }, style: styles, tabIndex: -1, ...submenuContainerProps },\n React.createElement(Submenu, null)))));\n};\n","import React from 'react';\nimport { useChatContext, useMessageContext, useTranslationContext } from '../../context';\nimport { ButtonWithSubmenu } from '../Dialog';\nexport const RemindMeActionButton = ({ className, isMine, }) => {\n const { t } = useTranslationContext();\n return (React.createElement(ButtonWithSubmenu, { \"aria-selected\": 'false', className: className, placement: isMine ? 'left-start' : 'right-start', Submenu: RemindMeSubmenu }, t('Remind Me')));\n};\nexport const RemindMeSubmenu = () => {\n const { t } = useTranslationContext();\n const { client } = useChatContext();\n const { message } = useMessageContext();\n return (React.createElement(\"div\", { \"aria-label\": t('aria/Remind Me Options'), className: 'str-chat__message-actions-box__submenu', role: 'listbox' }, client.reminders.scheduledOffsetsMs.map((offsetMs) => (React.createElement(\"button\", { className: 'str-chat__message-actions-list-item-button', key: `reminder-offset-option--${offsetMs}`, onClick: () => {\n client.reminders.upsertReminder({\n messageId: message.id,\n remind_at: new Date(new Date().getTime() + offsetMs).toISOString(),\n });\n } }, t('duration/Remind Me', { milliseconds: offsetMs }))))));\n};\n","import React from 'react';\nexport const ActionsIcon = ({ className = '' }) => (React.createElement(\"svg\", { className: className, height: '4', viewBox: '0 0 11 4', width: '11', xmlns: 'http://www.w3.org/2000/svg' },\n React.createElement(\"path\", { d: 'M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z', fillRule: 'nonzero' })));\nexport const ReactionIcon = ({ className = '' }) => (React.createElement(\"svg\", { className: className, height: '12', viewBox: '0 0 12 12', width: '12', xmlns: 'http://www.w3.org/2000/svg' },\n React.createElement(\"g\", { clipRule: 'evenodd', fillRule: 'evenodd' },\n React.createElement(\"path\", { d: 'M6 1.2C3.3 1.2 1.2 3.3 1.2 6c0 2.7 2.1 4.8 4.8 4.8 2.7 0 4.8-2.1 4.8-4.8 0-2.7-2.1-4.8-4.8-4.8zM0 6c0-3.3 2.7-6 6-6s6 2.7 6 6-2.7 6-6 6-6-2.7-6-6z' }),\n React.createElement(\"path\", { d: 'M5.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM8.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM3.3 6.7c.3-.2.6-.1.8.1.3.4.8.9 1.5 1 .6.2 1.4.1 2.4-1 .2-.2.6-.3.8 0 .2.2.3.6 0 .8-1.1 1.3-2.4 1.7-3.5 1.5-1-.2-1.8-.9-2.2-1.5-.2-.3-.1-.7.2-.9z' }))));\nexport const ThreadIcon = ({ className = '' }) => (React.createElement(\"svg\", { className: className, height: '10', width: '14', xmlns: 'http://www.w3.org/2000/svg' },\n React.createElement(\"path\", { d: 'M8.516 3c4.78 0 4.972 6.5 4.972 6.5-1.6-2.906-2.847-3.184-4.972-3.184v2.872L3.772 4.994 8.516.5V3zM.484 5l4.5-4.237v1.78L2.416 5l2.568 2.125v1.828L.484 5z', fillRule: 'evenodd' })));\nexport const PinIcon = () => (React.createElement(\"svg\", { height: '13', viewBox: '0 0 14 13', width: '14', xmlns: 'http://www.w3.org/2000/svg' },\n React.createElement(\"path\", { d: 'M13.3518 6.686L6.75251 0.0866699L5.80984 1.02867L6.75318 1.972V1.97334L3.45318 5.272L3.45251 5.27334L2.50984 4.32934L1.56718 5.27267L4.39584 8.10067L0.624512 11.8713L1.56718 12.814L5.33851 9.04334L8.16718 11.8713L9.10984 10.9293L8.16718 9.986L11.4672 6.686L12.4098 7.62867L13.3518 6.686ZM7.22451 9.04267L7.22385 9.04334L4.39584 6.21467L7.69518 2.91467L10.5232 5.74267L7.22451 9.04267Z', fillRule: 'evenodd' })));\nexport const PinIndicator = ({ message, t }) => {\n if (!message || !t)\n return null;\n return (React.createElement(\"div\", { style: { alignItems: 'center', display: 'flex' } },\n React.createElement(PinIcon, null),\n React.createElement(\"div\", { style: {\n fontSize: '14px',\n marginBottom: '0',\n marginLeft: '8px',\n marginTop: '0',\n } }, message.pinned_by\n ? `${t('Pinned by')} ${message.pinned_by?.name || message.pinned_by?.id}`\n : t('Message pinned'))));\n};\nexport const MessageSentIcon = () => (React.createElement(\"svg\", { \"data-testid\": 'message-sent-icon', fill: 'currentColor', viewBox: '0 0 10 8', xmlns: 'http://www.w3.org/2000/svg' },\n React.createElement(\"path\", { clipRule: 'evenodd', d: 'M9.47116 1.80482C9.73151 1.54447 9.73151 1.12236 9.47116 0.862011C9.21081 0.601661 8.7887 0.601661 8.52835 0.862011L3.66646 5.7239L1.47108 3.52851C1.21073 3.26816 0.788619 3.26816 0.52827 3.52851C0.26792 3.78886 0.26792 4.21097 0.52827 4.47132L3.18877 7.13182C3.19083 7.13394 3.19292 7.13605 3.19502 7.13815C3.45537 7.3985 3.87748 7.3985 4.13783 7.13815L9.47116 1.80482Z', fillRule: 'evenodd' })));\nexport const MessageDeliveredIcon = () => (React.createElement(\"svg\", { \"data-testid\": 'delivered-icon', fill: 'currentColor', viewBox: '0 0 14 8', xmlns: 'http://www.w3.org/2000/svg' },\n React.createElement(\"path\", { clipRule: 'evenodd', d: 'M9.50041 0.862011C9.76149 1.12236 9.76149 1.54447 9.50041 1.80482L6.63046 4.66681L7.69051 5.72392L12.566 0.862011C12.827 0.601661 13.2503 0.601661 13.5114 0.862011C13.7725 1.12236 13.7725 1.54447 13.5114 1.80482L8.16321 7.13815C7.90214 7.3985 7.47885 7.3985 7.21778 7.13815C7.2164 7.13678 7.21502 7.13539 7.21366 7.13401L5.68502 5.60962L4.15223 7.13815C3.89115 7.3985 3.46787 7.3985 3.20679 7.13815L3.19746 7.12866L0.53272 4.47132C0.271645 4.21097 0.271645 3.78886 0.53272 3.52851C0.793794 3.26816 1.21708 3.26816 1.47815 3.52851L3.6796 5.72385L5.20067 4.207L5.21216 4.19526L5.22393 4.1838L8.55498 0.862011C8.81605 0.601661 9.23934 0.601661 9.50041 0.862011Z', \n // fill='#005DFF'\n fillRule: 'evenodd' })));\nexport const MessageErrorIcon = () => (React.createElement(\"div\", { className: 'str-chat__message-error-icon' },\n React.createElement(\"svg\", { \"data-testid\": 'error', fill: 'none', height: '24', viewBox: '0 0 24 24', width: '24', xmlns: 'http://www.w3.org/2000/svg' },\n React.createElement(\"path\", { d: 'M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2Z', fill: 'black', id: 'background' }),\n React.createElement(\"path\", { d: 'M13 17H11V15H13V17ZM13 13H11V7H13V13Z', fill: 'white' }))));\n","import clsx from 'clsx';\nimport React, { useCallback, useRef } from 'react';\nimport { MessageActionsBox } from './MessageActionsBox';\nimport { DialogAnchor, useDialogIsOpen, useDialogOnNearestManager } from '../Dialog';\nimport { ActionsIcon as DefaultActionsIcon } from '../Message/icons';\nimport { isUserMuted, shouldRenderMessageActions } from '../Message/utils';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useComponentContext, useTranslationContext } from '../../context';\nexport const MessageActions = (props) => {\n const { ActionsIcon = DefaultActionsIcon, customWrapperClass = '', getMessageActions: propGetMessageActions, handleDelete: propHandleDelete, handleFlag: propHandleFlag, handleMarkUnread: propHandleMarkUnread, handleMute: propHandleMute, handlePin: propHandlePin, inline, message: propMessage, mine, } = props;\n const { mutes } = useChatContext('MessageActions');\n const { customMessageActions, getMessageActions: contextGetMessageActions, handleDelete: contextHandleDelete, handleFlag: contextHandleFlag, handleMarkUnread: contextHandleMarkUnread, handleMute: contextHandleMute, handlePin: contextHandlePin, isMyMessage, message: contextMessage, setEditingState, threadList, } = useMessageContext('MessageActions');\n const { CustomMessageActionsList } = useComponentContext('MessageActions');\n const { t } = useTranslationContext('MessageActions');\n const getMessageActions = propGetMessageActions || contextGetMessageActions;\n const handleDelete = propHandleDelete || contextHandleDelete;\n const handleFlag = propHandleFlag || contextHandleFlag;\n const handleMarkUnread = propHandleMarkUnread || contextHandleMarkUnread;\n const handleMute = propHandleMute || contextHandleMute;\n const handlePin = propHandlePin || contextHandlePin;\n const message = propMessage || contextMessage;\n const isMine = mine ? mine() : isMyMessage();\n const isMuted = useCallback(() => isUserMuted(message, mutes), [message, mutes]);\n const dialogIdNamespace = threadList ? '-thread-' : '';\n const dialogId = `message-actions${dialogIdNamespace}--${message.id}`;\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n const messageActions = getMessageActions();\n const renderMessageActions = shouldRenderMessageActions({\n customMessageActions,\n CustomMessageActionsList,\n inThread: threadList,\n messageActions,\n });\n const actionsBoxButtonRef = useRef(null);\n if (!renderMessageActions)\n return null;\n return (React.createElement(MessageActionsWrapper, { customWrapperClass: customWrapperClass, inline: inline, toggleOpen: dialog?.toggle },\n React.createElement(DialogAnchor, { dialogManagerId: dialogManager?.id, id: dialogId, placement: isMine ? 'top-end' : 'top-start', referenceElement: actionsBoxButtonRef.current, tabIndex: -1, trapFocus: true },\n React.createElement(MessageActionsBox, { getMessageActions: getMessageActions, handleDelete: handleDelete, handleEdit: setEditingState, handleFlag: handleFlag, handleMarkUnread: handleMarkUnread, handleMute: handleMute, handlePin: handlePin, isUserMuted: isMuted, mine: isMine, open: dialogIsOpen })),\n React.createElement(\"button\", { \"aria-expanded\": dialogIsOpen, \"aria-haspopup\": 'true', \"aria-label\": t('aria/Open Message Actions Menu'), className: 'str-chat__message-actions-box-button', \"data-testid\": 'message-actions-toggle-button', ref: actionsBoxButtonRef },\n React.createElement(ActionsIcon, { className: 'str-chat__message-action-icon' }))));\n};\nexport const MessageActionsWrapper = (props) => {\n const { children, customWrapperClass, inline, toggleOpen } = props;\n const defaultWrapperClass = clsx('str-chat__message-simple__actions__action', 'str-chat__message-simple__actions__action--options', 'str-chat__message-actions-container');\n const wrapperProps = {\n className: customWrapperClass || defaultWrapperClass,\n 'data-testid': 'message-actions',\n onClick: toggleOpen,\n };\n if (inline)\n return React.createElement(\"span\", { ...wrapperProps }, children);\n return React.createElement(\"div\", { ...wrapperProps }, children);\n};\n","export const isMutableRef = (ref) => {\n if (ref) {\n return ref.current !== undefined;\n }\n return false;\n};\nexport const getImageDimensions = (source) => new Promise((resolve, reject) => {\n const image = new Image();\n image.addEventListener('load', () => {\n resolve([image.width, image.height]);\n }, { once: true });\n image.addEventListener('error', () => reject(`Couldn't load image from ${source}`), {\n once: true,\n });\n image.src = source;\n});\n","import React, { useEffect, useState } from 'react';\nimport { getImageDimensions } from './utils/utils';\nexport const SpriteImage = ({ columns, fallback, height, position, rows, spriteUrl, style, width, }) => {\n const [[spriteWidth, spriteHeight], setSpriteDimensions] = useState([0, 0]);\n useEffect(() => {\n getImageDimensions(spriteUrl).then(setSpriteDimensions).catch(console.error);\n }, [spriteUrl]);\n const [x, y] = position;\n if (!spriteHeight || !spriteWidth)\n return React.createElement(React.Fragment, null, fallback);\n return (React.createElement(\"div\", { \"data-testid\": 'sprite-image', style: {\n ...style,\n '--str-chat__sprite-image-resize-ratio': 'var(--str-chat__sprite-image-resize-ratio-x, var(--str-chat__sprite-image-resize-ratio-y, 1))',\n '--str-chat__sprite-image-resize-ratio-x': 'calc(var(--str-chat__sprite-image-width) / var(--str-chat__sprite-item-width))',\n '--str-chat__sprite-image-resize-ratio-y': 'calc(var(--str-chat__sprite-image-height) / var(--str-chat__sprite-item-height))',\n '--str-chat__sprite-item-height': `${spriteHeight / rows}`,\n '--str-chat__sprite-item-width': `${spriteWidth / columns}`,\n ...(Number.isFinite(height)\n ? { '--str-chat__sprite-image-height': `${height}px` }\n : {}),\n ...(Number.isFinite(width)\n ? { '--str-chat__sprite-image-width': `${width}px` }\n : {}),\n backgroundImage: `url('${spriteUrl}')`,\n backgroundPosition: `${x * (100 / (columns - 1))}% ${y * (100 / (rows - 1))}%`,\n backgroundSize: `${columns * 100}% ${rows * 100}%`,\n height: 'var(--str-chat__sprite-image-height, calc(var(--str-chat__sprite-item-height) * var(--str-chat__sprite-image-resize-ratio)))',\n width: 'var(--str-chat__sprite-image-width, calc(var(--str-chat__sprite-item-width) * var(--str-chat__sprite-image-resize-ratio)))',\n } }));\n};\n","import React from 'react';\nimport { SpriteImage } from './SpriteImage';\nconst StreamSpriteEmojiPositions = {\n angry: [1, 1],\n haha: [1, 0],\n like: [0, 0],\n love: [1, 2],\n sad: [0, 1],\n wow: [0, 2],\n};\nconst STREAM_SPRITE_URL = 'https://getstream.imgix.net/images/emoji-sprite.png';\nexport const StreamEmoji = ({ fallback, type, }) => {\n const position = StreamSpriteEmojiPositions[type];\n return (React.createElement(SpriteImage, { columns: 2, fallback: fallback, position: position, rows: 3, spriteUrl: STREAM_SPRITE_URL, style: {\n '--str-chat__sprite-image-height': 'var(--str-chat__stream-emoji-size, 18px)',\n } }));\n};\n","/* eslint-disable sort-keys */\nimport React from 'react';\nimport { StreamEmoji } from './StreamEmoji';\nexport const defaultReactionOptions = [\n {\n type: 'haha',\n Component: () => React.createElement(StreamEmoji, { fallback: '\\uD83D\\uDE02', type: 'haha' }),\n name: 'Joy',\n },\n {\n type: 'like',\n Component: () => React.createElement(StreamEmoji, { fallback: '\\uD83D\\uDC4D', type: 'like' }),\n name: 'Thumbs up',\n },\n {\n type: 'love',\n Component: () => React.createElement(StreamEmoji, { fallback: '\\u2764\\uFE0F', type: 'love' }),\n name: 'Heart',\n },\n { type: 'sad', Component: () => React.createElement(StreamEmoji, { fallback: '\\uD83D\\uDE14', type: 'sad' }), name: 'Sad' },\n {\n type: 'wow',\n Component: () => React.createElement(StreamEmoji, { fallback: '\\uD83D\\uDE32', type: 'wow' }),\n name: 'Astonished',\n },\n];\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { useDialog } from '../Dialog';\nimport { defaultReactionOptions } from './reactionOptions';\nimport { isMutableRef } from './utils/utils';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useMessageContext } from '../../context/MessageContext';\nconst UnMemoizedReactionSelector = (props) => {\n const { Avatar: propAvatar, detailedView = true, handleReaction: propHandleReaction, latest_reactions: propLatestReactions, own_reactions: propOwnReactions, reaction_groups: propReactionGroups, reactionOptions: propReactionOptions, reverse = false, } = props;\n const { Avatar: contextAvatar, reactionOptions: contextReactionOptions = defaultReactionOptions, } = useComponentContext('ReactionSelector');\n const { closeReactionSelectorOnClick, handleReaction: contextHandleReaction, message, } = useMessageContext('ReactionSelector');\n const dialogId = `reaction-selector--${message.id}`;\n const dialog = useDialog({ id: dialogId });\n const reactionOptions = propReactionOptions ?? contextReactionOptions;\n const Avatar = propAvatar || contextAvatar || DefaultAvatar;\n const handleReaction = propHandleReaction || contextHandleReaction;\n const latestReactions = propLatestReactions || message?.latest_reactions || [];\n const ownReactions = propOwnReactions || message?.own_reactions || [];\n const reactionGroups = propReactionGroups || message?.reaction_groups || {};\n const [tooltipReactionType, setTooltipReactionType] = useState(null);\n const [tooltipPositions, setTooltipPositions] = useState(null);\n const rootRef = useRef(null);\n const targetRef = useRef(null);\n const tooltipRef = useRef(null);\n const showTooltip = useCallback((event, reactionType) => {\n targetRef.current = event.currentTarget;\n setTooltipReactionType(reactionType);\n }, []);\n const hideTooltip = useCallback(() => {\n setTooltipReactionType(null);\n setTooltipPositions(null);\n }, []);\n useEffect(() => {\n if (!tooltipReactionType || !rootRef.current)\n return;\n const tooltip = tooltipRef.current?.getBoundingClientRect();\n const target = targetRef.current?.getBoundingClientRect();\n const container = isMutableRef(rootRef)\n ? rootRef.current?.getBoundingClientRect()\n : null;\n if (!tooltip || !target || !container)\n return;\n const tooltipPosition = tooltip.width === container.width || tooltip.x < container.x\n ? 0\n : target.left + target.width / 2 - container.left - tooltip.width / 2;\n const arrowPosition = target.x - tooltip.x + target.width / 2 - tooltipPosition;\n setTooltipPositions({\n arrow: arrowPosition,\n tooltip: tooltipPosition,\n });\n }, [tooltipReactionType, rootRef]);\n const getUsersPerReactionType = (type) => latestReactions\n .map((reaction) => {\n if (reaction.type === type) {\n return reaction.user?.name || reaction.user?.id;\n }\n return null;\n })\n .filter(Boolean);\n const iHaveReactedWithReaction = (reactionType) => ownReactions.find((reaction) => reaction.type === reactionType);\n const getLatestUserForReactionType = (type) => latestReactions.find((reaction) => reaction.type === type && !!reaction.user)?.user ||\n undefined;\n return (React.createElement(\"div\", { className: clsx('str-chat__reaction-selector str-chat__message-reaction-selector str-chat-react__message-reaction-selector', {\n 'str-chat__reaction-selector--reverse': reverse,\n }), \"data-testid\": 'reaction-selector', ref: rootRef },\n !!tooltipReactionType && detailedView && (React.createElement(\"div\", { className: 'str-chat__reaction-selector-tooltip', ref: tooltipRef, style: {\n left: tooltipPositions?.tooltip,\n visibility: tooltipPositions ? 'visible' : 'hidden',\n } },\n React.createElement(\"div\", { className: 'arrow', style: { left: tooltipPositions?.arrow } }),\n getUsersPerReactionType(tooltipReactionType)?.map((user, i, users) => (React.createElement(\"span\", { className: 'latest-user-username', key: `key-${i}-${user}` }, `${user}${i < users.length - 1 ? ', ' : ''}`))))),\n React.createElement(\"ul\", { className: 'str-chat__message-reactions-list str-chat__message-reactions-options' }, reactionOptions.map(({ Component, name: reactionName, type: reactionType }) => {\n const latestUser = getLatestUserForReactionType(reactionType);\n const count = reactionGroups[reactionType]?.count ?? 0;\n return (React.createElement(\"li\", { key: reactionType },\n React.createElement(\"button\", { \"aria-label\": `Select Reaction: ${reactionName || reactionType}`, className: clsx('str-chat__message-reactions-list-item str-chat__message-reactions-option', {\n 'str-chat__message-reactions-option-selected': iHaveReactedWithReaction(reactionType),\n }), \"data-testid\": 'select-reaction-button', \"data-text\": reactionType, onClick: (event) => {\n handleReaction(reactionType, event);\n if (closeReactionSelectorOnClick) {\n dialog.close();\n }\n } },\n !!count && detailedView && (React.createElement(\"div\", { className: 'latest-user str-chat__message-reactions-last-user', onClick: hideTooltip, onMouseEnter: (e) => showTooltip(e, reactionType), onMouseLeave: hideTooltip }, latestUser ? (React.createElement(Avatar, { image: latestUser.image, name: latestUser.name, size: 20, user: latestUser })) : (React.createElement(\"div\", { className: 'latest-user-not-found' })))),\n React.createElement(\"span\", { className: 'str-chat__message-reaction-emoji' },\n React.createElement(Component, null)),\n Boolean(count) && detailedView && (React.createElement(\"span\", { className: 'str-chat__message-reactions-list-item__count' }, count || '')))));\n }))));\n};\n/**\n * Component that allows a user to select a reaction.\n */\nexport const ReactionSelector = React.memo(UnMemoizedReactionSelector);\n","import React, { useRef } from 'react';\nimport { ReactionSelector as DefaultReactionSelector } from './ReactionSelector';\nimport { DialogAnchor, useDialogIsOpen, useDialogOnNearestManager } from '../Dialog';\nimport { useComponentContext, useMessageContext, useTranslationContext, } from '../../context';\n/**\n * Internal convenience component - not to be exported. It just groups the button and the dialog anchor and thus prevents\n * cluttering the parent component.\n */\nexport const ReactionSelectorWithButton = ({ ReactionIcon, }) => {\n const { t } = useTranslationContext('ReactionSelectorWithButton');\n const { isMyMessage, message, threadList } = useMessageContext('MessageOptions');\n const { ReactionSelector = DefaultReactionSelector } = useComponentContext('MessageOptions');\n const buttonRef = useRef(null);\n const dialogIdNamespace = threadList ? '-thread-' : '';\n const dialogId = `reaction-selector${dialogIdNamespace}--${message.id}`;\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n return (React.createElement(React.Fragment, null,\n React.createElement(DialogAnchor, { dialogManagerId: dialogManager?.id, id: dialogId, placement: isMyMessage() ? 'top-end' : 'top-start', referenceElement: buttonRef.current, trapFocus: true },\n React.createElement(ReactionSelector, null)),\n React.createElement(\"button\", { \"aria-expanded\": dialogIsOpen, \"aria-label\": t('aria/Open Reaction Selector'), className: 'str-chat__message-reactions-button', \"data-testid\": 'message-reaction-action', onClick: () => dialog?.toggle(), ref: buttonRef },\n React.createElement(ReactionIcon, { className: 'str-chat__message-action-icon' }))));\n};\n","import React, { useContext } from 'react';\nexport const LegacyThreadContext = React.createContext({ legacyThread: undefined });\nexport const useLegacyThreadContext = () => useContext(LegacyThreadContext);\n","import { useEffect, useMemo } from 'react';\nimport { FixedSizeQueueCache, MessageComposer } from 'stream-chat';\nimport { useThreadContext } from '../../Threads';\nimport { useChannelStateContext, useChatContext, useMessageContext, } from '../../../context';\nimport { useLegacyThreadContext } from '../../Thread';\nconst queueCache = new FixedSizeQueueCache(64);\nexport const useMessageComposer = () => {\n const { client } = useChatContext();\n const { channel } = useChannelStateContext();\n const { editing, message: editedMessage } = useMessageContext();\n // legacy thread will receive new composer\n const { legacyThread: parentMessage } = useLegacyThreadContext();\n const threadInstance = useThreadContext();\n const cachedEditedMessage = useMemo(() => {\n if (!editedMessage)\n return undefined;\n return editedMessage;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editedMessage?.id]);\n const cachedParentMessage = useMemo(() => {\n if (!parentMessage)\n return undefined;\n return parentMessage;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parentMessage?.id]);\n // composer hierarchy\n // edited message (always new) -> thread instance (own) -> thread message (always new) -> channel (own)\n // editedMessage ?? thread ?? parentMessage ?? channel;\n const messageComposer = useMemo(() => {\n if (editing && cachedEditedMessage) {\n const tag = MessageComposer.constructTag(cachedEditedMessage);\n const cachedComposer = queueCache.get(tag);\n if (cachedComposer) {\n cachedComposer.editedMessage = cachedEditedMessage;\n return cachedComposer;\n }\n return new MessageComposer({\n client,\n composition: cachedEditedMessage,\n compositionContext: cachedEditedMessage,\n });\n }\n else if (threadInstance) {\n return threadInstance.messageComposer;\n }\n else if (cachedParentMessage) {\n const compositionContext = {\n ...cachedParentMessage,\n legacyThreadId: cachedParentMessage.id,\n };\n const tag = MessageComposer.constructTag(compositionContext);\n const cachedComposer = queueCache.get(tag);\n if (cachedComposer)\n return cachedComposer;\n return new MessageComposer({\n client,\n compositionContext,\n });\n }\n else {\n return channel.messageComposer;\n }\n }, [\n cachedEditedMessage,\n cachedParentMessage,\n channel,\n client,\n editing,\n threadInstance,\n ]);\n if (['legacy_thread', 'message'].includes(messageComposer.contextType) &&\n !queueCache.peek(messageComposer.tag)) {\n queueCache.add(messageComposer.tag, messageComposer);\n }\n useEffect(() => {\n const unsubscribe = messageComposer.registerSubscriptions();\n return () => {\n unsubscribe();\n };\n }, [messageComposer]);\n return messageComposer;\n};\n","import { useMemo } from 'react';\nimport { ACTIONS_NOT_WORKING_IN_THREAD, useUserRole } from '../../../components';\nimport { useChannelStateContext, useMessageContext } from '../../../context';\n/**\n * Base filter hook which covers actions of type `delete`, `edit`,\n * `flag`, `markUnread`, `mute`, `quote`, `react` and `reply`, whether\n * the rendered message is a reply (replies are limited to certain actions) and\n * whether the message has appropriate type and status.\n */\nexport const useBaseMessageActionSetFilter = (messageActionSet, disable = false) => {\n const { initialMessage: isInitialMessage, message } = useMessageContext();\n const { channelConfig } = useChannelStateContext();\n const { canDelete, canEdit, canFlag, canMarkUnread, canMute, canQuote, canReact, canReply, } = useUserRole(message);\n const isMessageThreadReply = typeof message.parent_id === 'string';\n return useMemo(() => {\n if (disable)\n return messageActionSet;\n // filter out all actions if any of these are true\n if (isInitialMessage || // not sure whether this thing even works anymore\n !message.type ||\n message.type === 'error' ||\n message.type === 'system' ||\n message.type === 'ephemeral' ||\n message.status === 'failed' ||\n message.status === 'sending')\n return [];\n return messageActionSet.filter(({ type }) => {\n // filter out actions with types that do not work in thread\n if (ACTIONS_NOT_WORKING_IN_THREAD.includes(type) && isMessageThreadReply)\n return false;\n if ((type === 'delete' && !canDelete) ||\n (type === 'edit' && !canEdit) ||\n (type === 'flag' && !canFlag) ||\n (type === 'markUnread' && !canMarkUnread) ||\n (type === 'mute' && !canMute) ||\n (type === 'quote' && !canQuote) ||\n (type === 'react' && !canReact) ||\n (type === 'reply' && !canReply) ||\n (type === 'remindMe' && !channelConfig?.['user_message_reminders']) ||\n (type === 'saveForLater' && !channelConfig?.['user_message_reminders']))\n return false;\n return true;\n });\n }, [\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canQuote,\n canReact,\n canReply,\n channelConfig,\n isInitialMessage,\n isMessageThreadReply,\n message.status,\n message.type,\n disable,\n messageActionSet,\n ]);\n};\n","import { useMemo } from 'react';\nexport const useSplitMessageActionSet = (messageActionSet) => useMemo(() => {\n const quickActionSet = [];\n const dropdownActionSet = [];\n for (const action of messageActionSet) {\n if (action.placement === 'quick')\n quickActionSet.push(action);\n if (action.placement === 'dropdown')\n dropdownActionSet.push(action);\n }\n return { dropdownActionSet, quickActionSet };\n}, [messageActionSet]);\n","import React from 'react';\nimport { isUserMuted, useMessageComposer, useMessageReminder } from '../../components';\nimport { ReactionIcon as DefaultReactionIcon, ThreadIcon, } from '../../components/Message/icons';\nimport { ReactionSelectorWithButton } from '../../components/Reactions/ReactionSelectorWithButton';\nimport { useChatContext, useMessageContext, useTranslationContext } from '../../context';\nimport { RemindMeActionButton } from '../../components/MessageActions/RemindMeSubmenu';\nconst msgActionsBoxButtonClassName = 'str-chat__message-actions-list-item-button';\nexport const DefaultDropdownActionButton = ({ 'aria-selected': ariaSelected = 'false', children, className = msgActionsBoxButtonClassName, role = 'option', ...rest }) => (React.createElement(\"button\", { \"aria-selected\": ariaSelected, className: className, role: role, ...rest }, children));\nconst DefaultMessageActionComponents = {\n dropdown: {\n Quote() {\n const { message } = useMessageContext();\n const { t } = useTranslationContext();\n const messageComposer = useMessageComposer();\n const handleQuote = () => {\n messageComposer.setQuotedMessage(message);\n const elements = message.parent_id\n ? document.querySelectorAll('.str-chat__thread .str-chat__textarea__textarea')\n : document.getElementsByClassName('str-chat__textarea__textarea');\n const textarea = elements.item(0);\n if (textarea instanceof HTMLTextAreaElement) {\n textarea.focus();\n }\n };\n return (React.createElement(DefaultDropdownActionButton, { onClick: handleQuote }, t('Quote')));\n },\n Pin() {\n const { handlePin, message } = useMessageContext();\n const { t } = useTranslationContext();\n return (React.createElement(DefaultDropdownActionButton, { onClick: handlePin }, !message.pinned ? t('Pin') : t('Unpin')));\n },\n MarkUnread() {\n const { handleMarkUnread } = useMessageContext();\n const { t } = useTranslationContext();\n return (React.createElement(DefaultDropdownActionButton, { onClick: handleMarkUnread }, t('Mark as unread')));\n },\n Flag() {\n const { handleFlag } = useMessageContext();\n const { t } = useTranslationContext();\n return (React.createElement(DefaultDropdownActionButton, { onClick: handleFlag }, t('Flag')));\n },\n Mute() {\n const { handleMute, message } = useMessageContext();\n const { mutes } = useChatContext();\n const { t } = useTranslationContext();\n return (React.createElement(DefaultDropdownActionButton, { onClick: handleMute }, isUserMuted(message, mutes) ? t('Unmute') : t('Mute')));\n },\n Edit() {\n const { handleEdit } = useMessageContext();\n const { t } = useTranslationContext();\n return (React.createElement(DefaultDropdownActionButton, { onClick: handleEdit }, t('Edit Message')));\n },\n Delete() {\n const { handleDelete } = useMessageContext();\n const { t } = useTranslationContext();\n return (React.createElement(DefaultDropdownActionButton, { onClick: handleDelete }, t('Delete')));\n },\n RemindMe() {\n const { isMyMessage } = useMessageContext();\n return (React.createElement(RemindMeActionButton, { className: msgActionsBoxButtonClassName, isMine: isMyMessage() }));\n },\n SaveForLater() {\n const { client } = useChatContext();\n const { message } = useMessageContext();\n const { t } = useTranslationContext();\n const reminder = useMessageReminder(message.id);\n return (React.createElement(DefaultDropdownActionButton, { onClick: () => reminder\n ? client.reminders.deleteReminder(reminder.id)\n : client.reminders.createReminder({ messageId: message.id }) }, reminder ? t('Remove reminder') : t('Save for later')));\n },\n },\n quick: {\n React() {\n return React.createElement(ReactionSelectorWithButton, { ReactionIcon: DefaultReactionIcon });\n },\n Reply() {\n const { handleOpenThread } = useMessageContext();\n const { t } = useTranslationContext();\n return (React.createElement(\"button\", { \"aria-label\": t('aria/Open Thread'), className: 'str-chat__message-reply-in-thread-button', \"data-testid\": 'thread-action', onClick: handleOpenThread },\n React.createElement(ThreadIcon, { className: 'str-chat__message-action-icon' })));\n },\n },\n};\nexport const defaultMessageActionSet = [\n // { placement: 'dropdown', type: 'block' },\n {\n Component: DefaultMessageActionComponents.quick.Reply,\n placement: 'quick',\n type: 'reply',\n },\n {\n Component: DefaultMessageActionComponents.quick.React,\n placement: 'quick',\n type: 'react',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Delete,\n placement: 'dropdown',\n type: 'delete',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Edit,\n placement: 'dropdown',\n type: 'edit',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Mute,\n placement: 'dropdown',\n type: 'mute',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Flag,\n placement: 'dropdown',\n type: 'flag',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Pin,\n placement: 'dropdown',\n type: 'pin',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Quote,\n placement: 'dropdown',\n type: 'quote',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.MarkUnread,\n placement: 'dropdown',\n type: 'markUnread',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.RemindMe,\n placement: 'dropdown',\n type: 'remindMe',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.SaveForLater,\n placement: 'dropdown',\n type: 'saveForLater',\n },\n];\n","import clsx from 'clsx';\nimport React, { useState } from 'react';\nimport { useChatContext, useMessageContext, useTranslationContext } from '../../context';\nimport { ActionsIcon } from '../../components/Message/icons';\nimport { DialogAnchor, useDialogIsOpen, useDialogOnNearestManager, } from '../../components/Dialog';\nimport { MessageActionsWrapper } from '../../components/MessageActions/MessageActions';\nimport { useBaseMessageActionSetFilter, useSplitMessageActionSet } from './hooks';\nimport { defaultMessageActionSet } from './defaults';\n// TODO: allow passing down customWrapperClass\n/**\n * A new actions component to replace current `MessageOptions` component.\n * Exports from `stream-chat-react/experimental` __MIGHT__ change - use with caution\n * and follow release notes in case you notice unexpected behavior.\n */\nexport const MessageActions = ({ disableBaseMessageActionSetFilter = false, messageActionSet = defaultMessageActionSet, }) => {\n const { theme } = useChatContext();\n const { isMyMessage, message } = useMessageContext();\n const { t } = useTranslationContext();\n const [actionsBoxButtonElement, setActionsBoxButtonElement] = useState(null);\n const filteredMessageActionSet = useBaseMessageActionSetFilter(messageActionSet, disableBaseMessageActionSetFilter);\n const { dropdownActionSet, quickActionSet } = useSplitMessageActionSet(filteredMessageActionSet);\n const dropdownDialogId = `message-actions--${message.id}`;\n const reactionSelectorDialogId = `reaction-selector--${message.id}`;\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dropdownDialogId });\n const dropdownDialogIsOpen = useDialogIsOpen(dropdownDialogId, dialogManager?.id);\n const reactionSelectorDialogIsOpen = useDialogIsOpen(reactionSelectorDialogId, dialogManager?.id);\n // do not render anything if total action count is zero\n if (dropdownActionSet.length + quickActionSet.length === 0) {\n return null;\n }\n return (React.createElement(\"div\", { className: clsx(`str-chat__message-${theme}__actions str-chat__message-options`, {\n 'str-chat__message-options--active': dropdownDialogIsOpen || reactionSelectorDialogIsOpen,\n }) },\n dropdownActionSet.length > 0 && (React.createElement(MessageActionsWrapper, { inline: false, toggleOpen: dialog?.toggle },\n React.createElement(\"button\", { \"aria-expanded\": dropdownDialogIsOpen, \"aria-haspopup\": 'true', \"aria-label\": t('aria/Open Message Actions Menu'), className: 'str-chat__message-actions-box-button', \"data-testid\": 'message-actions-toggle-button', ref: setActionsBoxButtonElement },\n React.createElement(ActionsIcon, { className: 'str-chat__message-action-icon' })),\n React.createElement(DialogAnchor, { dialogManagerId: dialogManager?.id, id: dropdownDialogId, placement: isMyMessage() ? 'top-end' : 'top-start', referenceElement: actionsBoxButtonElement, tabIndex: -1, trapFocus: true },\n React.createElement(DropdownBox, { open: dropdownDialogIsOpen }, dropdownActionSet.map(({ Component: DropdownActionComponent, type }) => (React.createElement(DropdownActionComponent, { key: type }))))))),\n quickActionSet.map(({ Component: QuickActionComponent, type }) => (React.createElement(QuickActionComponent, { key: type })))));\n};\nconst DropdownBox = ({ children, open }) => {\n const { t } = useTranslationContext();\n return (React.createElement(\"div\", { className: clsx('str-chat__message-actions-box', {\n 'str-chat__message-actions-box--open': open,\n }) },\n React.createElement(\"div\", { \"aria-label\": t('aria/Message Options'), className: 'str-chat__message-actions-list', role: 'listbox' }, children)));\n};\n","import React from 'react'\nimport { useMessageContext, useTranslationContext } from 'stream-chat-react'\nimport {\n DefaultDropdownActionButton,\n MessageActions,\n type MessageActionSetItem,\n} from 'stream-chat-react/experimental'\n\nconst DeleteAction = () => {\n const { handleDelete } = useMessageContext('CustomMessageActions')\n const { t } = useTranslationContext('CustomMessageActions')\n return (\n <DefaultDropdownActionButton onClick={handleDelete}>\n {t('Delete')}\n </DefaultDropdownActionButton>\n )\n}\n\nconst ReportAction = () => {\n const { handleFlag } = useMessageContext('CustomMessageActions')\n return (\n <DefaultDropdownActionButton onClick={handleFlag}>\n Report\n </DefaultDropdownActionButton>\n )\n}\n\nconst MESSAGE_ACTION_SET: MessageActionSetItem[] = [\n { Component: DeleteAction, placement: 'dropdown', type: 'delete' },\n { Component: ReportAction, placement: 'dropdown', type: 'flag' },\n]\n\nexport const CustomMessageActions = () => (\n <MessageActions messageActionSet={MESSAGE_ACTION_SET} />\n)\n","import { XIcon } from '@phosphor-icons/react'\nimport React from 'react'\nimport {\n LinkPreview,\n LinkPreviewsManager,\n LinkPreviewsManagerState,\n} from 'stream-chat'\nimport { useMessageComposer, useStateStore } from 'stream-chat-react'\n\nconst linkPreviewsManagerStateSelector = (state: LinkPreviewsManagerState) => ({\n linkPreviews: Array.from(state.previews.values()).filter(\n (preview) =>\n LinkPreviewsManager.previewIsLoaded(preview) ||\n LinkPreviewsManager.previewIsLoading(preview)\n ),\n})\n\ninterface CustomLinkPreviewCardProps {\n link: LinkPreview\n onDismiss: (url: string) => void\n}\n\nconst CustomLinkPreviewCard: React.FC<CustomLinkPreviewCardProps> = ({\n link,\n onDismiss,\n}) => {\n const { og_scrape_url, title, image_url } = link\n\n const handleDismissLink = (e: React.MouseEvent) => {\n e.preventDefault()\n onDismiss(og_scrape_url)\n }\n\n return (\n <a\n href={og_scrape_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"relative w-full block rounded-[24px] bg-[#121110] p-2 no-underline transition-opacity hover:opacity-90\"\n >\n {image_url && (\n <img\n src={image_url}\n alt={title || ''}\n className=\"h-[148px] w-full rounded-[20px] object-cover\"\n />\n )}\n <button\n type=\"button\"\n onClick={handleDismissLink}\n className=\"absolute right-4 top-4 flex size-6 items-center justify-center rounded-full border border-white/40 bg-white/70 backdrop-blur-2xl focus-ring\"\n aria-label=\"Close link preview\"\n >\n <XIcon className=\"size-4 text-black/90\" />\n </button>\n <div className=\"p-2\">\n {title && (\n <div className=\"text-[14px] font-medium leading-5 text-white\">\n {title}\n </div>\n )}\n <div className=\"text-[12px] leading-4 text-white/55\">\n {og_scrape_url}\n </div>\n </div>\n </a>\n )\n}\n\nexport const CustomLinkPreviewList = () => {\n const { linkPreviewsManager } = useMessageComposer()\n\n const { linkPreviews: stateLinkPreviews } = useStateStore(\n linkPreviewsManager.state,\n linkPreviewsManagerStateSelector\n )\n\n const handleDismiss = (url: string) => {\n linkPreviewsManager.dismissPreview(url)\n }\n\n const showLinkPreviews = stateLinkPreviews.length > 0\n\n if (!showLinkPreviews) return null\n\n return (\n <div className=\"flex flex-col items-center w-full gap-2 mb-4\">\n {stateLinkPreviews.map((linkPreview) => (\n <CustomLinkPreviewCard\n key={linkPreview.og_scrape_url}\n link={linkPreview}\n onDismiss={handleDismiss}\n />\n ))}\n </div>\n )\n}\n","import { ArrowUpIcon } from '@phosphor-icons/react'\nimport React from 'react'\nimport {\n AttachmentPreviewList,\n MessageInput,\n QuotedMessagePreview,\n SimpleAttachmentSelector,\n TextareaComposer,\n useChannelStateContext,\n useComponentContext,\n useMessageComposerHasSendableData,\n useMessageInputContext,\n} from 'stream-chat-react'\n\nimport { CustomLinkPreviewList } from '../CustomLinkPreviewList'\n\nconst DefaultSendButton: React.FC<{\n sendMessage: () => void\n disabled?: boolean\n [key: string]: unknown\n}> = ({ sendMessage, disabled, ...rest }) => (\n <button\n {...rest}\n type=\"button\"\n aria-label=\"Send\"\n disabled={disabled}\n onClick={sendMessage}\n >\n <ArrowUpIcon weight=\"bold\" className=\"size-4\" />\n </button>\n)\n\nconst CustomMessageInputInner: React.FC = () => {\n const { channel } = useChannelStateContext()\n const isFrozen = channel?.data?.frozen === true\n const { handleSubmit } = useMessageInputContext()\n const { SendButton: SendButtonFromContext } = useComponentContext(\n 'CustomMessageInput',\n )\n const SendButton = SendButtonFromContext ?? DefaultSendButton\n const hasSendableData = useMessageComposerHasSendableData()\n const isSendDisabled = isFrozen || !hasSendableData\n\n return (\n <>\n <div className=\"left-container\">\n <SimpleAttachmentSelector />\n </div>\n <div className=\"central-container min-w-0 w-full p-2 bg-white rounded-[1.5rem] shadow-[0_4px_16px_0_rgba(0,0,0,0.08),0_1px_2px_0_rgba(0,0,0,0.04),0_0_0_1px_rgba(0,0,0,0.04)]\">\n <QuotedMessagePreview />\n <CustomLinkPreviewList />\n <AttachmentPreviewList />\n <div className=\"flex\">\n <div className=\"w-full ml-2 mr-4 self-center leading-[0]\">\n <TextareaComposer\n aria-disabled={isFrozen || undefined}\n className=\"w-full resize-none outline-none leading-6\"\n maxRows={4}\n readOnly={isFrozen}\n tabIndex={isFrozen ? -1 : undefined}\n />\n </div>\n <SendButton\n sendMessage={handleSubmit}\n aria-label=\"Send\"\n className=\"str-chat__send-button mt-auto flex justify-center items-center flex-shrink-0 rounded-full size-8 bg-[#121110] disabled:bg-[#F1F0EE] disabled:text-black/20 text-white focus-ring\"\n data-testid=\"send-button\"\n disabled={isSendDisabled}\n type=\"button\"\n />\n </div>\n </div>\n </>\n )\n}\n\nexport interface CustomMessageInputProps {\n renderActions?: () => React.ReactNode\n}\n\nexport const CustomMessageInput: React.FC<CustomMessageInputProps> = ({\n renderActions,\n}) => {\n const { channel } = useChannelStateContext()\n const isFrozen = channel?.data?.frozen === true\n\n return (\n <div\n // @ts-expect-error Only React 19 onwards has `inert` in its types.\n inert={isFrozen ? '' : undefined}\n aria-disabled={isFrozen || undefined}\n className=\"message-input flex items-center gap-2 p-4 aria-disabled:opacity-40\"\n >\n {renderActions?.()}\n <MessageInput Input={CustomMessageInputInner} />\n </div>\n )\n}\n","import { ProhibitIcon, SparkleIcon } from '@phosphor-icons/react'\nimport { MessageTimestamp, type EventComponentProps } from 'stream-chat-react'\n\nimport type {\n AgeSafetySystemType,\n DmAgentSystemType,\n} from '../../stream-custom-data'\n\nconst DM_AGENT_SYSTEM_TYPES: readonly DmAgentSystemType[] = [\n 'SYSTEM_DM_AGENT_PAUSED',\n 'SYSTEM_DM_AGENT_RESUMED',\n]\n\nconst DM_AGENT_SYSTEM_MESSAGE_FALLBACK_TEXT: Record<DmAgentSystemType, string> =\n {\n SYSTEM_DM_AGENT_PAUSED: 'DM Agent has left the conversation',\n SYSTEM_DM_AGENT_RESUMED: 'DM Agent has rejoined the conversation',\n }\n\nconst AGE_SAFETY_SYSTEM_TYPES: readonly AgeSafetySystemType[] = [\n 'SYSTEM_AGE_SAFETY_BLOCKED',\n]\n\nconst AGE_SAFETY_SYSTEM_MESSAGE_FALLBACK_TEXT: Record<\n AgeSafetySystemType,\n string\n> = {\n SYSTEM_AGE_SAFETY_BLOCKED:\n 'This user isn’t able to reply because they don’t meet our age safety guidelines.',\n}\n\nconst AGE_SAFETY_SYSTEM_MESSAGE_EMPHASIS = 'age safety guidelines.'\nconst AGE_SAFETY_SYSTEM_MESSAGE_URL = 'https://linktr.ee/s/about/contact'\n\nconst isDmAgentSystemType = (\n value: string | undefined\n): value is DmAgentSystemType => {\n return DM_AGENT_SYSTEM_TYPES.includes(value as DmAgentSystemType)\n}\n\nconst isAgeSafetySystemType = (\n value: string | undefined\n): value is AgeSafetySystemType => {\n return AGE_SAFETY_SYSTEM_TYPES.includes(value as AgeSafetySystemType)\n}\n\ntype CustomSystemMessageVariant =\n | {\n kind: 'dm-agent'\n type: DmAgentSystemType\n }\n | {\n kind: 'age-safety'\n type: AgeSafetySystemType\n }\n\nconst getCustomSystemMessageVariant = (\n message: EventComponentProps['message']\n): CustomSystemMessageVariant | undefined => {\n const metadataCustomType = message.metadata?.custom_type\n if (isDmAgentSystemType(metadataCustomType)) {\n return {\n kind: 'dm-agent',\n type: metadataCustomType,\n }\n }\n\n if (isAgeSafetySystemType(metadataCustomType)) {\n return {\n kind: 'age-safety',\n type: metadataCustomType,\n }\n }\n\n const fallbackType = message.dm_agent_system_type\n if (isDmAgentSystemType(fallbackType)) {\n return {\n kind: 'dm-agent',\n type: fallbackType,\n }\n }\n\n return undefined\n}\n\nconst renderAgeSafetyMessageText = (messageText: string): React.ReactNode => {\n const emphasisIndex = messageText.indexOf(AGE_SAFETY_SYSTEM_MESSAGE_EMPHASIS)\n if (emphasisIndex === -1) {\n return messageText\n }\n\n const emphasisEndIndex =\n emphasisIndex + AGE_SAFETY_SYSTEM_MESSAGE_EMPHASIS.length\n\n return (\n <>\n {messageText.slice(0, emphasisIndex)}\n <a\n href={AGE_SAFETY_SYSTEM_MESSAGE_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mes-age-safety-system-message__emphasis font-medium text-inherit underline\"\n >\n {AGE_SAFETY_SYSTEM_MESSAGE_EMPHASIS}\n </a>\n {messageText.slice(emphasisEndIndex)}\n </>\n )\n}\n\nexport const CustomSystemMessage: React.FC<EventComponentProps> = (props) => {\n const isDateHidden = props.message.hide_date === true\n const customSystemMessageVariant = getCustomSystemMessageVariant(\n props.message\n )\n\n if (customSystemMessageVariant?.kind === 'dm-agent') {\n const messageText =\n props.message.text?.trim() ||\n DM_AGENT_SYSTEM_MESSAGE_FALLBACK_TEXT[customSystemMessageVariant.type]\n\n return (\n <div className=\"str-chat__message--system\" data-testid=\"message-system\">\n <div\n className=\"mes-dm-agent-system-message mx-auto mb-2 inline-flex w-fit max-w-[min(100%,480px)] items-center justify-center gap-[10px] rounded-[12px] border border-[rgba(0,0,0,0.08)] p-3 text-[rgba(0,0,0,0.55)]\"\n data-testid=\"dm-agent-system-message\"\n data-dm-agent-system-type={customSystemMessageVariant.type}\n >\n <SparkleIcon\n size={16}\n weight=\"regular\"\n aria-hidden\n className=\"mes-dm-agent-system-message__sparkle shrink-0\"\n />\n <p className=\"mes-dm-agent-system-message__text m-0 text-center text-[14px] font-normal leading-5 tracking-[0.21px]\">\n {messageText}\n </p>\n </div>\n {!isDateHidden && <MessageTimestamp message={props.message} />}\n </div>\n )\n }\n\n if (customSystemMessageVariant?.kind === 'age-safety') {\n const messageText =\n props.message.text?.trim() ||\n AGE_SAFETY_SYSTEM_MESSAGE_FALLBACK_TEXT[customSystemMessageVariant.type]\n\n return (\n <div className=\"str-chat__message--system\" data-testid=\"message-system\">\n <div\n className=\"mes-age-safety-system-message box-border mx-auto mb-2 flex w-full max-w-[329px] items-start justify-center gap-3 rounded-[12px] border border-[var(--border-secondary,rgba(0,0,0,0.08))] bg-[var(--bg-warning-subtle,#fef3c6)] px-2 py-4 pl-5 text-[color:var(--text-warning-on-warning,#894b00)]\"\n data-testid=\"age-safety-system-message\"\n data-age-safety-system-type={customSystemMessageVariant.type}\n >\n <ProhibitIcon\n size={24}\n weight=\"duotone\"\n aria-hidden\n className=\"mes-age-safety-system-message__icon shrink-0 text-[color:var(--text-warning-on-warning,#894b00)]\"\n data-testid=\"age-safety-system-message-icon\"\n />\n <div className=\"mes-age-safety-system-message__content min-w-0 flex-[1_0_0]\">\n <p className=\"m-0 text-balance text-left text-[12px] font-normal leading-4 tracking-[0.21px] text-[color:var(--text-warning-on-warning,#894b00)]\">\n {renderAgeSafetyMessageText(messageText)}\n </p>\n </div>\n </div>\n {!isDateHidden && <MessageTimestamp message={props.message} />}\n </div>\n )\n }\n\n return (\n <div className=\"str-chat__message--system\" data-testid=\"message-system\">\n <div className=\"str-chat__message--system__text\">\n <div className=\"str-chat__message--system__line\"></div>\n <p>{props.message.text}</p>\n <div className=\"str-chat__message--system__line\"></div>\n </div>\n {!isDateHidden && <MessageTimestamp message={props.message} />}\n </div>\n )\n}\n","import { createContext } from 'react'\n\nexport const DmAgentEnabledContext = createContext<boolean>(false)\n","import React, { useContext } from 'react'\nimport type { Event, UserResponse } from 'stream-chat'\nimport {\n AIStates,\n useAIState,\n useChannelStateContext,\n useChatContext,\n useTypingContext,\n} from 'stream-chat-react'\n\nimport { Avatar } from '../Avatar'\n\nimport { DmAgentEnabledContext } from './DmAgentContext'\n\ninterface CustomTypingIndicatorProps {\n threadList?: boolean\n}\n\nconst Circle = ({ cx, index }: { cx: string; index: number }) => (\n <circle cx={cx} cy=\"4\" r=\"3.9\" fill=\"#A0A0A0\">\n <animateTransform\n attributeName=\"transform\"\n type=\"translate\"\n values=\"0 0; 0 -2.25; 0 0;\"\n dur=\"900ms\"\n begin={`${120 * index}ms`} // 0ms, 120ms, 240ms\n repeatCount=\"indefinite\"\n />\n </circle>\n)\n\nconst AI_ACTIVE_STATES = new Set<string>([\n AIStates.Thinking,\n AIStates.Generating,\n AIStates.ExternalSources,\n])\n\nconst CustomTypingIndicator = ({ threadList }: CustomTypingIndicatorProps) => {\n const { channel, channelConfig, thread } = useChannelStateContext()\n const { client } = useChatContext()\n const { typing = {} } = useTypingContext()\n const { aiState } = useAIState(channel)\n const dmAgentEnabled = useContext(DmAgentEnabledContext)\n\n // Show the AI indicator whenever the consumer agent is producing a reply.\n // This event stream is independent of `typing.start`/`typing.stop`, so it is\n // intentionally NOT gated by `channelConfig.typing_events`. Gate strictly on\n // `dmAgentEnabled` so stale or off-surface ai_indicator events never surface\n // the bubble on channels where the agent is not active.\n const isAiActive =\n !threadList && dmAgentEnabled && AI_ACTIVE_STATES.has(aiState)\n\n if (isAiActive) {\n const agentUser = findOtherChannelUser(channel, client.user?.id)\n return (\n <TypingBubble\n avatarId={agentUser?.id ?? 'ai-agent'}\n avatarName={agentUser?.name ?? agentUser?.id ?? 'Agent'}\n avatarImage={agentUser?.image}\n testId=\"typing-indicator-ai\"\n />\n )\n }\n\n if (channelConfig?.typing_events === false) {\n return null\n }\n\n const typingInChannel = !threadList\n ? Object.values(typing).filter(\n ({ parent_id, user }: Event) =>\n user?.id !== client.user?.id && !parent_id\n )\n : []\n\n const typingInThread = threadList\n ? Object.values(typing).filter(\n ({ parent_id, user }: Event) =>\n user?.id !== client.user?.id && parent_id === thread?.id\n )\n : []\n\n const typingUsers = threadList ? typingInThread : typingInChannel\n if (!typingUsers.length) {\n return null\n }\n\n const typingUser = typingUsers[0]?.user\n const memberUser =\n typingUser?.id && channel.state.members[typingUser.id]\n ? channel.state.members[typingUser.id].user\n : undefined\n\n return (\n <TypingBubble\n avatarId={typingUser?.id ?? memberUser?.id ?? 'typing-user'}\n avatarName={\n typingUser?.name ?? memberUser?.name ?? typingUser?.id ?? 'Typing user'\n }\n avatarImage={typingUser?.image ?? memberUser?.image}\n testId=\"typing-indicator\"\n />\n )\n}\n\nconst TypingBubble = ({\n avatarId,\n avatarName,\n avatarImage,\n testId,\n}: {\n avatarId: string\n avatarName: string\n avatarImage?: string | null\n testId: string\n}) => (\n <div\n className=\"str-chat__typing-indicator !items-end !bg-transparent\"\n data-testid={testId}\n style={{ insetInlineStart: 0, insetInlineEnd: 'auto' }}\n >\n <div className=\"shrink-0\" aria-hidden=\"true\">\n <Avatar\n id={avatarId}\n name={avatarName}\n image={avatarImage ?? undefined}\n size={24}\n shape=\"circle\"\n />\n </div>\n\n <div className=\"px-4 py-3 rounded-lg bg-[#E9EAED] h-12 flex flex-col justify-end\">\n <svg\n aria-hidden=\"true\"\n className=\"block overflow-visible mb-[0.2rem]\"\n viewBox=\"0 0 32 8\"\n width=\"32\"\n height=\"8\"\n overflow=\"visible\"\n >\n <Circle cx=\"4\" index={0} />\n <Circle cx=\"16\" index={1} />\n <Circle cx=\"28\" index={2} />\n </svg>\n </div>\n </div>\n)\n\ntype ChannelLike = ReturnType<typeof useChannelStateContext>['channel']\n\nfunction findOtherChannelUser(\n channel: ChannelLike,\n selfId: string | undefined\n): UserResponse | undefined {\n const members = channel?.state?.members ?? {}\n for (const member of Object.values(members)) {\n const memberUser = member?.user\n if (memberUser && memberUser.id !== selfId) {\n return memberUser\n }\n }\n return undefined\n}\n\nexport default CustomTypingIndicator\n","import React from 'react'\n\n/**\n * Empty state component shown when a channel has no messages\n * Returns null to show nothing - the LoadingIndicator handles the loading state\n */\nexport const ChannelEmptyState: React.FC = () => null\n","import classNames from 'classnames'\n\ntype LoadingProps = {\n className?: string\n message?: string\n}\n\nconst Loading = ({ className, message }: LoadingProps) => (\n <div\n className={classNames('flex items-center justify-center h-full', className)}\n >\n <svg viewBox=\"0 0 100 100\" className=\"size-8 fill-pebble\" stroke=\"none\">\n <circle cx=\"6\" cy=\"50\" r=\"6\">\n <animateTransform\n attributeName=\"transform\"\n dur=\"1s\"\n type=\"translate\"\n values=\"0 15 ; 0 -15; 0 15\"\n repeatCount=\"indefinite\"\n begin=\"0.1\"\n />\n </circle>\n <circle cx=\"30\" cy=\"50\" r=\"6\">\n <animateTransform\n attributeName=\"transform\"\n dur=\"1s\"\n type=\"translate\"\n values=\"0 10 ; 0 -10; 0 10\"\n repeatCount=\"indefinite\"\n begin=\"0.2\"\n />\n </circle>\n <circle cx=\"54\" cy=\"50\" r=\"6\">\n <animateTransform\n attributeName=\"transform\"\n dur=\"1s\"\n type=\"translate\"\n values=\"0 5 ; 0 -5; 0 5\"\n repeatCount=\"indefinite\"\n begin=\"0.3\"\n />\n </circle>\n </svg>\n {message && <span className=\"text-stone\">{message}</span>}\n </div>\n)\n\nexport default Loading\n","import React from 'react'\n\nimport Loading from '../Loading'\n\n/**\n * Loading state component\n */\nexport const LoadingState = React.memo(() => (\n <div className=\"messaging-loading-state flex items-center justify-center h-full\">\n <div className=\"flex items-center\">\n <Loading className=\"w-6 h-6\" />\n <span className=\"text-sm text-stone\">Loading messages</span>\n </div>\n </div>\n))\nLoadingState.displayName = 'LoadingState'\n","import {\n ArrowLeftIcon,\n CaretRightIcon,\n DotsThreeIcon,\n SparkleIcon,\n StarIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useRef } from 'react'\nimport { Channel as ChannelType, ChannelMemberResponse } from 'stream-chat'\nimport {\n Channel,\n Window,\n MessageList,\n useMessageContext,\n useChannelStateContext,\n WithComponents,\n MessageUIComponentProps,\n} from 'stream-chat-react'\n\nimport { useChannelStar } from '../hooks/useChannelStar'\nimport type { ChannelViewProps } from '../types'\nimport { resolveParticipantDisplayName } from '../utils/resolveParticipantDisplayName'\n\nimport { Avatar } from './Avatar'\nimport { ChannelInfoDialog } from './ChannelInfoDialog'\nimport { CustomDateSeparator } from './CustomDateSeparator'\nimport { CustomMessage } from './CustomMessage'\nimport { CustomMessageActions } from './CustomMessage/CustomMessageActions'\nimport { CustomMessageInput } from './CustomMessageInput'\nimport { CustomSystemMessage } from './CustomSystemMessage'\nimport CustomTypingIndicator from './CustomTypingIndicator'\nimport { DmAgentEnabledContext } from './CustomTypingIndicator/DmAgentContext'\nimport { ChannelEmptyState } from './MessagingShell/ChannelEmptyState'\nimport { LoadingState } from './MessagingShell/LoadingState'\n\nconst ICON_BTN_CLASS =\n 'size-10 rounded-full bg-[#F1F0EE] hover:bg-[#E5E4E1] flex items-center justify-center transition-colors duration-150 focus-ring'\n\nconst DM_AGENT_HEADER_HELPER_TEXT = 'Replies instantly with AI assistant'\n\n/**\n * Custom channel header component\n */\nconst CustomChannelHeader: React.FC<{\n onBack?: () => void\n showBackButton: boolean\n onShowInfo: () => void\n canShowInfo: boolean\n showStarButton?: boolean\n dmAgentEnabled?: boolean\n getParticipantDisplayName: (\n participant: ChannelMemberResponse | undefined\n ) => string\n}> = ({\n onBack,\n showBackButton,\n onShowInfo,\n canShowInfo,\n showStarButton = false,\n dmAgentEnabled = false,\n getParticipantDisplayName,\n}) => {\n const { channel } = useChannelStateContext()\n\n // Get participant info (excluding current user)\n const participant = React.useMemo(() => {\n const myUserId = channel._client?.userID\n if (!myUserId) return undefined\n const members = Object.values(channel.state?.members || {})\n return members.find(\n (member) => member.user?.id && member.user.id !== myUserId\n )\n }, [channel._client?.userID, channel.state?.members])\n\n const participantName = getParticipantDisplayName(participant)\n const participantImage = participant?.user?.image\n const isStarred = useChannelStar(channel)\n\n const handleStarClick = async () => {\n try {\n if (isStarred) {\n await channel.unpin()\n } else {\n await channel.pin()\n }\n } catch (error) {\n console.error(\n '[CustomChannelHeader] Failed to update pinned status:',\n error\n )\n }\n }\n\n return (\n <div className=\"@container\">\n <div className=\"grid grid-cols-[1fr_auto_1fr] w-full items-center @lg:hidden\">\n <div className=\"flex items-center gap-2\">\n {showBackButton && (\n <button\n className={ICON_BTN_CLASS}\n onClick={onBack || (() => {})}\n type=\"button\"\n aria-label=\"Back to conversations\"\n >\n <ArrowLeftIcon className=\"size-5 text-black/90\" />\n </button>\n )}\n </div>\n <div className=\"flex flex-col gap-1 items-center\">\n <Avatar\n id={participant?.user?.id || channel.id || 'unknown'}\n name={participantName}\n image={participantImage}\n starred={showStarButton && isStarred}\n dmAgentEnabled={dmAgentEnabled}\n size={40}\n />\n <button\n type=\"button\"\n onClick={onShowInfo}\n className=\"flex items-center gap-0.5 rounded-full bg-black/[0.05] px-3 py-1 text-xs font-medium text-black/90 hover:bg-black/[0.08] transition-colors\"\n aria-label={`View info for ${participantName}`}\n >\n {participantName}\n <CaretRightIcon className=\"size-3 shrink-0\" />\n </button>\n {dmAgentEnabled && (\n <div className=\"flex items-center gap-1 text-[10px] leading-3 text-black/55\">\n <SparkleIcon className=\"size-3 shrink-0 text-black/55\" />\n <span>{DM_AGENT_HEADER_HELPER_TEXT}</span>\n </div>\n )}\n </div>\n <div className=\"flex justify-end items-center gap-2\">\n {showStarButton && (\n <button\n className={ICON_BTN_CLASS}\n onClick={handleStarClick}\n type=\"button\"\n aria-label={\n isStarred ? 'Unstar conversation' : 'Star conversation'\n }\n >\n <StarIcon\n className={classNames('size-5', {\n 'text-yellow-600': isStarred,\n 'text-black/90': !isStarred,\n })}\n weight={isStarred ? 'duotone' : 'regular'}\n />\n </button>\n )}\n <button\n className={ICON_BTN_CLASS}\n onClick={onShowInfo}\n type=\"button\"\n aria-label=\"Show info\"\n >\n <DotsThreeIcon className=\"size-5 text-black/90\" />\n </button>\n </div>\n </div>\n <div className=\"hidden @lg:flex items-center justify-between gap-3 min-h-12\">\n <div className=\"flex items-center gap-4 min-w-0\">\n {showBackButton && onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className={ICON_BTN_CLASS}\n aria-label=\"Back to conversations\"\n >\n <ArrowLeftIcon className=\"size-5 text-black/90\" />\n </button>\n )}\n {/* Avatar */}\n <Avatar\n id={participant?.user?.id || channel.id || 'unknown'}\n name={participantName}\n image={participantImage}\n starred={showStarButton && isStarred}\n dmAgentEnabled={dmAgentEnabled}\n size={40}\n />\n <div className=\"min-w-0\">\n {canShowInfo ? (\n <button\n type=\"button\"\n onClick={onShowInfo}\n className=\"flex items-center gap-1 font-medium text-black/90 truncate hover:text-black/70 transition-colors\"\n aria-label={`View info for ${participantName}`}\n >\n <span className=\"truncate\">{participantName}</span>\n <CaretRightIcon className=\"size-4 shrink-0\" />\n </button>\n ) : (\n <h1 className=\"font-medium text-black/90 truncate\">\n {participantName}\n </h1>\n )}\n {dmAgentEnabled && (\n <div className=\"mt-0.5 flex items-center gap-1 text-[10px] leading-3 text-black/55\">\n <SparkleIcon className=\"size-3 shrink-0 text-black/55\" />\n <span className=\"truncate\">{DM_AGENT_HEADER_HELPER_TEXT}</span>\n </div>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {showStarButton && (\n <button\n className={ICON_BTN_CLASS}\n onClick={handleStarClick}\n type=\"button\"\n aria-label={\n isStarred ? 'Unstar conversation' : 'Star conversation'\n }\n >\n <StarIcon\n className={classNames('size-5', {\n 'text-yellow-600': isStarred,\n 'text-black/90': !isStarred,\n })}\n weight={isStarred ? 'duotone' : 'regular'}\n />\n </button>\n )}\n {canShowInfo && onShowInfo && (\n <button\n className={ICON_BTN_CLASS}\n onClick={onShowInfo}\n type=\"button\"\n aria-label=\"Show info\"\n >\n <DotsThreeIcon className=\"size-5 text-black/90\" />\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Inner component that has access to channel context\n */\nconst ChannelViewInner: React.FC<{\n onBack?: () => void\n showBackButton: boolean\n renderMessageInputActions?: (channel: ChannelType) => React.ReactNode\n renderConversationFooter?: (channel: ChannelType) => React.ReactNode\n onLeaveConversation?: (channel: ChannelType) => void\n onBlockParticipant?: (participantId?: string) => void\n CustomChannelEmptyState?: React.ComponentType\n showDeleteConversation?: boolean\n onDeleteConversationClick?: () => void\n onBlockParticipantClick?: () => void\n onReportParticipantClick?: () => void\n showStarButton?: boolean\n chatbotVotingEnabled?: boolean\n renderChannelBanner?: () => React.ReactNode\n customProfileContent?: React.ReactNode\n customChannelActions?: React.ReactNode\n renderMessage?: (\n messageNode: React.ReactElement,\n message: NonNullable<MessageUIComponentProps['message']>\n ) => React.ReactNode\n dmAgentEnabled?: boolean\n viewerLanguage?: string\n getParticipantDisplayName: (\n participant: ChannelMemberResponse | undefined\n ) => string\n}> = ({\n onBack,\n showBackButton,\n renderMessageInputActions,\n renderConversationFooter,\n onLeaveConversation,\n onBlockParticipant,\n showDeleteConversation = true,\n onDeleteConversationClick,\n onBlockParticipantClick,\n onReportParticipantClick,\n showStarButton = false,\n chatbotVotingEnabled = false,\n renderChannelBanner,\n customProfileContent,\n customChannelActions,\n renderMessage,\n dmAgentEnabled = false,\n viewerLanguage,\n getParticipantDisplayName,\n}) => {\n const { channel } = useChannelStateContext()\n const infoDialogRef = useRef<HTMLDialogElement>(null)\n\n // Get participant info for info dialog\n const participant = React.useMemo(() => {\n const myUserId = channel._client?.userID\n if (!myUserId) return undefined\n const members = Object.values(channel.state?.members || {})\n return members.find(\n (member) => member.user?.id && member.user.id !== myUserId\n )\n }, [channel._client?.userID, channel.state?.members])\n\n const currentMember = React.useMemo(() => {\n const myUserId = channel._client?.userID\n if (!myUserId) return undefined\n const members = Object.values(channel.state?.members || {})\n return members.find((member) => member.user?.id === myUserId)\n }, [channel._client?.userID, channel.state?.members])\n\n const currentUserIsAccount =\n (currentMember?.user as { is_account?: boolean } | undefined)?.is_account ??\n (currentMember as { is_account?: boolean } | undefined)?.is_account\n const participantIsAccount =\n (participant?.user as { is_account?: boolean } | undefined)?.is_account ??\n (participant as { is_account?: boolean } | undefined)?.is_account\n\n const showDmAgentHeader =\n dmAgentEnabled &&\n currentUserIsAccount === false &&\n participantIsAccount === true\n\n // Get follower status label from channel data\n const followerStatusLabel = React.useMemo(() => {\n const channelExtraData = (channel.data ?? {}) as {\n followerStatus?: string\n isFollower?: boolean\n }\n\n // If explicit followerStatus is provided, use it\n if (channelExtraData.followerStatus) {\n return String(channelExtraData.followerStatus)\n }\n // If isFollower is explicitly defined, use it to determine status\n if (channelExtraData.isFollower !== undefined) {\n return channelExtraData.isFollower\n ? 'Subscribed to you'\n : 'Not subscribed'\n }\n // Otherwise, don't show any status\n return undefined\n }, [channel.data])\n\n const handleShowInfo = useCallback(() => {\n infoDialogRef.current?.showModal()\n }, [])\n\n const handleCloseInfo = useCallback(() => {\n infoDialogRef.current?.close()\n }, [])\n\n // Prevents all message instances from unmounting when ChannelViewInner re-renders\n const MessageOverride = useCallback(\n (props: MessageUIComponentProps) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { message } = useMessageContext('ChannelView')\n const messageNode = (\n <CustomMessage\n {...props}\n chatbotVotingEnabled={chatbotVotingEnabled}\n viewerLanguage={viewerLanguage}\n />\n )\n\n if (!renderMessage || !message) {\n return messageNode\n }\n\n return renderMessage(messageNode, message)\n },\n [chatbotVotingEnabled, renderMessage, viewerLanguage]\n )\n\n return (\n <>\n <WithComponents\n overrides={{\n Message: MessageOverride,\n MessageActions: CustomMessageActions,\n }}\n >\n <Window>\n {/* Custom Channel Header */}\n <div key=\"lt-channel-header\" className=\"p-4\">\n <CustomChannelHeader\n onBack={onBack}\n showBackButton={showBackButton}\n onShowInfo={handleShowInfo}\n canShowInfo={Boolean(participant)}\n showStarButton={showStarButton}\n dmAgentEnabled={showDmAgentHeader}\n getParticipantDisplayName={getParticipantDisplayName}\n />\n </div>\n\n {/* Custom Banner/Summary */}\n {renderChannelBanner ? (\n <React.Fragment key=\"lt-channel-banner\">\n {renderChannelBanner()}\n </React.Fragment>\n ) : null}\n\n {/* Message List */}\n <div\n key=\"lt-channel-message-list\"\n className=\"flex-1 overflow-hidden relative\"\n >\n <MessageList\n hideDeletedMessages\n hideNewMessageSeparator={false}\n />\n </div>\n\n {renderConversationFooter ? (\n <React.Fragment key=\"lt-channel-conversation-footer\">\n {renderConversationFooter(channel)}\n </React.Fragment>\n ) : null}\n\n {/* Message Input */}\n <CustomMessageInput\n key=\"lt-channel-message-input\"\n renderActions={() => renderMessageInputActions?.(channel)}\n />\n </Window>\n </WithComponents>\n\n {/* Channel Info Dialog */}\n <ChannelInfoDialog\n dialogRef={infoDialogRef}\n onClose={handleCloseInfo}\n participant={participant}\n participantDisplayName={getParticipantDisplayName(participant)}\n channel={channel}\n followerStatusLabel={followerStatusLabel}\n onLeaveConversation={onLeaveConversation}\n onBlockParticipant={onBlockParticipant}\n showDeleteConversation={showDeleteConversation}\n onDeleteConversationClick={onDeleteConversationClick}\n onBlockParticipantClick={onBlockParticipantClick}\n onReportParticipantClick={onReportParticipantClick}\n customProfileContent={customProfileContent}\n customChannelActions={customChannelActions}\n />\n </>\n )\n}\n\n/**\n * Channel view component with message list and input\n */\nexport const ChannelView = React.memo<ChannelViewProps>(\n ({\n channel,\n onBack,\n showBackButton = false,\n renderMessageInputActions,\n renderConversationFooter,\n onLeaveConversation,\n onBlockParticipant,\n className,\n CustomChannelEmptyState = ChannelEmptyState,\n showDeleteConversation = true,\n onDeleteConversationClick,\n onBlockParticipantClick,\n onReportParticipantClick,\n dmAgentEnabled,\n messageMetadata,\n onMessageSent,\n showStarButton = false,\n chatbotVotingEnabled = false,\n renderChannelBanner,\n customProfileContent,\n customChannelActions,\n renderMessage,\n sendButton,\n viewerLanguage,\n getParticipantDisplayName: getParticipantDisplayNameProp,\n }) => {\n const getParticipantDisplayName = useCallback(\n (participant: ChannelMemberResponse | undefined) =>\n getParticipantDisplayNameProp?.(participant) ??\n resolveParticipantDisplayName(participant?.user),\n [getParticipantDisplayNameProp]\n )\n\n // Custom send message handler that:\n // 1. Applies messageMetadata if provided\n // 2. Adds skip_push and silent when DM agent is active\n // 3. Calls onMessageSent callback with full response\n // Read chatbot_paused inside callback to get current value at send time (not stale closure)\n const doSendMessageRequest = useCallback(\n async (\n _channel: ChannelType,\n message: Parameters<ChannelType['sendMessage']>[0],\n options?: Parameters<ChannelType['sendMessage']>[1]\n ) => {\n const agentPaused =\n (channel.data as { chatbot_paused?: boolean })?.chatbot_paused ===\n true\n const shouldSuppressNotifications = dmAgentEnabled && !agentPaused\n\n // Build final message with nested metadata\n const finalMessage = {\n ...message,\n ...(shouldSuppressNotifications && { silent: true }),\n ...(messageMetadata && {\n metadata: {\n ...(message.metadata ?? {}),\n ...messageMetadata,\n },\n }),\n }\n\n // Build final options\n const finalOptions = {\n ...options,\n ...(shouldSuppressNotifications && { skip_push: true }),\n }\n\n const response = await channel.sendMessage(finalMessage, finalOptions)\n\n // Fire callback with full response (includes message.id)\n onMessageSent?.(response)\n\n return response\n },\n [channel, dmAgentEnabled, messageMetadata, onMessageSent]\n )\n\n return (\n <div\n className={classNames(\n 'messaging-channel-view h-full flex flex-col',\n className\n )}\n >\n <DmAgentEnabledContext.Provider value={dmAgentEnabled ?? false}>\n <Channel\n channel={channel}\n MessageSystem={CustomSystemMessage}\n EmptyStateIndicator={CustomChannelEmptyState}\n LoadingIndicator={LoadingState}\n DateSeparator={CustomDateSeparator}\n TypingIndicator={CustomTypingIndicator}\n doSendMessageRequest={doSendMessageRequest}\n {...(sendButton ? { SendButton: sendButton } : {})}\n >\n <ChannelViewInner\n onBack={onBack}\n showBackButton={showBackButton}\n renderMessageInputActions={renderMessageInputActions}\n renderConversationFooter={renderConversationFooter}\n onLeaveConversation={onLeaveConversation}\n onBlockParticipant={onBlockParticipant}\n CustomChannelEmptyState={CustomChannelEmptyState}\n showDeleteConversation={showDeleteConversation}\n onDeleteConversationClick={onDeleteConversationClick}\n onBlockParticipantClick={onBlockParticipantClick}\n onReportParticipantClick={onReportParticipantClick}\n showStarButton={showStarButton}\n dmAgentEnabled={dmAgentEnabled}\n chatbotVotingEnabled={chatbotVotingEnabled}\n renderChannelBanner={renderChannelBanner}\n customProfileContent={customProfileContent}\n customChannelActions={customChannelActions}\n renderMessage={renderMessage}\n viewerLanguage={viewerLanguage}\n getParticipantDisplayName={getParticipantDisplayName}\n />\n </Channel>\n </DmAgentEnabledContext.Provider>\n </div>\n )\n }\n)\nChannelView.displayName = 'ChannelView'\n","import React from 'react'\n\nconst ChatBubblesIllustration = ({ className }: { className?: string }) => (\n <svg\n width=\"140\"\n height=\"120\"\n viewBox=\"44 -2 144 126\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_empty_state)\">\n <path\n d=\"M123.68 82.1932C123.383 103.675 105.839 121 84.2417 121C77.4724 121 71.0986 119.297 65.5327 116.299L52.5873 119.687L53.8036 106.673C48.1776 99.8701 44.7994 91.1453 44.7994 81.6356C44.7994 59.8965 62.4554 42.2754 84.2374 42.2754C89.1328 42.2754 93.8175 43.1633 98.1413 44.789\"\n fill=\"#D7D4CE\"\n />\n <path\n d=\"M84.2458 86.0364C82.2851 86.0364 80.6957 84.4501 80.6957 82.4933C80.6957 80.5365 82.2851 78.9502 84.2458 78.9502C86.2065 78.9502 87.7959 80.5365 87.7959 82.4933C87.7959 84.4501 86.2065 86.0364 84.2458 86.0364Z\"\n fill=\"white\"\n />\n <path\n d=\"M68.3044 86.0364C66.3437 86.0364 64.7543 84.4501 64.7543 82.4933C64.7543 80.5365 66.3437 78.9502 68.3044 78.9502C70.2651 78.9502 71.8545 80.5365 71.8545 82.4933C71.8545 84.4501 70.2651 86.0364 68.3044 86.0364Z\"\n fill=\"white\"\n />\n <path\n d=\"M100.183 86.0364C98.2226 86.0364 96.6332 84.4501 96.6332 82.4933C96.6332 80.5365 98.2226 78.9502 100.183 78.9502C102.144 78.9502 103.733 80.5365 103.733 82.4933C103.733 84.4501 102.144 86.0364 100.183 86.0364Z\"\n fill=\"white\"\n />\n <g filter=\"url(#filter0_empty_state)\">\n <path\n d=\"M171.522 68.7154C177.443 61.4539 181 52.1488 181 42C181 18.8027 162.421 0 139.5 0C116.579 0 98 18.8027 98 42C98 65.1973 116.579 84 139.5 84C146.622 84 153.328 82.1857 159.184 78.9829L172.801 82.5993L171.522 68.7154Z\"\n fill=\"white\"\n />\n <path\n d=\"M171.522 68.7154C177.443 61.4539 181 52.1488 181 42C181 18.8027 162.421 0 139.5 0C116.579 0 98 18.8027 98 42C98 65.1973 116.579 84 139.5 84C146.622 84 153.328 82.1857 159.184 78.9829L172.801 82.5993L171.522 68.7154Z\"\n stroke=\"#D7D4CE\"\n strokeWidth=\"2\"\n strokeMiterlimit=\"10\"\n />\n </g>\n <path\n d=\"M139.502 45.5431C137.541 45.5431 135.952 43.9568 135.952 42C135.952 40.0432 137.541 38.4569 139.502 38.4569C141.462 38.4569 143.052 40.0432 143.052 42C143.052 43.9568 141.462 45.5431 139.502 45.5431Z\"\n fill=\"#D7D4CE\"\n />\n <path\n d=\"M123.561 45.5431C121.601 45.5431 120.011 43.9568 120.011 42C120.011 40.0432 121.601 38.4569 123.561 38.4569C125.522 38.4569 127.111 40.0432 127.111 42C127.111 43.9568 125.522 45.5431 123.561 45.5431Z\"\n fill=\"#D7D4CE\"\n />\n <path\n d=\"M155.439 45.5431C153.478 45.5431 151.889 43.9568 151.889 42C151.889 40.0432 153.478 38.4569 155.439 38.4569C157.4 38.4569 158.989 40.0432 158.989 42C158.989 43.9568 157.4 45.5431 155.439 45.5431Z\"\n fill=\"#D7D4CE\"\n />\n </g>\n <defs>\n <filter\n id=\"filter0_empty_state\"\n x=\"97\"\n y=\"-1\"\n width=\"89\"\n height=\"90\"\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\"\n />\n <feOffset dx=\"4\" dy=\"4\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.8428 0 0 0 0 0.830064 0 0 0 0 0.8095 0 0 0 1 0\"\n />\n <feBlend\n mode=\"normal\"\n in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow\"\n />\n <feBlend\n mode=\"normal\"\n in=\"SourceGraphic\"\n in2=\"effect1_dropShadow\"\n result=\"shape\"\n />\n </filter>\n <clipPath id=\"clip0_empty_state\">\n <rect width=\"233\" height=\"233\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\n/**\n * Empty state component shown when no channel is selected\n */\nexport const EmptyState = React.memo<{ hasChannels: boolean; channelsLoaded: boolean }>(\n ({ hasChannels, channelsLoaded }) => (\n <div className=\"messaging-empty-state flex items-center justify-center h-full p-8 text-balance\">\n <div className=\"flex flex-col items-center max-w-sm text-center\">\n <ChatBubblesIllustration />\n {channelsLoaded && !hasChannels && (\n <div className=\"mt-8\">\n <h2 className=\"font-medium text-black text-[18px] mb-2\">\n Your inbox is empty\n </h2>\n <p className=\"text-[#676B5F] text-sm mb-6\">\n Share with your followers to start receiving messages\n </p>\n </div>\n )}\n </div>\n </div>\n))\nEmptyState.displayName = 'EmptyState'\n","import React from 'react'\n\ntype ErrorStateProps = {\n message: string\n onBack?: () => void\n}\n\n/**\n * Error state component shown when something goes wrong\n */\nexport const ErrorState = React.memo<ErrorStateProps>(({ message, onBack }) => (\n <div className=\"messaging-error-state flex items-center justify-center h-full p-8\">\n <div className=\"text-center max-w-sm\">\n <div className=\"w-24 h-24 bg-danger-alt/20 rounded-full flex items-center justify-center mx-auto mb-6\">\n <span className=\"text-4xl\">⚠️</span>\n </div>\n\n <h2 className=\"font-semibold text-charcoal mb-2\">Oops!</h2>\n\n <p className=\"text-stone text-sm mb-6\">{message}</p>\n\n {onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-[#7f22fe] hover:bg-primary-alt rounded-lg transition-colors focus-ring\"\n >\n Go Back\n </button>\n )}\n </div>\n </div>\n))\nErrorState.displayName = 'ErrorState'\n","import classNames from 'classnames'\nimport React, { useState, useCallback, useRef, useEffect } from 'react'\nimport type { Channel } from 'stream-chat'\n\nimport { useMessaging } from '../../hooks/useMessaging'\nimport type { MessagingShellProps } from '../../types'\nimport { ChannelList } from '../ChannelList'\nimport { ChannelView } from '../ChannelView'\n\nimport { EmptyState } from './EmptyState'\nimport { ErrorState } from './ErrorState'\nimport { LoadingState } from './LoadingState'\n\n/**\n * Main messaging interface component that combines channel list and channel view\n */\nexport const MessagingShell: React.FC<MessagingShellProps> = ({\n capabilities = {},\n className,\n renderMessageInputActions,\n renderConversationFooter,\n onChannelSelect,\n initialParticipantFilter,\n initialParticipantData,\n CustomChannelEmptyState,\n showChannelList = true,\n filters,\n channelRenderFilterFn,\n channelListCustomEmptyStateIndicator,\n onDeleteConversationClick,\n onBlockParticipantClick,\n onReportParticipantClick,\n dmAgentEnabled,\n messageMetadata,\n onMessageSent,\n showStarButton = false,\n chatbotVotingEnabled = false,\n viewerLanguage,\n renderMessagePreview,\n renderChannelBanner,\n customProfileContent,\n customChannelActions,\n renderMessage,\n sendButton,\n}) => {\n const {\n service,\n client,\n isConnected,\n isLoading,\n error,\n refreshConnection,\n debug,\n } = useMessaging()\n\n const [selectedChannel, setSelectedChannel] = useState<Channel | null>(null)\n const [hasChannels, setHasChannels] = useState(false)\n const [channelsLoaded, setChannelsLoaded] = useState(false)\n const [directConversationMode, setDirectConversationMode] = useState(false)\n const [directConversationError, setDirectConversationError] = useState<\n string | null\n >(null)\n\n const { showDeleteConversation = true } = capabilities\n\n // Create default filters and merge with provided filters\n const channelFilters = React.useMemo(() => {\n const userId = client?.userID\n\n // Base filters that should always be present\n const baseFilters = {\n type: 'messaging',\n last_message_at: { $exists: true },\n ...(userId && {\n members: { $in: [userId] },\n hidden: false,\n }),\n }\n\n // Merge provided filters with base filters\n // Provided filters can override base filters if needed\n return {\n ...baseFilters,\n ...filters,\n }\n }, [filters, client?.userID])\n\n // Track if we've already synced channels to prevent repeated API calls\n const syncedRef = useRef<string | null>(null)\n\n // Function to sync channels (extracted for reuse)\n const syncChannels = useCallback(async () => {\n if (!client || !isConnected) return\n\n const userId = client.userID\n if (!userId) return\n\n try {\n if (debug) {\n console.log('[MessagingShell] Syncing channels for user:', userId)\n }\n\n const channels = await client.queryChannels(\n {\n type: 'messaging',\n members: { $in: [userId] },\n },\n {},\n { limit: 100 }\n )\n\n setHasChannels(channels.length > 0)\n setChannelsLoaded(true)\n syncedRef.current = userId // Mark as synced for this user\n\n if (debug) {\n console.log('[MessagingShell] Channels synced successfully:', {\n channelCount: channels.length,\n })\n }\n } catch (error) {\n console.error('[MessagingShell] Failed to sync channels:', error)\n // Don't mark as synced on error, allow retry\n }\n }, [client, isConnected, debug])\n\n // Sync existing channels to drive empty-state behavior.\n useEffect(() => {\n if (!client || !isConnected) return\n\n const userId = client.userID\n if (!userId) return\n\n // Prevent repeated sync for the same user\n if (syncedRef.current === userId) return\n\n syncChannels()\n }, [client, isConnected, syncChannels])\n\n // Load initial channel for direct conversation mode\n useEffect(() => {\n if (!initialParticipantFilter || !client || !isConnected) return\n\n const loadInitialChannel = async () => {\n const userId = client.userID\n if (!userId) return\n\n try {\n if (debug) {\n console.log(\n '[MessagingShell] Loading initial conversation with:',\n initialParticipantFilter\n )\n }\n\n const channels = await client.queryChannels(\n {\n type: 'messaging',\n members: { $eq: [userId, initialParticipantFilter] },\n },\n {},\n { limit: 1 }\n )\n\n if (channels.length > 0) {\n setSelectedChannel(channels[0])\n setDirectConversationMode(true)\n setDirectConversationError(null)\n\n // Notify parent component of channel selection\n if (onChannelSelect) {\n onChannelSelect(channels[0])\n }\n\n if (debug) {\n console.log(\n '[MessagingShell] Initial conversation loaded:',\n channels[0].id\n )\n }\n } else {\n // No channel found - try to create one if participant data is provided\n if (initialParticipantData && service) {\n if (debug) {\n console.log(\n '[MessagingShell] No conversation found, creating one for:',\n initialParticipantData\n )\n }\n\n try {\n // Use the existing service method to create the channel\n const channel = await service.startChannelWithParticipant({\n id: initialParticipantData.id,\n name: initialParticipantData.name,\n phone: initialParticipantData.phone,\n })\n\n setSelectedChannel(channel)\n setDirectConversationMode(true)\n setDirectConversationError(null)\n\n // Notify parent component of channel selection\n if (onChannelSelect) {\n onChannelSelect(channel)\n }\n\n if (debug) {\n console.log(\n '[MessagingShell] Channel created and loaded:',\n channel.id\n )\n }\n } catch (createErr) {\n console.error(\n '[MessagingShell] Failed to create conversation:',\n createErr\n )\n setDirectConversationError('Failed to create conversation')\n }\n } else {\n // No participant data provided, show error\n setDirectConversationError(\n 'No conversation found with this account'\n )\n\n if (debug) {\n console.log(\n '[MessagingShell] No conversation found for:',\n initialParticipantFilter\n )\n }\n }\n }\n } catch (err) {\n console.error(\n '[MessagingShell] Failed to load initial conversation:',\n err\n )\n setDirectConversationError('Failed to load conversation')\n }\n }\n\n loadInitialChannel()\n }, [\n initialParticipantFilter,\n initialParticipantData,\n client,\n isConnected,\n service,\n debug,\n onChannelSelect,\n ])\n\n const handleChannelSelect = useCallback(\n (channel: Channel) => {\n setSelectedChannel(channel)\n onChannelSelect?.(channel)\n },\n [onChannelSelect]\n )\n\n const handleBackToChannelList = useCallback(() => {\n // In direct conversation mode, don't allow going back to channel list\n // The parent component should handle navigation\n if (directConversationMode) return\n\n setSelectedChannel(null)\n }, [directConversationMode])\n\n const handleLeaveConversation = useCallback(\n async (channel: Channel) => {\n if (debug) {\n console.log('[MessagingShell] Leaving conversation:', channel.id)\n }\n setSelectedChannel(null)\n setDirectConversationMode(false) // Exit direct conversation mode\n\n // Force re-sync to update the existing participants list\n syncedRef.current = null\n await syncChannels()\n },\n [syncChannels, debug]\n )\n\n const handleBlockParticipant = useCallback(\n async (participantId?: string) => {\n if (debug) {\n console.log('[MessagingShell] Blocking participant:', participantId)\n }\n setSelectedChannel(null)\n setDirectConversationMode(false) // Exit direct conversation mode\n\n // Force re-sync to update the existing participants list\n syncedRef.current = null\n await syncChannels()\n },\n [syncChannels, debug]\n )\n\n const isChannelSelected = Boolean(selectedChannel)\n\n // Show loading state\n if (isLoading) {\n return (\n <div className={classNames('h-full', className)}>\n <LoadingState />\n </div>\n )\n }\n\n // Show error state\n if (error) {\n return (\n <div className={classNames('h-full', className)}>\n <ErrorState message={error} onBack={refreshConnection} />\n </div>\n )\n }\n\n // Show not connected state\n if (!isConnected || !client) {\n return (\n <div className={classNames('h-full', className)}>\n <ErrorState\n message=\"Not connected to messaging service\"\n onBack={refreshConnection}\n />\n </div>\n )\n }\n\n // Show direct conversation error state\n if (directConversationError) {\n return (\n <div className={classNames('h-full', className)}>\n <ErrorState message={directConversationError} />\n </div>\n )\n }\n\n return (\n <div\n className={classNames(\n 'messaging-shell h-full bg-background-primary overflow-hidden',\n className\n )}\n >\n <div className=\"flex h-full min-h-0\">\n {/* Channel List Sidebar */}\n <div\n className={classNames(\n 'messaging-channel-list-sidebar min-h-0 min-w-0 lg:flex lg:flex-col',\n {\n '!hidden': showChannelList === false || directConversationMode,\n // Hide on mobile when channel selected, show on desktop with consistent wide width\n 'hidden lg:flex lg:flex-1 lg:max-w-2xl':\n showChannelList !== false &&\n !directConversationMode &&\n isChannelSelected,\n // Show on mobile when no channel selected, use same wide width on desktop\n 'flex flex-col w-full lg:flex-1 lg:max-w-2xl':\n showChannelList !== false &&\n !directConversationMode &&\n !isChannelSelected,\n }\n )}\n >\n <ChannelList\n onChannelSelect={handleChannelSelect}\n selectedChannel={selectedChannel || undefined}\n filters={channelFilters}\n channelRenderFilterFn={channelRenderFilterFn}\n customEmptyStateIndicator={channelListCustomEmptyStateIndicator}\n renderMessagePreview={renderMessagePreview}\n viewerLanguage={viewerLanguage}\n />\n </div>\n\n {/* Channel View */}\n <div\n className={classNames(\n 'messaging-conversation-view flex-1 flex-col min-w-0 min-h-0',\n {\n // In direct conversation mode (or waiting for it), always show (full width)\n flex:\n directConversationMode ||\n isChannelSelected ||\n initialParticipantFilter,\n // Normal mode: hide on mobile when no channel selected\n 'hidden lg:flex':\n !directConversationMode &&\n !isChannelSelected &&\n !initialParticipantFilter,\n }\n )}\n >\n {selectedChannel ? (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <ChannelView\n channel={selectedChannel}\n key={selectedChannel.id}\n onBack={handleBackToChannelList}\n showBackButton={!directConversationMode}\n renderMessageInputActions={renderMessageInputActions}\n renderConversationFooter={renderConversationFooter}\n renderChannelBanner={renderChannelBanner}\n onLeaveConversation={handleLeaveConversation}\n onBlockParticipant={handleBlockParticipant}\n CustomChannelEmptyState={CustomChannelEmptyState}\n showDeleteConversation={showDeleteConversation}\n onDeleteConversationClick={onDeleteConversationClick}\n onBlockParticipantClick={onBlockParticipantClick}\n onReportParticipantClick={onReportParticipantClick}\n dmAgentEnabled={dmAgentEnabled}\n messageMetadata={messageMetadata}\n onMessageSent={onMessageSent}\n showStarButton={showStarButton}\n chatbotVotingEnabled={chatbotVotingEnabled}\n viewerLanguage={viewerLanguage}\n customProfileContent={customProfileContent}\n customChannelActions={customChannelActions}\n renderMessage={renderMessage}\n sendButton={sendButton}\n />\n </div>\n ) : initialParticipantFilter ? (\n // Show loading while creating/loading direct conversation channel\n <LoadingState />\n ) : (\n <EmptyState\n hasChannels={hasChannels}\n channelsLoaded={channelsLoaded}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * Scheme detector: `protocol:` per RFC 3986 — a letter followed by any\n * combination of letters, digits, `+`, `.`, or `-` then `:`.\n */\nconst SCHEME_PATTERN = /^([a-z][a-z0-9+.-]*):/i\n\n/**\n * Allowlist of schemes that are safe to forward into `<a href>` for\n * external navigation. `javascript:` / `data:` / `vbscript:` etc. are\n * intentionally **not** on this list — link-attachment data is\n * effectively user-controlled, so passing them through would let a\n * recipient click execute attacker-supplied code or markup.\n */\nconst SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel', 'sms'])\n\n/**\n * Normalize a user-supplied URL into something safe to assign to\n * `<a href>` for external navigation.\n *\n * Link attachments / link apps always point at external destinations\n * (Spotify, TikTok, FAQ links, bare-hostname Linktree URLs like\n * `tr.ee/briemix`, etc.). Without normalization, a bare hostname is\n * treated as a relative path by the browser and clicks navigate within\n * the host site (e.g. `https://linktr.ee/admin/tr.ee/briemix`) instead\n * of opening the intended destination.\n *\n * Rules:\n * - Empty / whitespace-only → returns `undefined` (no href).\n * - Explicit scheme in the safe allowlist (`http`, `https`, `mailto`,\n * `tel`, `sms`) → returned trimmed.\n * - Explicit scheme **not** on the allowlist (`javascript:`, `data:`,\n * `vbscript:`, custom protocols, …) → returns `undefined` so the\n * shell falls back to a non-navigational chrome instead of letting\n * an attacker-controlled URL execute on click.\n * - Protocol-relative (`//example.com/…`) → returned as-is; browsers\n * resolve these against the current page's scheme.\n * - Site-relative path (`/admin/…`) → returned as-is so consumers can\n * still opt into in-app navigation if they really want to.\n * - Bare hostname or anything else → `https://` is prepended so the\n * browser treats it as an external URL.\n */\nexport function normalizeExternalHref(value?: string): string | undefined {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n if (trimmed === '') return undefined\n\n const schemeMatch = SCHEME_PATTERN.exec(trimmed)\n if (schemeMatch) {\n const scheme = schemeMatch[1].toLowerCase()\n return SAFE_SCHEMES.has(scheme) ? trimmed : undefined\n }\n\n if (trimmed.startsWith('//')) return trimmed\n if (trimmed.startsWith('/')) return trimmed\n return `https://${trimmed}`\n}\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport type { LinkAttachmentCta } from '../../types'\n\nimport type { LinkAttachmentVariant } from './CardShell'\nimport { normalizeExternalHref } from './normalizeExternalHref'\n\nexport interface CardCtaProps {\n variant: LinkAttachmentVariant\n cta: LinkAttachmentCta\n}\n\nconst BUTTON_CLASS_BY_VARIANT: Record<LinkAttachmentVariant, string> = {\n dark: 'bg-white text-[#121110] hover:bg-white/90',\n light: 'bg-[#121110] text-white hover:bg-[#2a2928]',\n}\n\n/**\n * Pill-shaped CTA rendered below the description on Link App cards that\n * surface an action instead of a URL (e.g. FAQ \"View FAQs\", Form \"Complete form\").\n * Renders as `<a target=\"_blank\">` when `cta.href` is set, otherwise as a\n * plain `<button>`.\n */\nconst CardCta: React.FC<CardCtaProps> = ({ variant, cta }) => {\n const className = classNames(\n 'mt-2 inline-flex h-10 w-full items-center justify-center rounded-full px-4 text-sm font-medium leading-none transition-colors',\n BUTTON_CLASS_BY_VARIANT[variant]\n )\n\n // Mirror the URL normalization used by the shell anchor so bare\n // hostnames (e.g. `tr.ee/foo`) open as external links rather than\n // resolving against the current host.\n const normalizedHref = normalizeExternalHref(cta.href)\n\n if (normalizedHref) {\n return (\n <a\n href={normalizedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n // Stop the click from bubbling up to the card's anchor wrapper\n // (Received variant) so we don't navigate twice.\n e.stopPropagation()\n cta.onClick?.()\n }}\n className={`${className} no-underline`}\n >\n {cta.label}\n </a>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n cta.onClick?.()\n }}\n className={className}\n >\n {cta.label}\n </button>\n )\n}\n\nexport default CardCta\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport type { LinkAttachmentCta } from '../../types'\n\nimport CardCta from './CardCta'\nimport type { LinkAttachmentVariant } from './CardShell'\n\nexport interface CardBodyProps {\n variant: LinkAttachmentVariant\n title?: string\n /** Placeholder shown in the title slot when no title is set (dark variants only). */\n placeholderTitle?: string\n description?: string\n /** Footer URL shown below the description. Ignored when `cta` is set. */\n url?: string\n /**\n * Optional 16x16 brand badge rendered before the title (used by Link Apps:\n * Spotify, TikTok, FAQ, Form, etc.).\n */\n appIcon?: React.ReactNode\n /** Optional CTA rendered in place of the URL footer. */\n cta?: LinkAttachmentCta\n /** Trailing action rendered on the right of the title/description block. */\n trailingAction?: React.ReactNode\n}\n\nconst TITLE_CLASS_BY_VARIANT: Record<LinkAttachmentVariant, string> = {\n dark: 'text-white',\n light: 'text-black/90',\n}\n\nconst TITLE_DIMMED_CLASS = 'text-white/30'\n\nconst SECONDARY_CLASS_BY_VARIANT: Record<LinkAttachmentVariant, string> = {\n dark: 'text-white/55',\n light: 'text-black/55',\n}\n\n/**\n * Body of a `LinkAttachment.*` card. Matches the Figma `Container > Labels`\n * group: 16px horizontal padding, 12px vertical padding, 8px gap between\n * the title/description group and the URL/CTA footer, 4px gap within the\n * title group.\n *\n * Returns `null` when there's nothing to render so plain image / file\n * attachments collapse to a thumbnail-only card.\n */\nconst CardBody: React.FC<CardBodyProps> = ({\n variant,\n title,\n placeholderTitle,\n description,\n url,\n appIcon,\n cta,\n trailingAction,\n}) => {\n const isDark = variant === 'dark'\n const displayTitle = title ?? (isDark ? placeholderTitle : undefined) ?? ''\n const hasTitle = displayTitle.trim() !== ''\n const hasDescription =\n description != null && description.trim() !== ''\n // Mirror the trimming applied by `ReceivedCard` so a whitespace-only\n // `url` collapses the body footer (and the whole body, for media-only\n // cards) instead of rendering an empty line.\n const trimmedUrl = typeof url === 'string' ? url.trim() : ''\n const hasUrl = trimmedUrl !== ''\n const hasCta = cta != null\n\n if (!hasTitle && !hasDescription && !hasUrl && !hasCta) return null\n\n const titleDimmed = isDark && !title\n\n const titleClass = classNames(\n 'truncate text-base font-medium leading-6',\n titleDimmed ? TITLE_DIMMED_CLASS : TITLE_CLASS_BY_VARIANT[variant]\n )\n\n const secondaryClass = classNames(\n 'truncate text-xs leading-4',\n SECONDARY_CLASS_BY_VARIANT[variant]\n )\n\n return (\n <div className=\"px-4 py-3\">\n <div className=\"flex items-end gap-3\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex min-w-0 flex-col gap-1\">\n {hasTitle && (\n <div className=\"flex min-w-0 items-center gap-2\">\n {appIcon ? <span className=\"shrink-0\">{appIcon}</span> : null}\n <p className={classNames('min-w-0', titleClass)}>\n {displayTitle}\n </p>\n </div>\n )}\n\n {hasDescription && (\n <p className={secondaryClass}>{description}</p>\n )}\n </div>\n\n {!hasCta && hasUrl && (\n <p className={secondaryClass}>{trimmedUrl}</p>\n )}\n </div>\n\n {trailingAction && <div className=\"shrink-0\">{trailingAction}</div>}\n </div>\n\n {cta && <CardCta variant={variant} cta={cta} />}\n </div>\n )\n}\n\nexport default CardBody\n","import classNames from 'classnames'\nimport React from 'react'\n\nexport type LinkAttachmentVariant = 'dark' | 'light'\n\nexport interface CardShellProps {\n variant: LinkAttachmentVariant\n children: React.ReactNode\n /**\n * When provided, the entire card chrome is rendered as an anchor (used by\n * the Received card to open the link target on click). Falls back to a\n * `<div>` when omitted so Composer / Sent cards stay non-navigational.\n */\n href?: string\n /**\n * Click handler for the card chrome. When `href` is set the shell is an\n * anchor and `onClick` is invoked in addition to navigation. When `href`\n * is omitted but `onClick` is set, the shell renders as a clickable\n * button (used by media-only Received cards to open an image preview).\n */\n onClick?: () => void\n /** Accessible label for the clickable variant (when `onClick` is set without `href`). */\n ariaLabel?: string\n rootRef?: React.Ref<HTMLElement>\n /**\n * Absolutely-positioned slot rendered in the top-right corner of the\n * shell. Used by the Composer card to surface its dismiss affordance\n * when there's no hero thumbnail to anchor it to.\n */\n topRight?: React.ReactNode\n /**\n * Overrides the variant-derived background colour (e.g. audio cards\n * use `bg-[#F2F3F4]` regardless of the dark/light variant).\n */\n bgClassName?: string\n 'data-testid'?: string\n}\n\nconst SHELL_CLASS = classNames(\n 'relative block w-[280px] select-none overflow-hidden rounded-md',\n // 1px hairline border that sits flush with the card chrome — matches\n // the messaging design system's \"small border around link attachments\"\n // treatment from the mobile spec. The drop shadow remains for depth.\n 'border border-black/[0.08]',\n 'shadow-[0_1px_2px_rgba(0,0,0,0.04),0_8px_32px_rgba(0,0,0,0.1)]'\n)\n\n/**\n * Outer chrome for every `LinkAttachment.*` card. Matches the 280px width,\n * 16px corner radius, and shadow-400 treatment from the Figma design system.\n */\nconst CardShell: React.FC<CardShellProps> = ({\n variant,\n children,\n href,\n onClick,\n ariaLabel,\n rootRef,\n topRight,\n bgClassName,\n 'data-testid': dataTestId,\n}) => {\n const isInteractive = href != null || onClick != null\n const className = classNames(\n SHELL_CLASS,\n bgClassName ?? (variant === 'dark' ? 'bg-[#121110]' : 'bg-white'),\n // `focus-ring` is a design-system utility from the component-library\n // tailwind preset — outline-none + a black 2px focus-visible ring\n // with offset, so keyboard users can see the focused card.\n isInteractive ? 'cursor-pointer no-underline focus-ring' : null\n )\n\n const corner = topRight ? (\n <div className=\"pointer-events-auto absolute right-3 top-3 z-10\">\n {topRight}\n </div>\n ) : null\n\n if (href) {\n return (\n <a\n ref={rootRef as React.Ref<HTMLAnchorElement>}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onClick}\n data-testid={dataTestId}\n className={className}\n >\n {children}\n {corner}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n ref={rootRef as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n data-testid={dataTestId}\n className={classNames(className, 'text-left')}\n >\n {children}\n {corner}\n </button>\n )\n }\n\n return (\n <div\n ref={rootRef as React.Ref<HTMLDivElement>}\n data-testid={dataTestId}\n className={className}\n >\n {children}\n {corner}\n </div>\n )\n}\n\nexport default CardShell\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport { renderTypeIcon } from '../../../AttachmentCard'\nimport { getSourceType } from '../../../AttachmentCard/utils/mimeType'\n\nimport type { LinkAttachmentVariant } from './CardShell'\n\nexport interface CardThumbnailProps {\n variant: LinkAttachmentVariant\n /** Source URL of the hero image (or poster for video). */\n thumbnailUrl?: string\n /**\n * Playable media URL. When provided alongside a video / audio `mimeType`,\n * the hero region renders a native HTML5 player with controls instead of\n * the static thumbnail / placeholder.\n */\n sourceUrl?: string\n /** Alt text — typically the card's title. */\n title?: string\n /**\n * Drives the placeholder type icon when no `thumbnailUrl` is provided,\n * and selects between image / video / audio rendering when `sourceUrl`\n * is set. Defaults to a generic image icon when unset.\n */\n mimeType?: string\n /** Optional decorations layered into the top corners of the thumbnail. */\n topLeft?: React.ReactNode\n topRight?: React.ReactNode\n}\n\nconst PLACEHOLDER_BG: Record<LinkAttachmentVariant, string> = {\n dark: 'bg-white/10',\n light: 'bg-black/5',\n}\n\nconst PLACEHOLDER_ICON: Record<LinkAttachmentVariant, string> = {\n dark: 'size-16 text-white/25',\n light: 'size-16 text-black/25',\n}\n\n/**\n * 180px hero region shown above the card body. Renders, in priority order:\n * 1. A native `<video controls>` when `sourceUrl` is set and the mime is\n * video — `thumbnailUrl` acts as the poster.\n * 2. A native `<audio controls>` when `sourceUrl` is set and the mime is\n * audio — laid over the audio type-icon backdrop.\n * 3. The supplied `thumbnailUrl` image.\n * 4. A placeholder type-icon derived from `mimeType`.\n */\n/** Mime + sourceUrl gives us a playable audio attachment. */\nexport const isPlayableAudio = (mimeType?: string, sourceUrl?: string) =>\n !!sourceUrl && !!mimeType && getSourceType(mimeType) === 'audio'\n\n/**\n * Mime + sourceUrl gives us a playable video or audio attachment. Used by\n * Received to skip wrapping the shell in an interactive `<button>` so the\n * native media controls remain operable.\n */\nexport const isPlayableMedia = (mimeType?: string, sourceUrl?: string) => {\n if (!sourceUrl || !mimeType) return false\n const source = getSourceType(mimeType)\n return source === 'video' || source === 'audio'\n}\n\n/**\n * Background colour the LinkAttachment cards switch to when the source is\n * audio — flat neutral around the native `<audio>` chrome regardless of\n * the dark / light variant.\n */\nexport const AUDIO_BG_CLASS = 'bg-[#F2F3F4]'\n\nconst CardThumbnail: React.FC<CardThumbnailProps> = ({\n variant,\n thumbnailUrl,\n sourceUrl,\n title,\n mimeType = 'image/*',\n topLeft,\n topRight,\n}) => {\n const sourceType = getSourceType(mimeType)\n const isPlayableVideo = !!sourceUrl && sourceType === 'video'\n\n if (isPlayableAudio(mimeType, sourceUrl)) {\n // Audio collapses the hero entirely — the native player sits inside\n // the card chrome with a bit of padding so the card background\n // (typically `bg-[#F2F3F4]`) is visible around it.\n return (\n <div className=\"p-3\">\n <audio\n src={sourceUrl}\n controls\n preload=\"metadata\"\n className=\"block w-full\"\n >\n <track kind=\"captions\" />\n </audio>\n </div>\n )\n }\n\n return (\n <div\n className={classNames(\n 'relative h-[180px] w-full overflow-hidden',\n isPlayableVideo && 'bg-black'\n )}\n >\n {isPlayableVideo ? (\n <video\n src={sourceUrl}\n poster={thumbnailUrl}\n controls\n playsInline\n preload=\"metadata\"\n className=\"absolute inset-0 h-full w-full object-contain\"\n >\n <track kind=\"captions\" />\n </video>\n ) : thumbnailUrl ? (\n <img\n src={thumbnailUrl}\n alt={title ?? ''}\n draggable={false}\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div\n className={classNames(\n 'flex h-full w-full items-center justify-center',\n PLACEHOLDER_BG[variant]\n )}\n >\n {renderTypeIcon(mimeType, {\n className: PLACEHOLDER_ICON[variant],\n weight: 'regular',\n })}\n </div>\n )}\n\n {topLeft ? (\n <div className=\"pointer-events-auto absolute left-3 top-3 z-10\">\n {topLeft}\n </div>\n ) : null}\n {topRight ? (\n <div className=\"pointer-events-auto absolute right-3 top-3 z-10\">\n {topRight}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default CardThumbnail\n","import { PencilSimpleIcon, XIcon } from '@phosphor-icons/react'\nimport React from 'react'\n\nimport type { LinkAttachmentBaseProps } from '../../types'\nimport CardBody from '../_shared/CardBody'\nimport CardShell from '../_shared/CardShell'\nimport CardThumbnail, {\n AUDIO_BG_CLASS,\n isPlayableAudio,\n} from '../_shared/CardThumbnail'\n\nexport interface ComposerCardProps extends LinkAttachmentBaseProps {\n /**\n * When provided, renders a dismiss X in the thumbnail corner. Called when\n * the composer clicks it to remove the attachment.\n */\n onDismiss?: () => void\n /**\n * When provided, renders a pencil button to the right of the description\n * that the composer can use to edit the attachment metadata.\n */\n onEditClick?: () => void\n}\n\n/**\n * The card the composer sees while drafting a link attachment.\n * Matches the Composer column of the messaging design system in Figma.\n */\nconst ComposerCard: React.FC<ComposerCardProps> = ({\n title,\n placeholderTitle,\n description,\n url,\n mimeType,\n thumbnailUrl,\n sourceUrl,\n layout = 'featured',\n appIcon,\n cta,\n onDismiss,\n onEditClick,\n}) => {\n const isClassic = layout === 'classic'\n const isAudio = isPlayableAudio(mimeType, sourceUrl)\n const dismissButton = onDismiss ? (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss attachment\"\n className=\"flex size-6 items-center justify-center rounded-full bg-[#121110] text-white\"\n >\n <XIcon className=\"size-3\" weight=\"bold\" />\n </button>\n ) : undefined\n\n const editButton = onEditClick ? (\n <button\n type=\"button\"\n onClick={onEditClick}\n aria-label=\"Edit attachment\"\n className=\"flex size-10 items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/15\"\n >\n <PencilSimpleIcon className=\"size-5\" weight=\"regular\" />\n </button>\n ) : undefined\n\n // Audio cards collapse to just the native player — render the dismiss\n // button as an inline sibling so it always has its own space and never\n // overlaps the audio control's volume/menu buttons.\n if (isAudio) {\n return (\n <CardShell variant=\"dark\" bgClassName={AUDIO_BG_CLASS}>\n <div className=\"flex items-center gap-2 pr-3\">\n <div className=\"min-w-0 flex-1\">\n <CardThumbnail\n variant=\"dark\"\n sourceUrl={sourceUrl}\n title={title}\n mimeType={mimeType}\n />\n </div>\n {dismissButton && <div className=\"shrink-0\">{dismissButton}</div>}\n </div>\n </CardShell>\n )\n }\n\n return (\n <CardShell\n variant=\"dark\"\n topRight={isClassic ? dismissButton : undefined}\n >\n {!isClassic && (\n <CardThumbnail\n variant=\"dark\"\n thumbnailUrl={thumbnailUrl}\n sourceUrl={sourceUrl}\n title={title}\n mimeType={mimeType}\n topRight={dismissButton}\n />\n )}\n <CardBody\n variant=\"dark\"\n title={title}\n placeholderTitle={placeholderTitle}\n description={description}\n url={url}\n appIcon={appIcon}\n cta={cta}\n trailingAction={editButton}\n />\n </CardShell>\n )\n}\n\nexport default ComposerCard\n","import React from 'react'\n\nimport type { LinkAttachmentBaseProps } from '../../types'\nimport CardBody from '../_shared/CardBody'\nimport CardShell from '../_shared/CardShell'\nimport CardThumbnail, {\n AUDIO_BG_CLASS,\n isPlayableAudio,\n isPlayableMedia,\n} from '../_shared/CardThumbnail'\nimport { normalizeExternalHref } from '../_shared/normalizeExternalHref'\n\nexport interface ReceivedCardProps extends LinkAttachmentBaseProps {\n /**\n * Fired when the recipient activates the card. Behavior depends on how\n * the card is configured:\n * - **Link app with a CTA** (FAQ / Form): the CTA owns navigation;\n * `onClick` fires when the recipient taps the CTA itself, alongside\n * `cta.onClick` (use for analytics).\n * - **Link app with a URL** (Spotify / TikTok / generic link): the card\n * chrome is an `<a target=\"_blank\">` opening `url` — `onClick` fires\n * alongside the navigation (use for analytics).\n * - **Hero-image only card**: the card has no URL, so it renders as\n * a button. `onClick` is the consumer's hook for opening a preview.\n * - **Video / audio link previews**: the shell stays non-interactive\n * so the native media controls remain operable — `onClick` is\n * ignored in this configuration.\n */\n onClick?: () => void\n}\n\n/**\n * The card the recipient sees in chat for a link attachment. Matches the\n * Received column of the messaging design system in Figma.\n */\nconst ReceivedCard: React.FC<ReceivedCardProps> = ({\n title,\n description,\n url,\n mimeType,\n thumbnailUrl,\n sourceUrl,\n layout = 'featured',\n appIcon,\n cta,\n onClick,\n}) => {\n // Video / audio link previews wrap the native media element — render a\n // plain non-interactive shell and let the media controls own clicks so\n // taps on play/pause/scrubber don't fire the outer card action.\n const isPlayingMedia = isPlayableMedia(mimeType, sourceUrl)\n // Normalize the URL so a bare hostname like `tr.ee/briemix` (used in\n // our own docs / stories) is treated as an external link instead of a\n // relative path. Returns `undefined` for empty / whitespace-only\n // values, so those fall through to the preview path instead of\n // producing an empty `href` on the shell anchor.\n const normalizedUrl = normalizeExternalHref(url)\n const shellHref =\n cta == null && normalizedUrl != null && !isPlayingMedia\n ? normalizedUrl\n : undefined\n const shellOnClick = cta == null && !isPlayingMedia ? onClick : undefined\n const audioBg = isPlayableAudio(mimeType, sourceUrl)\n ? AUDIO_BG_CLASS\n : undefined\n\n // When a CTA is set the shell isn't interactive — the CTA owns the\n // click target. Forward the card-level `onClick` to the CTA so\n // analytics / side-effect consumers still fire on activation while\n // preserving the CTA's own `onClick` callback.\n const wrappedCta =\n cta && onClick\n ? {\n ...cta,\n onClick: () => {\n onClick()\n cta.onClick?.()\n },\n }\n : cta\n\n return (\n <CardShell\n variant=\"light\"\n href={shellHref}\n onClick={shellOnClick}\n ariaLabel={title ?? 'Open attachment preview'}\n bgClassName={audioBg}\n data-testid=\"link-attachment\"\n >\n {layout === 'featured' && (\n <CardThumbnail\n variant=\"light\"\n thumbnailUrl={thumbnailUrl}\n sourceUrl={sourceUrl}\n title={title}\n mimeType={mimeType}\n />\n )}\n <CardBody\n variant=\"light\"\n title={title}\n description={description}\n url={url}\n appIcon={appIcon}\n cta={wrappedCta}\n />\n </CardShell>\n )\n}\n\nexport default ReceivedCard\n","import React from 'react'\n\nimport type { LinkAttachmentBaseProps } from '../../types'\nimport CardBody from '../_shared/CardBody'\nimport CardShell from '../_shared/CardShell'\nimport CardThumbnail, {\n AUDIO_BG_CLASS,\n isPlayableAudio,\n} from '../_shared/CardThumbnail'\n\nexport interface SentCardProps extends LinkAttachmentBaseProps {}\n\n/**\n * The card the sender sees in chat after a link attachment has been posted.\n * Matches the Sent column of the messaging design system in Figma — same\n * dark chrome as the Composer card minus the dismiss / edit affordances.\n */\nconst SentCard: React.FC<SentCardProps> = ({\n title,\n placeholderTitle,\n description,\n url,\n mimeType,\n thumbnailUrl,\n sourceUrl,\n layout = 'featured',\n appIcon,\n cta,\n}) => (\n <CardShell\n variant=\"dark\"\n bgClassName={\n isPlayableAudio(mimeType, sourceUrl) ? AUDIO_BG_CLASS : undefined\n }\n >\n {layout === 'featured' && (\n <CardThumbnail\n variant=\"dark\"\n thumbnailUrl={thumbnailUrl}\n sourceUrl={sourceUrl}\n title={title}\n mimeType={mimeType}\n />\n )}\n <CardBody\n variant=\"dark\"\n title={title}\n placeholderTitle={placeholderTitle}\n description={description}\n url={url}\n appIcon={appIcon}\n cta={cta}\n />\n </CardShell>\n)\n\nexport default SentCard\n","import ComposerCard, {\n type ComposerCardProps,\n} from './components/Composer/Card'\nimport ReceivedCard, {\n type ReceivedCardProps,\n} from './components/Received/Card'\nimport SentCard, { type SentCardProps } from './components/Sent/Card'\n\n/**\n * Link previews (1P / 3P Link Apps) shown in the chat thread. Mirrors\n * the `LockedAttachment` API — render `LinkAttachment.Composer` while\n * drafting, `LinkAttachment.Sent` after posting, and\n * `LinkAttachment.Received` in the recipient's thread. Maps to the\n * \"LinkApps\" section of the messaging design system.\n *\n * Two visual layouts via the `layout` prop:\n * - **Featured** (default) — 180px hero thumbnail above the body. Used\n * by hero-image LinkApps (Spotify with cover art, TikTok with a\n * frame, etc.).\n * - **Classic** — compact card with no hero thumbnail; title /\n * description / URL / CTA only. Used for LinkApp embeds without\n * artwork (FAQ, Form) and any link preview that lacks OG imagery.\n *\n * For chat **document / image / video / audio attachments**, reach for\n * `MessageAttachment.{Image,Video,Audio,Pdf,File}` instead — those\n * render as bubbles with built-in viewers (zoom-capable image\n * lightbox, native PDF viewer, video / audio with download) and a\n * caption slot for accompanying text.\n */\nconst LinkAttachment = {\n Composer: ComposerCard,\n Sent: SentCard,\n Received: ReceivedCard,\n}\n\nexport default LinkAttachment\nexport type { ComposerCardProps, SentCardProps, ReceivedCardProps }\nexport type {\n LinkAttachmentBaseProps,\n LinkAttachmentCta,\n LinkAttachmentLayout,\n} from './types'\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport type { BubbleGroupPosition, BubbleVariant } from '../types'\n\nexport interface BubbleProps {\n variant: BubbleVariant\n /** Optional message text rendered below the attachment slot. */\n text?: React.ReactNode\n /**\n * Renders a hairline border around the bubble. Defaults to `true` —\n * matches the design system's \"small border around link / message\n * attachments\" treatment from the mobile spec.\n */\n bordered?: boolean\n /**\n * Position of this bubble inside a same-author message run. Drives\n * the corner-flattening that visually merges consecutive bubbles\n * (matches the grouping stream-chat-react applies to text bubbles).\n * Defaults to `'single'` so standalone usage keeps every corner\n * fully rounded.\n */\n groupPosition?: BubbleGroupPosition\n className?: string\n children: React.ReactNode\n 'data-testid'?: string\n}\n\n// Colors and metrics tracked from `stream-chat-react`'s default\n// `.str-chat__message-bubble` token set so attachments visually drop\n// into a normal `CustomMessage` thread without any seams:\n// - light → `--str-chat__secondary-surface-color` = grey200 (#e9eaed)\n// - dark → `.str-chat__message--me` override in `styles.css` (#121110)\n// - text padding → `--str-chat__spacing-2 --str-chat__spacing-4` = 8px 16px\n// - border-radius → `--str-chat__border-radius-md` = 18px\n//\n// TODO: migrate to Tailwind theme tokens once they exist for the\n// `linktree.dark` / `linktree.surface.secondary` palette — these hex\n// literals are repeated across LinkAttachment / LockedAttachment /\n// MediaMessage / CustomMessageInput / DownloadAction etc., so a\n// rebrand would need to touch every site. A central token would\n// collapse the migration to one definition.\nconst BUBBLE_BG_BY_VARIANT: Record<BubbleVariant, string> = {\n dark: 'bg-[#121110]',\n light: 'bg-[#e9eaed]',\n}\n\nconst BUBBLE_TEXT_BY_VARIANT: Record<BubbleVariant, string> = {\n dark: 'text-white',\n light: 'text-[#080707]',\n}\n\nconst BUBBLE_BORDER_BY_VARIANT: Record<BubbleVariant, string> = {\n dark: 'border-white/[0.08]',\n light: 'border-black/[0.08]',\n}\n\n/**\n * Per-corner rounding tables that mirror stream-chat-react's default\n * bubble grouping. Sender bubbles cluster against the right edge so\n * the right corners get flattened in a run; receiver bubbles cluster\n * against the left edge so the left corners get flattened.\n *\n * Rounded corners use `--str-chat__border-radius-md` (18px) and\n * flattened corners use `--str-chat__border-radius-sm` (4px) — same\n * tokens stream's stylesheet uses for `.str-chat__message-bubble`\n * inside a `--first` / `--group` / `--end` wrapper.\n */\ntype BubbleSide = 'sender' | 'receiver'\n\nconst sideForVariant = (variant: BubbleVariant): BubbleSide =>\n variant === 'dark' ? 'sender' : 'receiver'\n\nconst CORNER_CLASSES_BY_SIDE_AND_POSITION: Record<\n BubbleSide,\n Record<BubbleGroupPosition, string>\n> = {\n sender: {\n single:\n 'rounded-tl-[18px] rounded-tr-[18px] rounded-bl-[18px] rounded-br-[18px]',\n first:\n 'rounded-tl-[18px] rounded-tr-[18px] rounded-bl-[18px] rounded-br-[4px]',\n middle:\n 'rounded-tl-[18px] rounded-tr-[4px] rounded-bl-[18px] rounded-br-[4px]',\n end: 'rounded-tl-[18px] rounded-tr-[4px] rounded-bl-[18px] rounded-br-[18px]',\n },\n receiver: {\n single:\n 'rounded-tl-[18px] rounded-tr-[18px] rounded-bl-[18px] rounded-br-[18px]',\n first:\n 'rounded-tl-[18px] rounded-tr-[18px] rounded-bl-[4px] rounded-br-[18px]',\n middle:\n 'rounded-tl-[4px] rounded-tr-[18px] rounded-bl-[4px] rounded-br-[18px]',\n end: 'rounded-tl-[4px] rounded-tr-[18px] rounded-bl-[18px] rounded-br-[18px]',\n },\n}\n\n/**\n * Chat-bubble container shared by every `MessageAttachment.*` card.\n *\n * Holds the attachment slot (image / video / row) and an optional\n * `text` caption rendered below it — mirrors the mobile chat layout\n * where a sender can attach a caption alongside an attachment ('Here\n * is the file', 'Here is the image').\n *\n * Two visual variants:\n * - `dark` — sender-side (Composer / Sent), white text on `#121110`.\n * - `light` — recipient-side (Received), dark text on `#e9eaed`.\n *\n * Background colors, padding, border-radius, and inherited font come\n * from the stream-chat-react `.str-chat__message-bubble` token set so\n * attachments line up with the `CustomMessage` text bubbles in a real\n * conversation. Padding is uniform across every variant — text rows,\n * audio rows, document rows, and media bubbles all get the same\n * 8px / 16px inset, with media inside getting its own rounded corners.\n */\nconst Bubble: React.FC<BubbleProps> = ({\n variant,\n text,\n bordered = true,\n groupPosition = 'single',\n className,\n children,\n 'data-testid': dataTestId,\n}) => {\n const hasText = text != null && text !== ''\n const cornerClasses =\n CORNER_CLASSES_BY_SIDE_AND_POSITION[sideForVariant(variant)][groupPosition]\n\n return (\n <div\n data-testid={dataTestId}\n data-group-position={groupPosition}\n className={classNames(\n // 280px-wide bubble — matches the mobile chat attachment width\n // and keeps the document / image / audio bubbles visually\n // consistent inside the conversation timeline. The 8px / 16px\n // inset matches `--str-chat__spacing-2 --str-chat__spacing-4`\n // so attachments share the same hit / negative-space rhythm\n // as the surrounding `CustomMessage` text bubbles.\n 'relative w-[280px] overflow-hidden px-2 py-2',\n cornerClasses,\n BUBBLE_BG_BY_VARIANT[variant],\n BUBBLE_TEXT_BY_VARIANT[variant],\n bordered && 'border',\n bordered && BUBBLE_BORDER_BY_VARIANT[variant],\n className\n )}\n >\n {children}\n\n {hasText ? (\n <p\n className={classNames(\n // No `text-*` / `font-*` overrides here — caption inherits\n // the same font family + size as `.str-chat__message-text`\n // so it matches the surrounding `CustomMessage` bubbles.\n 'whitespace-pre-wrap break-words leading-snug',\n // Top gutter only — bubble's `py-2` already supplies the\n // bottom inset, and the children above already render\n // flush against their own bottom edge.\n 'pt-2',\n 'px-2'\n )}\n >\n {text}\n </p>\n ) : null}\n </div>\n )\n}\n\nexport default Bubble\n","import { XIcon } from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React from 'react'\n\nexport interface DismissButtonProps {\n onClick: () => void\n /**\n * `'overlay'` — translucent button sitting on top of media (image /\n * video corner). `'inline'` — opaque button placed in the row of a\n * compact attachment alongside other content.\n */\n variant?: 'overlay' | 'inline'\n ariaLabel?: string\n}\n\nconst DismissButton: React.FC<DismissButtonProps> = ({\n onClick,\n variant = 'overlay',\n ariaLabel = 'Dismiss attachment',\n}) => (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n aria-label={ariaLabel}\n className={classNames(\n 'flex size-6 items-center justify-center rounded-full text-white',\n variant === 'overlay'\n ? 'bg-[#121110]/85 backdrop-blur'\n : 'bg-white/15 hover:bg-white/25'\n )}\n >\n <XIcon className=\"size-3\" weight=\"bold\" />\n </button>\n)\n\nexport default DismissButton\n","import type React from 'react'\n\n/**\n * Three messaging states a `MessageAttachment.*` card can render in,\n * mirroring the LinkAttachment / LockedAttachment families.\n */\nexport type MessageAttachmentState = 'composer' | 'sent' | 'received'\n\n/**\n * Visual variant of the surrounding `Bubble` chrome. Sender-side bubbles\n * (`composer`, `sent`) get the dark treatment; recipient-side bubbles\n * (`received`) get the light treatment.\n */\nexport type BubbleVariant = 'dark' | 'light'\n\n/** Maps a state to the bubble chrome it should render with. */\nexport const bubbleVariantForState = (\n state: MessageAttachmentState\n): BubbleVariant => (state === 'received' ? 'light' : 'dark')\n\n/**\n * Position of a bubble inside a same-author run, mirroring the grouping\n * stream-chat-react applies to consecutive messages from the same user:\n *\n * - `'single'` — standalone message, every corner fully rounded.\n * - `'first'` — first in a 2+ message run; the corner facing the\n * next bubble in the run is flattened.\n * - `'middle'` — both the corner facing the previous bubble and the\n * corner facing the next bubble are flattened.\n * - `'end'` — last in a 2+ message run; the corner facing the\n * previous bubble is flattened (this is also the\n * bubble the avatar attaches to on the receiver side).\n *\n * \"Facing\" is determined by the bubble's side: sender-aligned bubbles\n * cluster against their right edge, receiver-aligned bubbles against\n * their left edge.\n */\nexport type BubbleGroupPosition = 'single' | 'first' | 'middle' | 'end'\n\n/**\n * Convenience adapter that derives the `BubbleGroupPosition` from the\n * three booleans `stream-chat-react` forwards into the `Message` HOC.\n * Drop-in for `useMessageContext()` consumers:\n *\n * ```tsx\n * const { firstOfGroup, endOfGroup, groupedByUser } = useMessageContext()\n * <MessageAttachment.Image.Sent\n * {...props}\n * groupPosition={bubbleGroupPositionFromStream({\n * firstOfGroup, endOfGroup, groupedByUser,\n * })}\n * />\n * ```\n */\nexport const bubbleGroupPositionFromStream = ({\n firstOfGroup,\n endOfGroup,\n groupedByUser,\n}: {\n firstOfGroup?: boolean\n endOfGroup?: boolean\n groupedByUser?: boolean\n}): BubbleGroupPosition => {\n if (!groupedByUser) return 'single'\n if (firstOfGroup && endOfGroup) return 'single'\n if (firstOfGroup) return 'first'\n if (endOfGroup) return 'end'\n return 'middle'\n}\n\n/** Loading hint forwarded to the underlying `<img>` element. */\nexport type ImageLoadingMode = 'lazy' | 'eager'\n\n/** Preload hint forwarded to the underlying `<video>` / `<audio>` element. */\nexport type MediaPreloadMode = 'none' | 'metadata' | 'auto'\n\n/** A single image inside an Image attachment (single or stacked). */\nexport interface ImageItem {\n src: string\n alt?: string\n /** Optional width/height hint — preserved aspect on cover-fit. */\n width?: number\n height?: number\n /**\n * Per-tile native lazy-load override. Defaults to the parent\n * attachment's `loading` value (which itself defaults to `'lazy'`).\n * Pass `'eager'` for above-the-fold hero tiles.\n */\n loading?: ImageLoadingMode\n}\n\n/** A single video inside a Video attachment (single or stacked). */\nexport interface VideoItem {\n src: string\n /** Poster / thumbnail rendered before playback starts. */\n poster?: string\n /** Optional MIME type (e.g. `video/mp4`). */\n mimeType?: string\n /**\n * Per-item override for the `<video preload>` hint. Defaults to the\n * parent attachment's `preload` value (which itself defaults to\n * `'none'` so the poster carries the visual weight and no video\n * bytes are fetched until playback).\n */\n preload?: MediaPreloadMode\n}\n\n/** A single PDF inside a Pdf attachment (single or stacked). */\nexport interface PdfItem {\n src: string\n /** Filename — drives the title + the meta line + the viewer toolbar. */\n filename?: string\n /** File size in bytes — formatted into the `EXT · SIZE` meta line. */\n fileSize?: number\n /** Override displayed title. Defaults to `filename`. */\n title?: string\n}\n\n/** A single audio file inside an Audio attachment (single or stacked). */\nexport interface AudioItem {\n src: string\n /** MIME type hint — typed onto the inline `<source>` element. */\n mimeType?: string\n /**\n * Filename — used as the download default name (consumed by the\n * native player's kebab menu).\n */\n filename?: string\n /**\n * Per-track override for the `<audio preload>` hint. Defaults to\n * the parent attachment's `preload` value, which itself defaults\n * to `'metadata'` for a single audio (so the native player can\n * surface duration immediately) and `'none'` for a stacked thread\n * (so a fan-out of metadata requests doesn't happen on first paint).\n */\n preload?: MediaPreloadMode\n}\n\n/** A single generic file inside a File attachment (single or stacked). */\nexport interface FileItem {\n src: string\n /** Filename — drives the title + the meta line + the download default name. */\n filename?: string\n /** File size in bytes — formatted into the `EXT · SIZE` meta line. */\n fileSize?: number\n /** MIME type — drives the type icon. Defaults to `application/octet-stream`. */\n mimeType?: string\n /** Override displayed title. Defaults to `filename`. */\n title?: string\n}\n\n/** Shared props every `MessageAttachment.*.{Composer|Sent|Received}` accepts. */\nexport interface MessageAttachmentBaseProps {\n /**\n * Optional text rendered below the attachment inside the same bubble.\n * Mirrors the chat behavior in the mobile screenshots — `'Here is the\n * file'`, `'Here is the image'`, etc.\n */\n text?: React.ReactNode\n /**\n * Position of this attachment inside a same-author message run —\n * mirrors the corner-flattening stream-chat-react applies to text\n * bubbles in a clustered conversation. Defaults to `'single'`, so\n * standalone usage keeps every corner rounded. Pass the value\n * derived from `bubbleGroupPositionFromStream({ firstOfGroup,\n * endOfGroup, groupedByUser })` when rendering inside a real\n * `CustomMessage` thread to make the attachment visually merge\n * with adjacent bubbles. Image / Video Composer ignore this — the\n * draft preview renders bare without the surrounding bubble.\n */\n groupPosition?: BubbleGroupPosition\n}\n\n/** Shared props for the `Composer` state of every attachment type. */\nexport interface ComposerExtras {\n /** Renders a dismiss `×` button overlaid on the attachment. */\n onDismiss?: () => void\n}\n","import React from 'react'\n\nimport Bubble from '../_shared/Bubble'\nimport DismissButton from '../_shared/DismissButton'\nimport {\n bubbleVariantForState,\n type AudioItem,\n type ComposerExtras,\n type MediaPreloadMode,\n type MessageAttachmentBaseProps,\n type MessageAttachmentState,\n} from '../types'\n\nexport interface AudioAttachmentSharedProps extends MessageAttachmentBaseProps {\n /** Audio source URL (`mp3`, `aac`, `wav`, …). */\n src?: string\n /** MIME type hint — typed onto the inline `<source>` element. */\n mimeType?: string\n /**\n * Filename — used as the download default name (consumed by the\n * native player's kebab menu). The HTML `<audio>` element doesn't\n * expose a built-in title slot, so we don't render the filename\n * inside the bubble itself.\n */\n filename?: string\n /**\n * Stacked audio. Takes precedence over `src` when set. Each item\n * renders its own native `<audio controls>` player, vertically\n * stacked inside the same bubble with an 8px gap between players.\n * Sent + Received only — the composer surface accepts a single\n * attachment at a time.\n */\n items?: AudioItem[]\n /**\n * `<audio preload>` hint applied to every player on the bubble.\n * When omitted, the default depends on the rendered shape:\n *\n * - Single audio (no `items`, or `items.length === 1`) →\n * `'metadata'` so the native player surfaces duration\n * immediately.\n * - Stacked audio (`items.length > 1`) → `'none'` so a thread\n * of voice memos doesn't fan out N parallel metadata requests\n * on first paint.\n *\n * Per-track overrides live on `AudioItem.preload`.\n */\n preload?: MediaPreloadMode\n}\n\nconst resolveItems = ({\n src,\n mimeType,\n filename,\n items,\n}: {\n src?: string\n mimeType?: string\n filename?: string\n items?: AudioItem[]\n}): AudioItem[] => {\n if (items && items.length > 0) return items\n if (src) return [{ src, mimeType, filename }]\n return []\n}\n\nconst NativeAudioPlayer: React.FC<{\n item: AudioItem\n preload: MediaPreloadMode\n trailingAction?: React.ReactNode\n}> = ({ item, preload, trailingAction }) => (\n <div className=\"flex items-center gap-2\">\n {/* No `<track>` is rendered — we don't author caption sidecars\n for chat attachments, and an empty `<track kind=\"captions\" />`\n emits a runtime warning. Re-add a real track (with `src`,\n `srcLang`, and `default`) once caption support actually ships.\n The `jsx-a11y/media-has-caption` rule is suppressed for the\n same reason. */}\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n <audio\n src={item.src}\n controls\n preload={item.preload ?? preload}\n className=\"block min-w-0 flex-1\"\n >\n {item.mimeType ? <source src={item.src} type={item.mimeType} /> : null}\n </audio>\n {trailingAction ?? null}\n </div>\n)\n\ninterface InternalAudioRowProps extends AudioAttachmentSharedProps {\n state: MessageAttachmentState\n onDismiss?: () => void\n}\n\nconst AudioAttachmentRow: React.FC<InternalAudioRowProps> = ({\n state,\n src,\n mimeType,\n filename,\n items,\n text,\n groupPosition,\n preload,\n onDismiss,\n}) => {\n const variant = bubbleVariantForState(state)\n const showDismiss = state === 'composer' && !!onDismiss\n const resolvedItems = resolveItems({ src, mimeType, filename, items })\n\n if (resolvedItems.length === 0) {\n return null\n }\n\n // Default rule: surface duration immediately for a single player,\n // but avoid fanning out N metadata requests when the bubble is a\n // thread of voice memos. An explicit `preload` prop overrides;\n // per-track overrides live on `AudioItem.preload`.\n const resolvedPreload: MediaPreloadMode =\n preload ?? (resolvedItems.length > 1 ? 'none' : 'metadata')\n\n return (\n <Bubble\n variant={variant}\n text={text}\n groupPosition={groupPosition}\n data-testid=\"audio-attachment\"\n >\n {/* Native `<audio controls>` already exposes a download in its\n kebab menu, so we don't render a separate Download button.\n The element also has no built-in title slot — the dismiss\n button (Composer only) sits inline next to the player.\n Stacked players get an 8px vertical gap so each track reads\n as a discrete attachment. */}\n <div className=\"flex flex-col gap-2\">\n {resolvedItems.map((item, index) => (\n <NativeAudioPlayer\n key={`${item.src}-${index}`}\n item={item}\n preload={resolvedPreload}\n trailingAction={\n // Composer only supports a single attachment, so the\n // dismiss control sits on the only player.\n showDismiss && index === 0 ? (\n <DismissButton onClick={onDismiss!} variant=\"inline\" />\n ) : undefined\n }\n />\n ))}\n </div>\n </Bubble>\n )\n}\n\n/**\n * Composer-only props. Single audio (`src`) only — the composer\n * surface accepts a single attachment at a time, so `items` is not\n * supported. Captions (`text`) and `groupPosition` are also dropped:\n * the composer renders a standalone draft, not part of a same-author\n * run, and captions live in the message-input textarea, not inside\n * the draft attachment preview.\n */\nexport interface AudioComposerProps extends ComposerExtras {\n src?: string\n mimeType?: string\n filename?: string\n /** See `AudioAttachmentSharedProps.preload`. */\n preload?: MediaPreloadMode\n}\nexport type AudioSentProps = AudioAttachmentSharedProps\nexport type AudioReceivedProps = AudioAttachmentSharedProps\n\nconst AudioComposer: React.FC<AudioComposerProps> = (props) => (\n <AudioAttachmentRow {...props} state=\"composer\" />\n)\nconst AudioSent: React.FC<AudioSentProps> = (props) => (\n <AudioAttachmentRow {...props} state=\"sent\" />\n)\nconst AudioReceived: React.FC<AudioReceivedProps> = (props) => (\n <AudioAttachmentRow {...props} state=\"received\" />\n)\n\nconst AudioAttachment = {\n Composer: AudioComposer,\n Sent: AudioSent,\n Received: AudioReceived,\n}\n\nexport default AudioAttachment\n","import {\n getDocumentIconType,\n getSourceType,\n} from '../../AttachmentCard/utils/mimeType'\n\n/**\n * Format a byte count as a short human-readable string (`'379.5 KB'`).\n * Mirrors the meta line shown next to file attachments in the mobile chat\n * design — `EXT · SIZE`, e.g. `PDF · 379.5 KB`.\n */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024)\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`\n}\n\nconst EXTENSION_LABEL_BY_DOCUMENT_TYPE: Record<string, string> = {\n pdf: 'PDF',\n doc: 'DOC',\n xls: 'XLS',\n csv: 'CSV',\n ppt: 'PPT',\n zip: 'ZIP',\n text: 'TXT',\n markdown: 'MD',\n}\n\n/**\n * Returns the short uppercase extension label shown in the meta line of\n * compact document / file attachments. Prefers the filename extension\n * when present (matches the mobile design which trusts the filename),\n * and falls back to a label derived from the MIME type.\n */\nexport function getFileExtensionLabel(\n mimeType?: string,\n filename?: string\n): string | undefined {\n if (filename) {\n const lastDot = filename.lastIndexOf('.')\n if (lastDot > 0 && lastDot < filename.length - 1) {\n const ext = filename.slice(lastDot + 1)\n if (ext && ext.length <= 5) return ext.toUpperCase()\n }\n }\n\n if (!mimeType) return undefined\n\n const sourceType = getSourceType(mimeType)\n if (sourceType === 'document') {\n const docType = getDocumentIconType(mimeType)\n const docLabel = EXTENSION_LABEL_BY_DOCUMENT_TYPE[docType]\n if (docLabel) return docLabel\n if (mimeType === 'application/octet-stream') return undefined\n }\n\n const subtype = mimeType.split('/')[1]\n if (!subtype || subtype === '*') return undefined\n return subtype.toUpperCase()\n}\n\n/**\n * Build the meta line shown under the title in compact document / file\n * attachments — `EXT · SIZE` (`PDF · 379.5 KB`). Either part is dropped\n * when not available so audio / generic files still get a useful label.\n */\nexport function buildCompactMetaLabel(\n mimeType?: string,\n filename?: string,\n fileSize?: number\n): string | undefined {\n const ext = getFileExtensionLabel(mimeType, filename)\n const size =\n typeof fileSize === 'number' && fileSize > 0\n ? formatFileSize(fileSize)\n : undefined\n return [ext, size].filter(Boolean).join(' · ') || undefined\n}\n\n/**\n * Derive a sensible filename from a URL — used as the fallback save name\n * when the attachment has no `filename` set. Returns `'download'` for\n * URLs we can't parse.\n */\nexport function filenameFromUrl(url: string): string {\n try {\n const parsed = new URL(url)\n const last = parsed.pathname.split('/').pop()\n return last && last.length > 0 ? decodeURIComponent(last) : 'download'\n } catch {\n return 'download'\n }\n}\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport { renderTypeIcon } from '../../AttachmentCard'\nimport type { BubbleVariant } from '../types'\n\nimport { buildCompactMetaLabel } from './fileMeta'\n\nexport interface CompactDocumentRowProps {\n variant: BubbleVariant\n /** Filename — drives the title (when no `title` set) and the `EXT` label. */\n filename?: string\n /** Override displayed title. Defaults to `filename`. */\n title?: string\n mimeType?: string\n fileSize?: number\n /**\n * When set, the icon + filename area becomes a `<button>` that fires\n * this handler. Lets the row's primary activation (e.g. opening the\n * PDF viewer) live separately from the trailing slot's own button\n * (e.g. a download icon) without nesting `<button>` inside `<button>`.\n * When omitted, the row renders as a plain presentational `<div>`\n * and the caller is responsible for any outer activation wrapper.\n */\n onActivate?: () => void\n /**\n * Required when `onActivate` is set. Visible to assistive tech as\n * the inner button's label (e.g. `'Open ESOP-summary.pdf'`).\n */\n activateLabel?: string\n /**\n * Optional trailing slot — sits outside the activation button so it\n * can host its own interactive controls (e.g. a download `<button>`,\n * the Composer's `DismissButton`) without nesting one button inside\n * another.\n */\n trailingAction?: React.ReactNode\n}\n\n// Meta line + icon tile are tinted relative to the bubble background,\n// so they stay variant-aware. The title inherits the bubble's text\n// color (set on the parent `Bubble`).\n//\n// `text-black/55` on the `#e9eaed` light bubble lands right at the\n// WCAG AA 4.5:1 small-text threshold (≈4.5:1) — bump to `/65` so\n// the meta line has a comfortable margin on the light bubble. The\n// dark variant (`text-white/55` on `#121110`) already passes AA at\n// ~6:1, so we leave it alone.\nconst META_CLASS_BY_VARIANT: Record<BubbleVariant, string> = {\n dark: 'text-white/55',\n light: 'text-black/65',\n}\n\nconst ICON_BG_BY_VARIANT: Record<BubbleVariant, string> = {\n dark: 'bg-white/10',\n light: 'bg-black/5',\n}\n\nconst ICON_COLOR_BY_VARIANT: Record<BubbleVariant, string> = {\n dark: 'text-white/85',\n light: 'text-black/85',\n}\n\n/**\n * Compact icon-row used by `Pdf` / `File` `MessageAttachment` variants.\n * Mirrors the mobile chat document attachment from\n * `EARN-8448/pr-2-chat-bubbles-and-file-icons` — a 40x40 typed icon\n * tile on the left, filename + `EXT · SIZE` meta on the right.\n *\n * The row is always wrapped by `Bubble`, which contributes the bubble\n * background, padding, border, and (when the parent wires it up) the\n * click target.\n */\nconst CompactDocumentRow: React.FC<CompactDocumentRowProps> = ({\n variant,\n filename,\n title,\n mimeType = 'application/octet-stream',\n fileSize,\n onActivate,\n activateLabel,\n trailingAction,\n}) => {\n const resolvedTitle = title ?? filename ?? 'File'\n const metaLabel = buildCompactMetaLabel(mimeType, filename, fileSize)\n\n const iconTile = (\n <div\n className={classNames(\n 'flex size-10 shrink-0 items-center justify-center rounded-sm',\n ICON_BG_BY_VARIANT[variant]\n )}\n aria-hidden\n >\n {renderTypeIcon(mimeType, {\n className: classNames('size-6', ICON_COLOR_BY_VARIANT[variant]),\n weight: 'regular',\n })}\n </div>\n )\n\n const textBlock = (\n <div className=\"flex min-w-0 flex-1 flex-col text-left\">\n <p className=\"truncate font-medium leading-snug\">{resolvedTitle}</p>\n {metaLabel ? (\n <p\n className={classNames(\n 'truncate text-xs leading-4',\n META_CLASS_BY_VARIANT[variant]\n )}\n >\n {metaLabel}\n </p>\n ) : null}\n </div>\n )\n\n // When the row is activatable, its body (icon + text) becomes the\n // click target — wrapping it in a `<button>` rather than wrapping\n // the entire row preserves the trailing slot for its own buttons\n // (download / dismiss) instead of nesting them inside one.\n const body = onActivate ? (\n <button\n type=\"button\"\n onClick={onActivate}\n aria-label={activateLabel}\n className={classNames(\n 'flex min-w-0 flex-1 items-center gap-3 rounded-sm text-left transition-colors',\n variant === 'dark'\n ? 'hover:bg-white/[0.04]'\n : 'hover:bg-black/[0.04]'\n )}\n >\n {iconTile}\n {textBlock}\n </button>\n ) : (\n <>\n {iconTile}\n {textBlock}\n </>\n )\n\n return (\n <div className=\"flex items-center gap-3 px-3 py-2\">\n {body}\n {trailingAction ? <div className=\"shrink-0\">{trailingAction}</div> : null}\n </div>\n )\n}\n\nexport default CompactDocumentRow\n","import { filenameFromUrl } from './fileMeta'\n\n/**\n * Download a remote asset with the desired filename.\n *\n * Tries the same-origin `fetch` → `Blob` → invisible-`<a>.download`\n * route first so the file lands on disk under `filename` instead of\n * navigating the tab to it. When CORS / network errors trip us up we\n * fall back to `window.open` and then to a no-window anchor — the\n * popup-blocker fallback ensures the download still fires even when\n * a browser blocks the `_blank` window.\n *\n * Shared by `DownloadAction` (rendered as an explicit Download button\n * in PDF / image / video viewers) and `MessageAttachment.File` rows\n * (where the entire row is the download trigger). Centralizing here\n * keeps one source of truth for the fallback chain.\n */\nexport async function triggerDownload(\n url: string,\n filename?: string\n): Promise<void> {\n const name = filename ?? filenameFromUrl(url)\n\n try {\n const res = await fetch(url, { mode: 'cors' })\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n const blob = await res.blob()\n const objectUrl = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = objectUrl\n a.download = name\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(objectUrl)\n } catch {\n const fallback = window.open(url, '_blank', 'noopener,noreferrer')\n if (!fallback) {\n // popup blocked — fall back to a non-windowed anchor\n const a = document.createElement('a')\n a.href = url\n a.download = name\n a.target = '_blank'\n a.rel = 'noopener noreferrer'\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n }\n }\n}\n\nexport default triggerDownload\n","import { DownloadSimpleIcon } from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React from 'react'\n\nimport Bubble from '../_shared/Bubble'\nimport CompactDocumentRow from '../_shared/CompactDocumentRow'\nimport DismissButton from '../_shared/DismissButton'\nimport { filenameFromUrl } from '../_shared/fileMeta'\nimport { triggerDownload } from '../_shared/triggerDownload'\nimport {\n bubbleVariantForState,\n type BubbleVariant,\n type ComposerExtras,\n type FileItem,\n type MessageAttachmentBaseProps,\n type MessageAttachmentState,\n} from '../types'\n\nexport interface FileAttachmentSharedProps extends MessageAttachmentBaseProps {\n /** Source URL of the file (used as the download target). */\n src?: string\n /** Filename — drives the title + the meta line + the download default name. */\n filename?: string\n fileSize?: number\n /** MIME type — drives the type icon. Defaults to `application/octet-stream`. */\n mimeType?: string\n /**\n * Override displayed title (defaults to `filename`). Useful when a\n * sender renames the attachment before sending.\n */\n title?: string\n /**\n * Stacked files. Takes precedence over `src` when set. Each item\n * renders as its own row inside the bubble; clicking a row downloads\n * that file. Sent + Received only — the composer surface accepts a\n * single attachment at a time.\n */\n items?: FileItem[]\n /**\n * Forwarded to the row trigger. When omitted the click still\n * downloads the file. Supply this for analytics, or return `false`\n * to fully intercept the download (e.g. show a confirmation modal,\n * route to a custom preview, throttle large files). Any other\n * return value — including `void`/`undefined` — lets the built-in\n * download proceed. For stacked attachments the `index` argument\n * identifies the row.\n */\n onClick?: (index: number) => boolean | void\n}\n\nconst resolveItems = ({\n src,\n filename,\n fileSize,\n mimeType,\n title,\n items,\n}: {\n src?: string\n filename?: string\n fileSize?: number\n mimeType?: string\n title?: string\n items?: FileItem[]\n}): FileItem[] => {\n if (items && items.length > 0) return items\n if (src) return [{ src, filename, fileSize, mimeType, title }]\n return []\n}\n\ninterface FileRowButtonProps {\n variant: BubbleVariant\n item: FileItem\n index: number\n onActivate: (index: number) => void\n trailingAction: React.ReactNode\n}\n\n/**\n * Single tappable file row — used both for the lone file case and\n * for each child of a stacked attachment. The icon + filename area\n * is the click target (downloads the asset); the trailing slot is\n * decorative on Sent / Received and hosts the dismiss control on\n * Composer.\n */\nconst FileRowButton: React.FC<FileRowButtonProps> = ({\n variant,\n item,\n index,\n onActivate,\n trailingAction,\n}) => {\n const resolvedFilename = item.filename ?? filenameFromUrl(item.src)\n return (\n <CompactDocumentRow\n variant={variant}\n filename={resolvedFilename}\n title={item.title}\n mimeType={item.mimeType ?? 'application/octet-stream'}\n fileSize={item.fileSize}\n onActivate={() => onActivate(index)}\n activateLabel={`Download ${resolvedFilename}`}\n trailingAction={trailingAction}\n />\n )\n}\n\ninterface InternalFileRowProps extends FileAttachmentSharedProps {\n state: MessageAttachmentState\n onDismiss?: () => void\n}\n\nconst FileAttachmentRow: React.FC<InternalFileRowProps> = ({\n state,\n src,\n filename,\n fileSize,\n mimeType,\n title,\n items,\n text,\n groupPosition,\n onClick,\n onDismiss,\n}) => {\n const variant = bubbleVariantForState(state)\n const showDismiss = state === 'composer' && !!onDismiss\n const resolvedItems = resolveItems({\n src,\n filename,\n fileSize,\n mimeType,\n title,\n items,\n })\n\n // `useCallback` would be pointless here — `resolvedItems` is rebuilt\n // every render, so memoizing on it produces a fresh function every\n // render anyway. Keep this as a plain function.\n const handleActivate = (index: number) => {\n // `onClick` returning `false` cancels the built-in download so\n // consumers can route the click to a confirmation modal, custom\n // preview, etc. Any other return value (including void) lets the\n // default download proceed.\n if (onClick?.(index) === false) return\n const item = resolvedItems[index]\n if (!item) return\n const resolvedFilename = item.filename ?? filenameFromUrl(item.src)\n void triggerDownload(item.src, resolvedFilename)\n }\n\n if (resolvedItems.length === 0) {\n return null\n }\n\n const downloadIcon = (\n <span\n className={classNames(\n 'flex size-8 items-center justify-center rounded-full',\n variant === 'dark' ? 'text-white/70' : 'text-black/70'\n )}\n aria-hidden\n >\n <DownloadSimpleIcon className=\"size-5\" weight=\"bold\" />\n </span>\n )\n\n return (\n <Bubble\n variant={variant}\n text={text}\n groupPosition={groupPosition}\n data-testid=\"file-attachment\"\n >\n {/* Stacked rows get a small vertical gap so each file reads as\n a discrete attachment rather than one merged blob. Single\n row falls through to a no-op `gap-0`. */}\n <div className=\"flex flex-col gap-2\">\n {resolvedItems.map((item, index) => {\n // Composer only supports a single attachment so the dismiss\n // control sits on the only row; otherwise every row gets\n // the trailing download icon hint.\n const trailingAction =\n showDismiss && index === 0 ? (\n <DismissButton onClick={onDismiss!} variant=\"inline\" />\n ) : (\n downloadIcon\n )\n return (\n <FileRowButton\n key={`${item.src}-${index}`}\n variant={variant}\n item={item}\n index={index}\n onActivate={handleActivate}\n trailingAction={trailingAction}\n />\n )\n })}\n </div>\n </Bubble>\n )\n}\n\n/**\n * Composer-only props. Single file (`src`) only — the composer surface\n * accepts a single attachment at a time, so `items` is not supported.\n * Captions (`text`) and `groupPosition` are also dropped: the composer\n * renders a standalone draft, not part of a same-author run, and\n * captions live in the message-input textarea, not inside the draft\n * attachment preview.\n */\nexport interface FileComposerProps extends ComposerExtras {\n src?: string\n filename?: string\n fileSize?: number\n mimeType?: string\n title?: string\n onClick?: (index: number) => boolean | void\n}\nexport type FileSentProps = FileAttachmentSharedProps\nexport type FileReceivedProps = FileAttachmentSharedProps\n\nconst FileComposer: React.FC<FileComposerProps> = (props) => (\n <FileAttachmentRow {...props} state=\"composer\" />\n)\nconst FileSent: React.FC<FileSentProps> = (props) => (\n <FileAttachmentRow {...props} state=\"sent\" />\n)\nconst FileReceived: React.FC<FileReceivedProps> = (props) => (\n <FileAttachmentRow {...props} state=\"received\" />\n)\n\nconst FileAttachment = {\n Composer: FileComposer,\n Sent: FileSent,\n Received: FileReceived,\n}\n\nexport default FileAttachment\n","import {\n CircleNotchIcon,\n DownloadSimpleIcon,\n IconProps,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useState } from 'react'\n\nimport { triggerDownload } from './triggerDownload'\n\nexport type DownloadActionVariant =\n /** Solid pill button used inside compact / file rows. */\n | 'pill'\n /** Round translucent overlay button used over media (image / video viewers). */\n | 'overlay'\n /** Flat icon button used in viewer toolbars. */\n | 'toolbar'\n /**\n * Compact round icon button sized for the trailing slot of a\n * `CompactDocumentRow` (PDF / File rows). Adopts the row's tone so\n * it sits inline next to the filename without competing with it.\n */\n | 'inline'\n\nexport interface DownloadActionProps {\n url: string\n filename?: string\n variant?: DownloadActionVariant\n /**\n * Override the visible label on `pill` variants. Defaults to\n * `'Download'`. Hidden on `overlay` / `toolbar` variants.\n */\n label?: string\n /** Hide the label, keeping just the icon. Defaults to `true` for non-pill variants. */\n iconOnly?: boolean\n /** Tone of the surface. Used by the `pill` variant. */\n tone?: 'dark' | 'light'\n /**\n * Triggered after the download starts so consumers can fire analytics\n * or close a viewer. Errors during download don't suppress the call.\n */\n onTriggered?: () => void\n}\n\nconst DownloadAction: React.FC<DownloadActionProps> = ({\n url,\n filename,\n variant = 'pill',\n label = 'Download',\n iconOnly,\n tone = 'dark',\n onTriggered,\n}) => {\n const [busy, setBusy] = useState(false)\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (busy) return\n setBusy(true)\n triggerDownload(url, filename)\n .catch(() => {\n /* swallowed — fallback path inside `triggerDownload` */\n })\n .finally(() => {\n setBusy(false)\n onTriggered?.()\n })\n },\n [busy, url, filename, onTriggered]\n )\n\n const showIconOnly = iconOnly ?? variant !== 'pill'\n\n const iconClass = classNames(\n variant === 'pill' ? 'size-4' : 'size-5',\n 'shrink-0'\n )\n const iconProps: IconProps = { className: iconClass, weight: 'bold' }\n\n if (variant === 'inline') {\n // Sized to match the existing trailing slot used by `DismissButton`\n // and the decorative download span in `FileAttachment`. Tone keys\n // off the surrounding `Bubble` variant so a sender (dark) bubble\n // gets a lighter icon and a receiver (light) bubble gets a darker\n // one — same approach `CompactDocumentRow` already uses for the\n // type icon.\n const inlineToneClasses: Record<'dark' | 'light', string> = {\n dark: 'text-white/70 hover:bg-white/[0.08] hover:text-white',\n light: 'text-black/70 hover:bg-black/[0.08] hover:text-black',\n }\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={busy}\n aria-label={label}\n className={classNames(\n 'flex size-8 shrink-0 items-center justify-center rounded-full transition-colors disabled:opacity-70',\n inlineToneClasses[tone]\n )}\n >\n {busy ? (\n <CircleNotchIcon\n className=\"size-4 animate-spin\"\n weight=\"bold\"\n aria-hidden\n />\n ) : (\n <DownloadSimpleIcon\n className=\"size-5 shrink-0\"\n weight=\"bold\"\n aria-hidden\n />\n )}\n </button>\n )\n }\n\n if (variant === 'pill') {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={busy}\n aria-label={showIconOnly ? label : undefined}\n className={classNames(\n 'mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full px-4 text-sm font-medium leading-none transition-colors disabled:opacity-70',\n tone === 'dark'\n ? 'bg-[#121110] text-white hover:bg-[#2a2928]'\n : 'bg-white text-[#121110] hover:bg-white/90'\n )}\n >\n {busy ? (\n <CircleNotchIcon\n className=\"size-4 animate-spin\"\n weight=\"bold\"\n aria-hidden\n />\n ) : (\n <DownloadSimpleIcon {...iconProps} aria-hidden />\n )}\n {showIconOnly ? null : label}\n </button>\n )\n }\n\n // overlay / toolbar — round translucent button with just the icon\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={busy}\n aria-label={label}\n className={classNames(\n 'flex size-10 shrink-0 items-center justify-center rounded-full text-white transition-colors disabled:opacity-70',\n variant === 'overlay'\n ? 'bg-black/55 backdrop-blur hover:bg-black/70'\n : 'bg-white/10 hover:bg-white/20'\n )}\n >\n {busy ? (\n <CircleNotchIcon\n className=\"size-5 animate-spin\"\n weight=\"bold\"\n aria-hidden\n />\n ) : (\n <DownloadSimpleIcon {...iconProps} aria-hidden />\n )}\n </button>\n )\n}\n\nexport default DownloadAction\n","import { XIcon } from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface ViewerShellProps {\n open: boolean\n onClose: () => void\n /** Toolbar title — usually the filename. */\n title?: string\n /** Buttons rendered to the right of the title in the toolbar. */\n actions?: React.ReactNode\n /** Extra classes for the content slot wrapper. */\n contentClassName?: string\n children: React.ReactNode\n 'data-testid'?: string\n}\n\n// Module-scoped counter coordinates the body-scroll lock across\n// concurrently mounted viewers. Without it, the inner viewer's\n// unmount cleanup would restore `overflow` while the outer viewer is\n// still up — the page would scroll behind the still-open dialog.\n//\n// We snapshot the original `overflow` on the *first* lock and restore\n// it on the *last* unlock. Anything in between is a no-op.\nlet activeLockCount = 0\nlet previousBodyOverflow: string | null = null\n\nconst lockBodyScroll = () => {\n if (typeof document === 'undefined') return\n if (activeLockCount === 0) {\n previousBodyOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n activeLockCount += 1\n}\n\nconst unlockBodyScroll = () => {\n if (typeof document === 'undefined') return\n if (activeLockCount === 0) return\n activeLockCount -= 1\n if (activeLockCount === 0) {\n document.body.style.overflow = previousBodyOverflow ?? ''\n previousBodyOverflow = null\n }\n}\n\n/**\n * Full-viewport modal portal shared by `ImageViewer`, `VideoViewer`,\n * and `PdfViewer`.\n *\n * Responsibilities:\n * - Locks body scroll while open (reference-counted so stacked\n * viewers don't tear each other's locks down).\n * - Closes on `Escape`.\n * - Moves focus into the dialog on mount (the close button by\n * default) and restores it to the previously-focused element on\n * unmount, so opening + closing a viewer via the keyboard returns\n * the user to where they were.\n * - Renders a thin top toolbar (title + actions + close) layered\n * over the content.\n */\nconst ViewerShell: React.FC<ViewerShellProps> = ({\n open,\n onClose,\n title,\n actions,\n contentClassName,\n children,\n 'data-testid': dataTestId,\n}) => {\n const dialogRef = useRef<HTMLDivElement | null>(null)\n const closeButtonRef = useRef<HTMLButtonElement | null>(null)\n\n useEffect(() => {\n if (!open) return undefined\n\n lockBodyScroll()\n\n // Remember what was focused before the viewer opened so we can\n // hand focus back on close. Cast through `Element` because\n // `activeElement` is typed as `Element | null` and we only call\n // `.focus()` when it's actually an `HTMLElement`.\n const previouslyFocused =\n typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null\n\n // Move focus into the dialog so keyboard users land inside the\n // modal. Prefer the close button (most common deliberate action);\n // fall back to the dialog itself when the button isn't rendered\n // yet for some reason.\n const focusTarget = closeButtonRef.current ?? dialogRef.current\n focusTarget?.focus()\n\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n onClose()\n }\n }\n window.addEventListener('keydown', handleKey)\n\n return () => {\n unlockBodyScroll()\n window.removeEventListener('keydown', handleKey)\n // Restore focus to whatever was focused before we mounted. If\n // that element is gone (e.g. removed from the DOM) we skip\n // silently — focusing a stale node would throw.\n if (previouslyFocused && document.body.contains(previouslyFocused)) {\n previouslyFocused.focus()\n }\n }\n }, [open, onClose])\n\n if (!open || typeof document === 'undefined') return null\n\n return createPortal(\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? 'Attachment viewer'}\n data-testid={dataTestId}\n tabIndex={-1}\n className=\"fixed inset-0 z-[1000] flex flex-col bg-black/90 outline-none\"\n >\n <div className=\"pointer-events-none absolute inset-x-0 top-0 z-10 flex items-center gap-3 bg-gradient-to-b from-black/70 to-transparent px-4 py-3 text-white\">\n <p className=\"pointer-events-auto min-w-0 flex-1 truncate text-sm font-medium\">\n {title}\n </p>\n <div className=\"pointer-events-auto flex shrink-0 items-center gap-2\">\n {actions}\n <button\n ref={closeButtonRef}\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close viewer\"\n className=\"flex size-10 items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20\"\n >\n <XIcon className=\"size-5\" weight=\"bold\" aria-hidden />\n </button>\n </div>\n </div>\n\n <div\n className={classNames(\n 'relative z-0 flex h-full w-full flex-1 items-center justify-center overflow-hidden',\n contentClassName\n )}\n >\n {children}\n </div>\n </div>,\n document.body\n )\n}\n\nexport default ViewerShell\n","import {\n CaretLeftIcon,\n CaretRightIcon,\n MagnifyingGlassMinusIcon,\n MagnifyingGlassPlusIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport DownloadAction from './DownloadAction'\nimport { filenameFromUrl } from './fileMeta'\nimport ViewerShell from './ViewerShell'\n\nexport interface ImageViewerItem {\n src: string\n alt?: string\n /**\n * Filename used by the download action. Falls back to the last\n * pathname segment of `src` when omitted.\n */\n filename?: string\n}\n\nexport interface ImageViewerProps {\n open: boolean\n items: ImageViewerItem[]\n /** Currently active item. Defaults to `0`. */\n initialIndex?: number\n onClose: () => void\n}\n\nconst MIN_SCALE = 1\nconst MAX_SCALE = 8\nconst ZOOM_STEP = 1.25\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\ninterface ViewportState {\n scale: number\n x: number\n y: number\n}\n\nconst RESET_STATE: ViewportState = { scale: 1, x: 0, y: 0 }\n\n/**\n * Native lightbox-style image viewer with mouse-wheel zoom, drag-to-pan,\n * double-click toggle (1× ↔ 2×), keyboard arrow navigation between\n * stacked items, and built-in download.\n *\n * Used by every `MessageAttachment.Image.*` variant — Composer / Sent /\n * Received all open this viewer when activated, so admins can preview\n * attachments before sending and recipients can preview after receipt.\n */\nconst ImageViewer: React.FC<ImageViewerProps> = ({\n open,\n items,\n initialIndex = 0,\n onClose,\n}) => {\n const safeIndex = clamp(initialIndex, 0, Math.max(items.length - 1, 0))\n const [index, setIndex] = useState(safeIndex)\n const [view, setView] = useState<ViewportState>(RESET_STATE)\n const [dragging, setDragging] = useState(false)\n const dragStart = useRef<{\n x: number\n y: number\n panX: number\n panY: number\n } | null>(null)\n const stageRef = useRef<HTMLDivElement | null>(null)\n\n // Reset zoom whenever the viewer opens or the active item changes.\n useEffect(() => {\n if (!open) return\n setIndex(clamp(initialIndex, 0, Math.max(items.length - 1, 0)))\n setView(RESET_STATE)\n }, [open, initialIndex, items.length])\n\n useEffect(() => {\n setView(RESET_STATE)\n }, [index])\n\n const goPrev = useCallback(() => {\n setIndex((i) => (i <= 0 ? items.length - 1 : i - 1))\n }, [items.length])\n\n const goNext = useCallback(() => {\n setIndex((i) => (i >= items.length - 1 ? 0 : i + 1))\n }, [items.length])\n\n // Arrow-key navigation between items in the stack.\n useEffect(() => {\n if (!open) return undefined\n const onKey = (e: KeyboardEvent) => {\n if (items.length <= 1) return\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n goNext()\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n goPrev()\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [open, items.length, goPrev, goNext])\n\n const zoomBy = useCallback((factor: number) => {\n setView((prev) => {\n const nextScale = clamp(prev.scale * factor, MIN_SCALE, MAX_SCALE)\n // Re-center when we hit 1× so the image is never offset off-screen.\n if (nextScale === MIN_SCALE) return RESET_STATE\n return { scale: nextScale, x: prev.x, y: prev.y }\n })\n }, [])\n\n // React's synthetic `onWheel` is registered as a passive listener\n // (since React 17), so `e.preventDefault()` is a no-op inside an\n // `onWheel` handler — the page scrolls behind the viewer regardless.\n // Attach the listener manually on the stage element with\n // `{ passive: false }` so we can actually stop the page scroll\n // while the user zooms.\n useEffect(() => {\n if (!open) return undefined\n const stage = stageRef.current\n if (!stage) return undefined\n\n const handleWheel = (e: WheelEvent) => {\n e.preventDefault()\n const factor = e.deltaY < 0 ? ZOOM_STEP : 1 / ZOOM_STEP\n zoomBy(factor)\n }\n\n stage.addEventListener('wheel', handleWheel, { passive: false })\n return () => stage.removeEventListener('wheel', handleWheel)\n }, [open, zoomBy])\n\n const handleDoubleClick = useCallback(() => {\n setView((prev) =>\n prev.scale > 1\n ? RESET_STATE\n : { scale: 2, x: prev.x, y: prev.y }\n )\n }, [])\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n // Only allow drag-pan once the user has zoomed in.\n if (view.scale <= 1) return\n e.preventDefault()\n setDragging(true)\n dragStart.current = {\n x: e.clientX,\n y: e.clientY,\n panX: view.x,\n panY: view.y,\n }\n },\n [view.scale, view.x, view.y]\n )\n\n useEffect(() => {\n if (!dragging) return undefined\n\n const onMove = (e: MouseEvent) => {\n const start = dragStart.current\n if (!start) return\n setView((prev) => ({\n scale: prev.scale,\n x: start.panX + (e.clientX - start.x),\n y: start.panY + (e.clientY - start.y),\n }))\n }\n const onUp = () => {\n dragStart.current = null\n setDragging(false)\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n }, [dragging])\n\n const item = items[index]\n const filename = useMemo(\n () =>\n item?.filename ?? (item ? filenameFromUrl(item.src) : 'image'),\n [item]\n )\n\n const cursorClass = useMemo(() => {\n if (view.scale <= 1) return 'cursor-zoom-in'\n return dragging ? 'cursor-grabbing' : 'cursor-grab'\n }, [view.scale, dragging])\n\n if (!item) return null\n\n const totalLabel = items.length > 1 ? ` (${index + 1} / ${items.length})` : ''\n\n return (\n <ViewerShell\n open={open}\n onClose={onClose}\n title={`${filename}${totalLabel}`}\n actions={\n <>\n <button\n type=\"button\"\n onClick={() => zoomBy(1 / ZOOM_STEP)}\n disabled={view.scale <= MIN_SCALE}\n aria-label=\"Zoom out\"\n className=\"flex size-10 items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20 disabled:opacity-40\"\n >\n <MagnifyingGlassMinusIcon\n className=\"size-5\"\n weight=\"bold\"\n aria-hidden\n />\n </button>\n <button\n type=\"button\"\n onClick={() => zoomBy(ZOOM_STEP)}\n disabled={view.scale >= MAX_SCALE}\n aria-label=\"Zoom in\"\n className=\"flex size-10 items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20 disabled:opacity-40\"\n >\n <MagnifyingGlassPlusIcon\n className=\"size-5\"\n weight=\"bold\"\n aria-hidden\n />\n </button>\n <DownloadAction\n url={item.src}\n filename={filename}\n variant=\"overlay\"\n label={`Download ${filename}`}\n />\n </>\n }\n data-testid=\"image-viewer\"\n >\n <div\n ref={stageRef}\n // The stage swallows wheel / double-click / drag gestures to\n // implement the zoom + pan controls. It's not a button (clicks\n // don't have a single discrete action), so suppress the\n // a11y/no-static-element-interactions rule here — the discrete\n // zoom / download actions live in the toolbar above. The wheel\n // listener is attached manually (non-passive) in the effect\n // above so `preventDefault()` actually stops page scroll.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n role=\"presentation\"\n onDoubleClick={handleDoubleClick}\n onMouseDown={handleMouseDown}\n className={classNames(\n 'relative flex h-full w-full select-none items-center justify-center overflow-hidden',\n cursorClass\n )}\n >\n <img\n src={item.src}\n alt={item.alt ?? filename}\n draggable={false}\n // Once the user has explicitly opened the viewer the active\n // image needs to appear immediately, so we eager-load it.\n // Adjacent / off-screen viewer images aren't rendered here\n // (we only mount `items[index]`), so the lazy default on\n // siblings is automatic.\n loading=\"eager\"\n decoding=\"async\"\n style={{\n transform: `translate3d(${view.x}px, ${view.y}px, 0) scale(${view.scale})`,\n transition: dragging ? 'none' : 'transform 120ms ease-out',\n }}\n className=\"max-h-full max-w-full object-contain\"\n />\n </div>\n\n {items.length > 1 ? (\n <>\n <button\n type=\"button\"\n onClick={goPrev}\n aria-label=\"Previous image\"\n className=\"absolute left-4 top-1/2 z-10 flex size-12 -translate-y-1/2 items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20\"\n >\n <CaretLeftIcon className=\"size-5\" weight=\"bold\" aria-hidden />\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n aria-label=\"Next image\"\n className=\"absolute right-4 top-1/2 z-10 flex size-12 -translate-y-1/2 items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20\"\n >\n <CaretRightIcon className=\"size-5\" weight=\"bold\" aria-hidden />\n </button>\n </>\n ) : null}\n </ViewerShell>\n )\n}\n\nexport default ImageViewer\n","import classNames from 'classnames'\nimport React from 'react'\n\nexport interface MediaStackTile {\n /** Renderable tile content (image / video / poster). */\n content: React.ReactNode\n /** Pure-tile aria label (e.g. `'Photo 1'`). Used by `Pressable` mode. */\n ariaLabel?: string\n}\n\nexport interface MediaStackGridProps {\n tiles: MediaStackTile[]\n /**\n * When set, every tile is wrapped in a `<button>` and forwards the\n * tile index to `onTileActivate`. Used by Image / Video so any tile\n * opens the lightbox / video viewer at the right index.\n */\n onTileActivate?: (index: number) => void\n /**\n * Maximum tiles to render before the last one collapses into an\n * \"+N more\" overflow indicator. Defaults to `4`.\n */\n maxVisible?: number\n className?: string\n}\n\nconst TILE_SHELL =\n 'relative block size-full overflow-hidden bg-black/5 outline-none focus-visible:ring-2 focus-visible:ring-white/80 focus-visible:ring-offset-2 focus-visible:ring-offset-black'\n\n/**\n * Adaptive grid used by stacked image / video attachments. Layouts:\n *\n * - 1 tile — full-bleed\n * - 2 tiles — equal-width side-by-side row\n * - 3 tiles — one large left tile + two stacked right tiles\n * - 4 tiles — 2×2 grid\n * - 5+ — 2×2 grid with the bottom-right tile showing \"+N more\"\n *\n * The grid is square-ish overall (1:1 for 1, 16:9 for 2, 4:3 for 3+) so\n * stacks fit comfortably inside the bubble width without dominating the\n * conversation.\n */\nconst MediaStackGrid: React.FC<MediaStackGridProps> = ({\n tiles,\n onTileActivate,\n maxVisible = 4,\n className,\n}) => {\n const total = tiles.length\n if (total === 0) return null\n\n const visible = tiles.slice(0, Math.min(total, maxVisible))\n const overflow = total - visible.length\n\n const renderTile = (tile: MediaStackTile, index: number, extra?: React.ReactNode) => {\n const sharedClass = classNames(TILE_SHELL, 'h-full w-full')\n if (onTileActivate) {\n return (\n <button\n type=\"button\"\n key={index}\n onClick={() => onTileActivate(index)}\n aria-label={tile.ariaLabel ?? `Open media ${index + 1}`}\n className={classNames(sharedClass, 'cursor-zoom-in')}\n >\n {tile.content}\n {extra}\n </button>\n )\n }\n return (\n <div key={index} className={sharedClass}>\n {tile.content}\n {extra}\n </div>\n )\n }\n\n if (visible.length === 1) {\n return (\n <div className={classNames('aspect-square w-full', className)}>\n {renderTile(visible[0], 0)}\n </div>\n )\n }\n\n if (visible.length === 2) {\n return (\n <div\n className={classNames(\n 'grid aspect-[16/9] w-full grid-cols-2 gap-0.5',\n className\n )}\n >\n {visible.map((tile, index) => renderTile(tile, index))}\n </div>\n )\n }\n\n if (visible.length === 3) {\n return (\n <div\n className={classNames(\n 'grid aspect-[4/3] w-full grid-cols-2 grid-rows-2 gap-0.5',\n className\n )}\n >\n <div className=\"row-span-2\">{renderTile(visible[0], 0)}</div>\n {renderTile(visible[1], 1)}\n {renderTile(visible[2], 2)}\n </div>\n )\n }\n\n // 4 tiles (or 4 visible with overflow on the last)\n return (\n <div\n className={classNames(\n 'grid aspect-[4/3] w-full grid-cols-2 grid-rows-2 gap-0.5',\n className\n )}\n >\n {visible.map((tile, index) => {\n const isLastWithOverflow = overflow > 0 && index === visible.length - 1\n return renderTile(\n tile,\n index,\n isLastWithOverflow ? (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/55 text-2xl font-semibold text-white\">\n +{overflow}\n </div>\n ) : null\n )\n })}\n </div>\n )\n}\n\nexport default MediaStackGrid\n","import { useCallback, useState } from 'react'\n\n/**\n * Optional click handler used by every viewer-backed attachment.\n *\n * Return `false` to cancel the default open behavior — useful for\n * route-based viewers or confirmation modals. Any other return value\n * (including `void`/`undefined`) lets the built-in viewer open as\n * normal. The `index` argument identifies the row in stacked\n * attachments and is `0` for the single-attachment shape.\n */\nexport type ViewerClickHandler = (index: number) => boolean | void\n\nexport interface UseViewerResult {\n viewerOpen: boolean\n viewerIndex: number\n /**\n * Open the viewer at the given index. Forwards to the caller's\n * `onClick` first so analytics + intercept logic can fire before\n * the viewer mounts; if `onClick` returns `false` the open is\n * skipped entirely.\n */\n handleActivate: (index: number) => void\n closeViewer: () => void\n}\n\n/**\n * Tiny piece of state shared by every `MessageAttachment` that opens\n * a fullscreen viewer (`Image`, `Video`, `Pdf`). Tracks the open flag\n * + the active index, and threads the caller's `onClick` callback\n * through `handleActivate` so consumers can intercept the open\n * (e.g. analytics) or cancel it (return `false` to swap in a\n * route-based viewer / confirmation modal).\n */\nexport const useViewer = (onClick?: ViewerClickHandler): UseViewerResult => {\n const [viewerOpen, setViewerOpen] = useState(false)\n const [viewerIndex, setViewerIndex] = useState(0)\n\n const handleActivate = useCallback(\n (index: number) => {\n if (onClick?.(index) === false) return\n setViewerIndex(index)\n setViewerOpen(true)\n },\n [onClick]\n )\n\n const closeViewer = useCallback(() => setViewerOpen(false), [])\n\n return { viewerOpen, viewerIndex, handleActivate, closeViewer }\n}\n\nexport default useViewer\n","import React from 'react'\n\nimport Bubble from '../_shared/Bubble'\nimport DismissButton from '../_shared/DismissButton'\nimport ImageViewer, {\n type ImageViewerItem,\n} from '../_shared/ImageViewer'\nimport MediaStackGrid, {\n type MediaStackTile,\n} from '../_shared/MediaStackGrid'\nimport { useViewer } from '../_shared/useViewer'\nimport {\n bubbleVariantForState,\n type ImageItem,\n type ImageLoadingMode,\n type MessageAttachmentBaseProps,\n type MessageAttachmentState,\n} from '../types'\n\nexport interface ImageAttachmentSharedProps extends MessageAttachmentBaseProps {\n /** Single image — convenience for the most common case. */\n src?: string\n alt?: string\n /** Filename surfaced in the viewer toolbar + download default name. */\n filename?: string\n /**\n * Stacked images. Takes precedence over `src` when set. Renders a\n * 1 / 2 / 3 / 4-tile grid (5+ collapse into a `+N` overflow tile).\n * Sent + Received only — the composer surface intentionally accepts\n * a single attachment at a time.\n */\n items?: ImageItem[]\n /**\n * Native lazy-load hint forwarded to every `<img>` rendered on the\n * bubble surface (Composer thumbnail, single + stacked tiles, and\n * the `+N` overflow tile). Defaults to `'lazy'` — chat surfaces\n * usually scroll a long history, and lazy loading prevents every\n * historical image from being fetched on mount. Set `'eager'` for\n * above-the-fold hero attachments. Per-tile overrides live on\n * `ImageItem.loading`. The opened `ImageViewer` always eager-loads\n * the active image regardless of this value.\n */\n loading?: ImageLoadingMode\n /**\n * Forwarded to the Image viewer trigger. When omitted the click\n * still opens the built-in viewer — supply this for analytics, or\n * return `false` to intercept the open (e.g. switch to a route-\n * based gallery / confirmation modal). Any other return value\n * (including `void`/`undefined`) lets the built-in viewer open.\n * For stacked attachments the `index` argument identifies the tile.\n */\n onClick?: (index: number) => boolean | void\n}\n\nconst tileFromItem = (\n item: ImageItem,\n index: number,\n totalCount: number,\n fallbackLoading: ImageLoadingMode\n): MediaStackTile => ({\n ariaLabel: `Open image ${index + 1} of ${totalCount}`,\n content: (\n <img\n src={item.src}\n alt={item.alt ?? ''}\n width={item.width}\n height={item.height}\n draggable={false}\n loading={item.loading ?? fallbackLoading}\n decoding=\"async\"\n className=\"absolute inset-0 size-full rounded-md object-cover\"\n />\n ),\n})\n\nconst resolveItems = ({\n src,\n alt,\n items,\n}: {\n src?: string\n alt?: string\n items?: ImageItem[]\n}): ImageItem[] => {\n if (items && items.length > 0) return items\n if (src) return [{ src, alt }]\n return []\n}\n\ninterface InternalImageRowProps extends ImageAttachmentSharedProps {\n state: MessageAttachmentState\n /**\n * Renders a dismiss button on each tile (Composer only). When the\n * stack has multiple tiles, the dismiss applies to the whole stack\n * — that mirrors the mobile composer where attachments are removed\n * as a single unit.\n */\n onDismiss?: () => void\n}\n\nconst buildViewerItems = (\n resolvedItems: ImageItem[],\n filename?: string\n): ImageViewerItem[] =>\n resolvedItems.map((item, index) => ({\n src: item.src,\n alt: item.alt,\n filename:\n filename && resolvedItems.length === 1\n ? filename\n : filename\n ? `${filename} (${index + 1})`\n : undefined,\n }))\n\n/**\n * Composer rendering — bare 280px-square image with a dismiss `×`\n * overlay and `rounded-md` corners. Intentionally renders without the\n * shared `Bubble` chrome (no border / no background / no padding) so\n * the in-progress attachment looks like a draft preview, not a sent\n * message. The composer surface only supports a single attachment at\n * a time — `items` and `text` are ignored here.\n */\nconst ImageComposerInner: React.FC<{\n src: string\n alt?: string\n filename?: string\n loading?: ImageLoadingMode\n onClick?: (index: number) => boolean | void\n onDismiss?: () => void\n}> = ({ src, alt, filename, loading = 'lazy', onClick, onDismiss }) => {\n const { viewerOpen, viewerIndex, handleActivate, closeViewer } = useViewer(\n onClick\n )\n\n return (\n <div className=\"relative w-fit\">\n <button\n type=\"button\"\n onClick={() => handleActivate(0)}\n aria-label=\"Open image\"\n className=\"block size-[280px] cursor-zoom-in overflow-hidden rounded-md outline-none focus-visible:ring-2 focus-visible:ring-black/40\"\n >\n <img\n src={src}\n alt={alt ?? ''}\n draggable={false}\n loading={loading}\n decoding=\"async\"\n className=\"size-full object-cover\"\n />\n </button>\n {onDismiss ? (\n <div className=\"absolute right-2 top-2 z-10\">\n <DismissButton onClick={onDismiss} />\n </div>\n ) : null}\n\n <ImageViewer\n open={viewerOpen}\n items={buildViewerItems([{ src, alt }], filename)}\n initialIndex={viewerIndex}\n onClose={closeViewer}\n />\n </div>\n )\n}\n\n/**\n * Sent / Received rendering — wrapped in the shared `Bubble` chrome,\n * supports single or stacked items, and renders an optional caption\n * below the media.\n */\nconst ImageBubbleRow: React.FC<InternalImageRowProps> = ({\n state,\n src,\n alt,\n filename,\n items,\n text,\n groupPosition,\n loading = 'lazy',\n onClick,\n}) => {\n const resolvedItems = resolveItems({ src, alt, items })\n const variant = bubbleVariantForState(state)\n const { viewerOpen, viewerIndex, handleActivate, closeViewer } = useViewer(\n onClick\n )\n\n if (resolvedItems.length === 0) {\n return null\n }\n\n const tiles: MediaStackTile[] = resolvedItems.map((item, index) =>\n tileFromItem(item, index, resolvedItems.length, loading)\n )\n\n return (\n <Bubble\n variant={variant}\n text={text}\n groupPosition={groupPosition}\n data-testid=\"image-attachment\"\n >\n <div className=\"relative\">\n <MediaStackGrid tiles={tiles} onTileActivate={handleActivate} />\n </div>\n\n <ImageViewer\n open={viewerOpen}\n items={buildViewerItems(resolvedItems, filename)}\n initialIndex={viewerIndex}\n onClose={closeViewer}\n />\n </Bubble>\n )\n}\n\n/**\n * Composer-only props. Single image (`src`) is required; stacked\n * `items` and `text` captions are not supported in the composer state.\n */\nexport interface ImageComposerProps {\n src: string\n alt?: string\n filename?: string\n /**\n * Native lazy-load hint forwarded to the composer thumbnail `<img>`.\n * Defaults to `'lazy'`. See `ImageAttachmentSharedProps.loading` for\n * the rationale.\n */\n loading?: ImageLoadingMode\n onClick?: (index: number) => boolean | void\n onDismiss?: () => void\n}\n\nexport type ImageSentProps = ImageAttachmentSharedProps\nexport type ImageReceivedProps = ImageAttachmentSharedProps\n\nconst ImageComposer: React.FC<ImageComposerProps> = (props) => (\n <ImageComposerInner {...props} />\n)\nconst ImageSent: React.FC<ImageSentProps> = (props) => (\n <ImageBubbleRow {...props} state=\"sent\" />\n)\nconst ImageReceived: React.FC<ImageReceivedProps> = (props) => (\n <ImageBubbleRow {...props} state=\"received\" />\n)\n\nconst ImageAttachment = {\n Composer: ImageComposer,\n Sent: ImageSent,\n Received: ImageReceived,\n}\n\nexport default ImageAttachment\n","import React, { useMemo } from 'react'\n\nimport DownloadAction from './DownloadAction'\nimport { filenameFromUrl } from './fileMeta'\nimport ViewerShell from './ViewerShell'\n\nexport interface PdfViewerProps {\n open: boolean\n /** Source URL of the PDF document. */\n src: string\n /** Filename used by the toolbar title and the download action. */\n filename?: string\n onClose: () => void\n}\n\n/**\n * Modal PDF viewer that hosts the document inside a sandboxed\n * `<iframe>`, leaving native PDF rendering, scroll, and zoom to the\n * browser. Adds a thin top toolbar with the filename + a download\n * action so users get the same `download / close` affordances as the\n * `ImageViewer` and the inline audio / video players.\n */\nconst PdfViewer: React.FC<PdfViewerProps> = ({\n open,\n src,\n filename,\n onClose,\n}) => {\n const resolvedFilename = useMemo(\n () => filename ?? filenameFromUrl(src),\n [filename, src]\n )\n\n // `#toolbar=0` is honored by Chromium-family browsers and hides the\n // built-in PDF toolbar so our own toolbar reads as the single source\n // of truth (otherwise the user sees two stacked toolbars). Firefox /\n // Safari ignore it and keep their native toolbars, which is fine —\n // the user gets a familiar experience either way.\n //\n // Preserve any existing fragment the caller supplied (e.g.\n // `#page=3`) by merging our params into it rather than naively\n // appending a second `#…` segment.\n const iframeSrc = useMemo(() => withPdfViewerParams(src), [src])\n\n return (\n <ViewerShell\n open={open}\n onClose={onClose}\n title={resolvedFilename}\n actions={\n <DownloadAction\n url={src}\n filename={resolvedFilename}\n variant=\"overlay\"\n label={`Download ${resolvedFilename}`}\n />\n }\n contentClassName=\"bg-[#1f1e1d]\"\n data-testid=\"pdf-viewer\"\n >\n <iframe\n src={iframeSrc}\n title={resolvedFilename}\n className=\"absolute inset-0 size-full bg-white\"\n // Sandbox the iframe to stop the embedded document from\n // reaching parent context. We intentionally omit\n // `allow-same-origin`: even when the PDF host happens to share\n // our origin, granting it defeats the rest of the sandbox.\n // `allow-scripts` keeps the native PDF viewer's interactive\n // affordances (search, page nav, form filling) working,\n // `allow-downloads` lets the user save via the built-in\n // toolbar where it's still visible (Firefox / Safari), and\n // `allow-popups` lets external links inside the PDF open in a\n // new tab.\n sandbox=\"allow-scripts allow-forms allow-popups allow-downloads\"\n />\n </ViewerShell>\n )\n}\n\n/**\n * Merge our PDF-viewer params (`toolbar=0`, `navpanes=0`) into the\n * URL's existing fragment so callers can still pass things like\n * `#page=3` without us clobbering them — naively appending\n * `#toolbar=0` to a URL that already has a fragment produces\n * `…#page=3#toolbar=0` which most readers ignore.\n */\nconst withPdfViewerParams = (src: string): string => {\n const hashIndex = src.indexOf('#')\n const base = hashIndex === -1 ? src : src.slice(0, hashIndex)\n const existing = hashIndex === -1 ? '' : src.slice(hashIndex + 1)\n\n const params = new URLSearchParams(existing)\n if (!params.has('toolbar')) params.set('toolbar', '0')\n if (!params.has('navpanes')) params.set('navpanes', '0')\n\n return `${base}#${params.toString()}`\n}\n\nexport default PdfViewer\n","import React from 'react'\n\nimport Bubble from '../_shared/Bubble'\nimport CompactDocumentRow from '../_shared/CompactDocumentRow'\nimport DismissButton from '../_shared/DismissButton'\nimport DownloadAction from '../_shared/DownloadAction'\nimport { filenameFromUrl } from '../_shared/fileMeta'\nimport PdfViewer from '../_shared/PdfViewer'\nimport { useViewer } from '../_shared/useViewer'\nimport {\n bubbleVariantForState,\n type BubbleVariant,\n type ComposerExtras,\n type MessageAttachmentBaseProps,\n type MessageAttachmentState,\n type PdfItem,\n} from '../types'\n\nexport interface PdfAttachmentSharedProps extends MessageAttachmentBaseProps {\n /** Single PDF — convenience for the most common case. */\n src?: string\n /** Filename — drives the title + the meta line + the viewer toolbar. */\n filename?: string\n /** File size in bytes — formatted into the `EXT · SIZE` meta line. */\n fileSize?: number\n /**\n * Override displayed title (defaults to `filename`). Useful when a\n * sender re-titles a generated PDF before sending.\n */\n title?: string\n /**\n * Stacked PDFs. Takes precedence over `src` when set. Each item\n * renders as its own row inside the bubble; clicking a row opens\n * that PDF in the viewer. Sent + Received only — the composer\n * surface accepts a single attachment at a time.\n */\n items?: PdfItem[]\n /**\n * Forwarded to the viewer trigger. When omitted the click still\n * opens the built-in `PdfViewer`. Supply this to fire analytics, or\n * return `false` to intercept the open (e.g. swap to a route-based\n * viewer / confirmation modal). Any other return value (including\n * `void`/`undefined`) lets the built-in viewer open. For stacked\n * attachments the `index` argument identifies the row.\n */\n onClick?: (index: number) => boolean | void\n}\n\nconst resolveItems = ({\n src,\n filename,\n fileSize,\n title,\n items,\n}: {\n src?: string\n filename?: string\n fileSize?: number\n title?: string\n items?: PdfItem[]\n}): PdfItem[] => {\n if (items && items.length > 0) return items\n if (src) return [{ src, filename, fileSize, title }]\n return []\n}\n\ninterface PdfRowButtonProps {\n variant: BubbleVariant\n item: PdfItem\n index: number\n onActivate: (index: number) => void\n trailingAction?: React.ReactNode\n}\n\n/**\n * Single tappable PDF row — used both for the lone PDF case and for\n * each child of a stacked attachment. The icon + filename area opens\n * the viewer; the trailing slot hosts a separate, sibling button\n * (download or dismiss) so each affordance owns its own click target.\n */\nconst PdfRowButton: React.FC<PdfRowButtonProps> = ({\n variant,\n item,\n index,\n onActivate,\n trailingAction,\n}) => {\n const resolvedFilename = item.filename ?? filenameFromUrl(item.src)\n return (\n <CompactDocumentRow\n variant={variant}\n filename={resolvedFilename}\n title={item.title}\n mimeType=\"application/pdf\"\n fileSize={item.fileSize}\n onActivate={() => onActivate(index)}\n activateLabel={`Open ${resolvedFilename}`}\n trailingAction={trailingAction}\n />\n )\n}\n\ninterface InternalPdfRowProps extends PdfAttachmentSharedProps {\n state: MessageAttachmentState\n onDismiss?: () => void\n}\n\nconst PdfAttachmentRow: React.FC<InternalPdfRowProps> = ({\n state,\n src,\n filename,\n fileSize,\n title,\n items,\n text,\n groupPosition,\n onClick,\n onDismiss,\n}) => {\n const variant = bubbleVariantForState(state)\n const resolvedItems = resolveItems({ src, filename, fileSize, title, items })\n const { viewerOpen, viewerIndex, handleActivate, closeViewer } = useViewer(\n onClick\n )\n const showDismiss = state === 'composer' && !!onDismiss\n\n if (resolvedItems.length === 0) {\n return null\n }\n\n // Clamp the viewer index defensively: if `items` shrinks between\n // the open click and the next render (server push, optimistic\n // update, etc.) `viewerIndex` may point past the new array.\n // Dereferencing `undefined` would crash the whole bubble, so fall\n // back to the last available row instead.\n const safeIndex = Math.min(viewerIndex, resolvedItems.length - 1)\n const activeItem = resolvedItems[safeIndex]\n const activeFilename =\n activeItem.filename ?? filenameFromUrl(activeItem.src)\n\n return (\n <Bubble\n variant={variant}\n text={text}\n groupPosition={groupPosition}\n data-testid=\"pdf-attachment\"\n >\n {/* Stacked rows get a small vertical gap so each PDF reads as\n a discrete attachment rather than one merged blob. Single\n row falls through to a no-op `gap-0`. */}\n <div className=\"flex flex-col gap-2\">\n {resolvedItems.map((item, index) => {\n const itemFilename = item.filename ?? filenameFromUrl(item.src)\n // Composer only supports a single attachment so the dismiss\n // control sits on the only row. Sent / Received rows expose\n // a download icon button so the user can grab the PDF\n // without opening the viewer first (the viewer also has a\n // download in its toolbar — this is the quick-grab shortcut).\n const trailingAction =\n showDismiss && index === 0 ? (\n <DismissButton onClick={onDismiss!} variant=\"inline\" />\n ) : state === 'composer' ? undefined : (\n <DownloadAction\n url={item.src}\n filename={itemFilename}\n variant=\"inline\"\n label={`Download ${itemFilename}`}\n tone={variant}\n />\n )\n return (\n <PdfRowButton\n key={`${item.src}-${index}`}\n variant={variant}\n item={item}\n index={index}\n onActivate={handleActivate}\n trailingAction={trailingAction}\n />\n )\n })}\n </div>\n\n <PdfViewer\n open={viewerOpen}\n src={activeItem.src}\n filename={activeFilename}\n onClose={closeViewer}\n />\n </Bubble>\n )\n}\n\n/**\n * Composer-only props. Single PDF (`src`) only — the composer surface\n * accepts a single attachment at a time, so `items` is not supported.\n * Captions (`text`) and `groupPosition` are also dropped: the composer\n * renders a standalone draft, not part of a same-author run, and\n * captions live in the message-input textarea, not inside the draft\n * attachment preview.\n */\nexport interface PdfComposerProps extends ComposerExtras {\n src?: string\n filename?: string\n fileSize?: number\n title?: string\n onClick?: (index: number) => boolean | void\n}\nexport type PdfSentProps = PdfAttachmentSharedProps\nexport type PdfReceivedProps = PdfAttachmentSharedProps\n\nconst PdfComposer: React.FC<PdfComposerProps> = (props) => (\n <PdfAttachmentRow {...props} state=\"composer\" />\n)\nconst PdfSent: React.FC<PdfSentProps> = (props) => (\n <PdfAttachmentRow {...props} state=\"sent\" />\n)\nconst PdfReceived: React.FC<PdfReceivedProps> = (props) => (\n <PdfAttachmentRow {...props} state=\"received\" />\n)\n\nconst PdfAttachment = {\n Composer: PdfComposer,\n Sent: PdfSent,\n Received: PdfReceived,\n}\n\nexport default PdfAttachment\n","import {\n CaretLeftIcon,\n CaretRightIcon,\n} from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport type { MediaPreloadMode } from '../types'\n\nimport DownloadAction from './DownloadAction'\nimport { filenameFromUrl } from './fileMeta'\nimport ViewerShell from './ViewerShell'\n\nexport interface VideoViewerItem {\n src: string\n poster?: string\n mimeType?: string\n filename?: string\n /**\n * Per-item `<video preload>` override. Defaults to `'metadata'`\n * for the active item so duration / first-frame are available\n * immediately. Non-active siblings aren't mounted here (we render\n * only `items[index]` at a time via a `key` swap), so they\n * naturally stay unloaded.\n */\n preload?: MediaPreloadMode\n}\n\nexport interface VideoViewerProps {\n open: boolean\n items: VideoViewerItem[]\n initialIndex?: number\n onClose: () => void\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\n/**\n * Full-viewport video viewer used by every `MessageAttachment.Video.*`\n * variant. Renders a single `<video controls>` element with the\n * browser's native play / pause / seek / fullscreen / volume chrome,\n * plus a download action in the toolbar and arrow-key navigation\n * between stacked items.\n */\nconst VideoViewer: React.FC<VideoViewerProps> = ({\n open,\n items,\n initialIndex = 0,\n onClose,\n}) => {\n const safeIndex = clamp(initialIndex, 0, Math.max(items.length - 1, 0))\n const [index, setIndex] = useState(safeIndex)\n\n useEffect(() => {\n if (!open) return\n setIndex(clamp(initialIndex, 0, Math.max(items.length - 1, 0)))\n }, [open, initialIndex, items.length])\n\n const goPrev = useCallback(\n () => setIndex((i) => (i <= 0 ? items.length - 1 : i - 1)),\n [items.length]\n )\n const goNext = useCallback(\n () => setIndex((i) => (i >= items.length - 1 ? 0 : i + 1)),\n [items.length]\n )\n\n useEffect(() => {\n if (!open || items.length <= 1) return undefined\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n goNext()\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n goPrev()\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [open, items.length, goPrev, goNext])\n\n const item = items[index]\n const filename = useMemo(\n () => item?.filename ?? (item ? filenameFromUrl(item.src) : 'video'),\n [item]\n )\n\n if (!item) return null\n\n const totalLabel = items.length > 1 ? ` (${index + 1} / ${items.length})` : ''\n\n return (\n <ViewerShell\n open={open}\n onClose={onClose}\n title={`${filename}${totalLabel}`}\n actions={\n <DownloadAction\n url={item.src}\n filename={filename}\n variant=\"overlay\"\n label={`Download ${filename}`}\n />\n }\n data-testid=\"video-viewer\"\n >\n <div className=\"flex h-full w-full items-center justify-center px-6 py-16\">\n {/* No `<track>` is rendered — we don't author caption sidecars\n for chat attachments, and an empty `<track kind=\"captions\" />`\n emits a runtime warning. Re-add a real track (with `src`,\n `srcLang`, and `default`) once caption support ships. The\n `jsx-a11y/media-has-caption` rule is suppressed for the\n same reason. */}\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n <video\n // Forcing a key swap on item change ensures the new source\n // mounts a fresh element instead of reusing the previous\n // playback state — keeps the video paused-at-start when\n // navigating between stacked items.\n key={`${index}:${item.src}`}\n src={item.src}\n poster={item.poster}\n controls\n // `autoPlay` without `muted` is blocked by Chrome / Safari /\n // Firefox autoplay policies — the click that opens the viewer\n // doesn't count as a user-gesture for the new `<video>`\n // element after the `key` remount. Defaulting to muted means\n // playback actually starts (matches how IG / Slack handle\n // video lightboxes); the user can unmute via the native\n // controls if they want sound.\n autoPlay\n muted\n playsInline\n // The active video defaults to `'metadata'` so duration /\n // first-frame appear immediately. Honor an explicit per-item\n // override (e.g. `'auto'` for a hero clip the caller wants\n // pre-warmed). Non-active siblings aren't mounted at all\n // because the `key` above swaps the element on navigation.\n preload={item.preload ?? 'metadata'}\n className=\"max-h-full max-w-full bg-black\"\n >\n {item.mimeType ? <source src={item.src} type={item.mimeType} /> : null}\n </video>\n </div>\n\n {items.length > 1 ? (\n <>\n <button\n type=\"button\"\n onClick={goPrev}\n aria-label=\"Previous video\"\n className=\"absolute left-4 top-1/2 z-10 flex size-12 -translate-y-1/2 items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20\"\n >\n <CaretLeftIcon className=\"size-5\" weight=\"bold\" aria-hidden />\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n aria-label=\"Next video\"\n className=\"absolute right-4 top-1/2 z-10 flex size-12 -translate-y-1/2 items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20\"\n >\n <CaretRightIcon className=\"size-5\" weight=\"bold\" aria-hidden />\n </button>\n </>\n ) : null}\n </ViewerShell>\n )\n}\n\nexport default VideoViewer\n","import { PlayIcon, VideoCameraIcon } from '@phosphor-icons/react'\nimport React from 'react'\n\nimport Bubble from '../_shared/Bubble'\nimport DismissButton from '../_shared/DismissButton'\nimport MediaStackGrid, {\n type MediaStackTile,\n} from '../_shared/MediaStackGrid'\nimport { useViewer } from '../_shared/useViewer'\nimport VideoViewer, { type VideoViewerItem } from '../_shared/VideoViewer'\nimport {\n bubbleVariantForState,\n type MediaPreloadMode,\n type MessageAttachmentBaseProps,\n type MessageAttachmentState,\n type VideoItem,\n} from '../types'\n\nexport interface VideoAttachmentSharedProps extends MessageAttachmentBaseProps {\n /** Single video — convenience for the most common case. */\n src?: string\n /** Poster image — preview shown before playback starts. */\n poster?: string\n /** MIME type hint — typed onto the inline `<source>` element. */\n mimeType?: string\n /** Filename surfaced in the viewer toolbar + download default name. */\n filename?: string\n /**\n * Stacked videos. Takes precedence over `src` when set. Renders a\n * 1 / 2 / 3 / 4-tile grid (5+ collapse into a `+N` overflow tile).\n * Sent + Received only — the composer surface intentionally accepts\n * a single attachment at a time.\n */\n items?: VideoItem[]\n /**\n * `<video preload>` hint forwarded into the viewer. Defaults to\n * `'none'` — the poster `<img>` carries the visual weight on the\n * bubble surface, and we shouldn't fetch any video bytes until the\n * user actually opens the viewer. Per-item overrides live on\n * `VideoItem.preload`. The opened `VideoViewer` always preloads\n * metadata for the active item (so duration / first-frame appear\n * immediately) regardless of this value.\n */\n preload?: MediaPreloadMode\n /**\n * Forwarded to the viewer trigger. When omitted the click still\n * opens the built-in `VideoViewer` — supply this for analytics, or\n * return `false` to intercept the open (e.g. switch to a route-\n * based player / confirmation modal). Any other return value\n * (including `void`/`undefined`) lets the built-in viewer open.\n * For stacked attachments the `index` argument identifies the tile.\n */\n onClick?: (index: number) => boolean | void\n}\n\nconst PlayBadge: React.FC = () => (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <span className=\"flex size-12 items-center justify-center rounded-full bg-black/55 text-white backdrop-blur\">\n <PlayIcon className=\"size-6\" weight=\"fill\" aria-hidden />\n </span>\n </div>\n)\n\nconst PosterTile: React.FC<{ item: VideoItem; index: number }> = ({\n item,\n index,\n}) => (\n <div className=\"absolute inset-0 size-full bg-[#0d0d0d]\">\n {item.poster ? (\n <img\n src={item.poster}\n alt={`Video ${index + 1} thumbnail`}\n draggable={false}\n loading=\"lazy\"\n decoding=\"async\"\n className=\"absolute inset-0 size-full rounded-md object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <VideoCameraIcon\n className=\"size-16 rounded-md text-white/30\"\n weight=\"regular\"\n aria-hidden\n />\n </div>\n )}\n <PlayBadge />\n </div>\n)\n\nconst tileFromItem = (\n item: VideoItem,\n index: number,\n totalCount: number\n): MediaStackTile => ({\n ariaLabel: `Play video ${index + 1} of ${totalCount}`,\n content: <PosterTile item={item} index={index} />,\n})\n\nconst resolveItems = ({\n src,\n poster,\n mimeType,\n preload,\n items,\n}: {\n src?: string\n poster?: string\n mimeType?: string\n preload?: MediaPreloadMode\n items?: VideoItem[]\n}): VideoItem[] => {\n if (items && items.length > 0) {\n return preload ? items.map((it) => ({ ...it, preload: it.preload ?? preload })) : items\n }\n if (src) return [{ src, poster, mimeType, preload }]\n return []\n}\n\ninterface InternalVideoRowProps extends VideoAttachmentSharedProps {\n state: MessageAttachmentState\n}\n\nconst buildViewerItems = (\n resolvedItems: VideoItem[],\n filename?: string\n): VideoViewerItem[] =>\n resolvedItems.map((item, index) => ({\n src: item.src,\n poster: item.poster,\n mimeType: item.mimeType,\n preload: item.preload,\n filename:\n filename && resolvedItems.length === 1\n ? filename\n : filename\n ? `${filename} (${index + 1})`\n : undefined,\n }))\n\n/**\n * Composer rendering — bare 280px-square poster with a play badge,\n * a dismiss `×` overlay, and `rounded-md` corners. Renders without the\n * shared `Bubble` chrome (no border / no background / no padding) so\n * the in-progress attachment looks like a draft preview rather than a\n * sent message. Single attachment only — `items` and `text` are not\n * supported on the composer surface.\n */\nconst VideoComposerInner: React.FC<{\n src: string\n poster?: string\n mimeType?: string\n filename?: string\n preload?: MediaPreloadMode\n onClick?: (index: number) => boolean | void\n onDismiss?: () => void\n}> = ({ src, poster, mimeType, filename, preload, onClick, onDismiss }) => {\n const { viewerOpen, viewerIndex, handleActivate, closeViewer } = useViewer(\n onClick\n )\n\n return (\n <div className=\"relative w-fit\">\n <button\n type=\"button\"\n onClick={() => handleActivate(0)}\n aria-label=\"Play video\"\n className=\"relative block size-[280px] cursor-pointer overflow-hidden rounded-md outline-none focus-visible:ring-2 focus-visible:ring-black/40\"\n >\n <PosterTile item={{ src, poster, mimeType }} index={0} />\n </button>\n {onDismiss ? (\n <div className=\"absolute right-2 top-2 z-10\">\n <DismissButton onClick={onDismiss} />\n </div>\n ) : null}\n\n <VideoViewer\n open={viewerOpen}\n items={buildViewerItems([{ src, poster, mimeType, preload }], filename)}\n initialIndex={viewerIndex}\n onClose={closeViewer}\n />\n </div>\n )\n}\n\n/**\n * Sent / Received rendering — wrapped in the shared `Bubble` chrome,\n * supports single or stacked items, and renders an optional caption\n * below the media.\n */\nconst VideoBubbleRow: React.FC<InternalVideoRowProps> = ({\n state,\n src,\n poster,\n mimeType,\n filename,\n items,\n text,\n groupPosition,\n preload,\n onClick,\n}) => {\n const resolvedItems = resolveItems({ src, poster, mimeType, preload, items })\n const variant = bubbleVariantForState(state)\n const { viewerOpen, viewerIndex, handleActivate, closeViewer } = useViewer(\n onClick\n )\n\n if (resolvedItems.length === 0) {\n return null\n }\n\n const tiles: MediaStackTile[] = resolvedItems.map((item, index) =>\n tileFromItem(item, index, resolvedItems.length)\n )\n\n return (\n <Bubble\n variant={variant}\n text={text}\n groupPosition={groupPosition}\n data-testid=\"video-attachment\"\n >\n <div className=\"relative\">\n <MediaStackGrid\n tiles={tiles}\n onTileActivate={handleActivate}\n className=\"overflow-hidden rounded-md\"\n />\n </div>\n\n <VideoViewer\n open={viewerOpen}\n items={buildViewerItems(resolvedItems, filename)}\n initialIndex={viewerIndex}\n onClose={closeViewer}\n />\n </Bubble>\n )\n}\n\n/**\n * Composer-only props. Single video (`src`) is required; stacked\n * `items` and `text` captions are not supported in the composer state.\n */\nexport interface VideoComposerProps {\n src: string\n poster?: string\n mimeType?: string\n filename?: string\n /**\n * `<video preload>` hint forwarded into the viewer. Defaults to\n * `'none'`. See `VideoAttachmentSharedProps.preload`.\n */\n preload?: MediaPreloadMode\n onClick?: (index: number) => boolean | void\n onDismiss?: () => void\n}\n\nexport type VideoSentProps = VideoAttachmentSharedProps\nexport type VideoReceivedProps = VideoAttachmentSharedProps\n\nconst VideoComposer: React.FC<VideoComposerProps> = (props) => (\n <VideoComposerInner {...props} />\n)\nconst VideoSent: React.FC<VideoSentProps> = (props) => (\n <VideoBubbleRow {...props} state=\"sent\" />\n)\nconst VideoReceived: React.FC<VideoReceivedProps> = (props) => (\n <VideoBubbleRow {...props} state=\"received\" />\n)\n\nconst VideoAttachment = {\n Composer: VideoComposer,\n Sent: VideoSent,\n Received: VideoReceived,\n}\n\nexport default VideoAttachment\n","import AudioAttachment, {\n type AudioComposerProps,\n type AudioReceivedProps,\n type AudioSentProps,\n} from './Audio'\nimport FileAttachment, {\n type FileComposerProps,\n type FileReceivedProps,\n type FileSentProps,\n} from './File'\nimport ImageAttachment, {\n type ImageComposerProps,\n type ImageReceivedProps,\n type ImageSentProps,\n} from './Image'\nimport PdfAttachment, {\n type PdfComposerProps,\n type PdfReceivedProps,\n type PdfSentProps,\n} from './Pdf'\nimport VideoAttachment, {\n type VideoComposerProps,\n type VideoReceivedProps,\n type VideoSentProps,\n} from './Video'\n\n/**\n * Per-MIME chat attachment cards used inside the messaging stream.\n *\n * Each subnamespace (`Image`, `Video`, `Audio`, `Pdf`, `File`) exposes\n * three states (`Composer`, `Sent`, `Received`) that map to the\n * sender / recipient sides of a chat:\n *\n * - `Composer` — sender draft state with a dismiss `×` affordance.\n * - `Sent` — sender-side state shown after posting.\n * - `Received` — recipient-side state.\n *\n * Sent / Received variants accept an optional `text` prop that renders\n * inside the same bubble as the attachment — mirroring the mobile chat\n * where a sender can pair a caption with an attachment ('Here is the\n * file', 'Here is the image'). Composer prop types intentionally omit\n * `text` (and `items` / `groupPosition`) so the type system enforces\n * the same contract: captions live in the message-input textarea, not\n * inside the draft attachment preview.\n *\n * Stacked attachments — every type except `Composer` accepts an\n * `items={[…]}` prop on Sent / Received that takes precedence over\n * the singular `src`/`filename`/etc. inputs:\n *\n * - Image / Video render a 1 / 2 / 3 / 4-tile grid (5+ collapse\n * into a `+N` overflow tile). Activating any tile opens the\n * built-in `ImageViewer` / `VideoViewer` at that index, with\n * arrow-key navigation between siblings.\n * - Pdf / Audio / File render their compact rows / players in a\n * vertical stack with an 8px gap between rows. Each row keeps\n * its own activation target — Pdf opens the viewer at that\n * index, Audio gets its own native player, and File downloads\n * the asset for that row.\n *\n * The Composer surface accepts only a single attachment at a time,\n * so its props omit `items` / `text`.\n *\n * Image / Video Composer renders bare — just the media with rounded\n * corners and a dismiss overlay, no surrounding bubble — so the draft\n * preview reads as an in-progress attachment instead of a sent\n * message. Sent / Received wrap the media in the shared bubble chrome.\n *\n * Image / Video / Pdf are interactive in every state (Composer, Sent,\n * Received) — clicks open the corresponding native viewer with built-in\n * download. File rows download the asset directly. Audio renders a\n * native `<audio controls>` player which exposes its own download in\n * the kebab menu, so we don't render a separate Download affordance.\n *\n * # Lazy-loading defaults\n *\n * Media attachments bake in network-friendly defaults for long chat\n * histories and expose explicit escape hatches when a caller knows\n * better (e.g. a hero attachment that's already on-screen):\n *\n * - **Image** — every `<img>` rendered on the bubble surface\n * (Composer thumbnail, single + stacked tiles, `+N` overflow)\n * ships with `loading=\"lazy\" decoding=\"async\"`. Override via the\n * attachment's `loading` prop (or `ImageItem.loading` for per-tile\n * control). The opened `ImageViewer` always eager-loads the\n * active image so it appears immediately.\n * - **Video** — the `<video>` rendered inside the `VideoViewer`\n * defaults to `preload=\"none\"`, so no video bytes are fetched\n * until the user opens the viewer. Poster `<img>` thumbnails on\n * the bubble surface are `loading=\"lazy\" decoding=\"async\"`.\n * Override via the attachment's `preload` prop (or\n * `VideoItem.preload` per item). Once the viewer is open the\n * active item bumps to `preload=\"metadata\"` so duration / the\n * first frame appear immediately.\n * - **Audio** — a single audio bubble defaults to\n * `preload=\"metadata\"` so the native player surfaces duration\n * immediately. A stacked audio bubble (`items.length > 1`)\n * defaults to `preload=\"none\"` for every player so a thread of\n * voice memos doesn't fan out N parallel metadata requests on\n * first paint. Override via the attachment's `preload` prop\n * (or `AudioItem.preload` per track).\n * - **Pdf** / **File** — no inline media element to throttle; the\n * bubble renders compact rows that download / open lazily on\n * activation. No `loading` / `preload` props on these surfaces.\n */\nconst MessageAttachment = {\n Image: ImageAttachment,\n Video: VideoAttachment,\n Audio: AudioAttachment,\n Pdf: PdfAttachment,\n File: FileAttachment,\n}\n\nexport default MessageAttachment\n\nexport type {\n ImageComposerProps,\n ImageSentProps,\n ImageReceivedProps,\n VideoComposerProps,\n VideoSentProps,\n VideoReceivedProps,\n AudioComposerProps,\n AudioSentProps,\n AudioReceivedProps,\n PdfComposerProps,\n PdfSentProps,\n PdfReceivedProps,\n FileComposerProps,\n FileSentProps,\n FileReceivedProps,\n}\nexport type {\n ImageItem,\n ImageLoadingMode,\n VideoItem,\n PdfItem,\n AudioItem,\n FileItem,\n BubbleGroupPosition,\n MediaPreloadMode,\n MessageAttachmentBaseProps,\n MessageAttachmentState,\n} from './types'\nexport { bubbleGroupPositionFromStream } from './types'\nexport {\n formatFileSize,\n getFileExtensionLabel,\n buildCompactMetaLabel,\n} from './_shared/fileMeta'\n","import classNames from 'classnames'\nimport React from 'react'\nexport interface FaqListItemProps {\n question: string\n onClick: () => void\n loading?: boolean\n className?: string\n}\n\nexport const FaqListItem: React.FC<FaqListItemProps> = ({\n question,\n onClick,\n loading = false,\n className,\n}) => {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={loading}\n style={{ backgroundColor: '#E6E5E3' }}\n className={classNames(\n 'w-full text-center p-4 rounded-xl text-charcoal font-medium transition-colors focus-ring',\n {\n 'hover:brightness-95 active:brightness-90': !loading,\n 'opacity-50 cursor-not-allowed': loading,\n },\n className\n )}\n >\n {question}\n </button>\n )\n}\n","import React from 'react'\n\nimport { Avatar } from '../Avatar'\n\nimport { FaqListItem } from './FaqListItem'\n\nexport interface Faq {\n id: string\n question: string\n answer: string\n enabled: boolean\n order?: number | null\n}\n\nexport interface FaqListProps {\n faqs: Faq[]\n onFaqClick: (faqId: string) => void\n loadingFaqId?: string | null\n headerText?: string\n className?: string\n avatarImage?: string\n avatarName?: string\n}\n\nexport const FaqList: React.FC<FaqListProps> = ({\n faqs,\n onFaqClick,\n loadingFaqId,\n headerText,\n className,\n avatarImage,\n avatarName,\n}) => {\n const enabledFaqs = faqs\n .filter((faq) => faq.enabled)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n\n if (enabledFaqs.length === 0) {\n return null\n }\n\n return (\n <div className={className}>\n <div className=\"flex gap-3 items-end\">\n {/* Avatar at bottom-left, outside grey background */}\n {(avatarImage || avatarName) && (\n <div className=\"flex-none\">\n <Avatar\n id={avatarName || 'account'}\n name={avatarName || 'Account'}\n image={avatarImage}\n size={24}\n shape=\"circle\"\n />\n </div>\n )}\n\n {/* FAQs with grey background */}\n <div\n className=\"flex-1 flex flex-col gap-3 rounded-lg p-4\"\n style={{ backgroundColor: '#F1F0EE' }}\n >\n {headerText && (\n <p className=\"text-md text-charcoal mb-4\">{headerText}</p>\n )}\n {enabledFaqs.map((faq) => (\n <FaqListItem\n key={faq.id}\n question={faq.question}\n onClick={() => onFaqClick(faq.id)}\n loading={loadingFaqId === faq.id}\n />\n ))}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["MessagingContext","createContext","useMessagingContext","useContext","MessagingProvider","children","user","serviceConfig","apiKey","capabilities","debug","debugLog","useCallback","message","args","service","setService","useState","client","setClient","isConnected","setIsConnected","isLoading","setIsLoading","error","setError","connectingRef","useRef","prevPropsRef","renderCountRef","useEffect","currentRender","newService","StreamChatService","connectedUserRef","_a","_b","streamClient","err","errorMessage","refreshConnection","contextValue","React","jsx","Chat","useMessaging","restorePendingMessages","channel","pendingMessages","pending","ChannelListContext","ChannelListProvider","useChannelListContext","useChannelStar","isChannelStarred","setIsChannelStarred","handleMemberUpdate","event","getDaysDifference","date1","date2","d1","diffTime","formatRelativeTime","date","now","daysDiff","normalizeLanguageCode","language","getMessageDisplayText","viewerLanguage","fallbackText","normalizedLanguage","UUID_REGEX","isUuidLike","value","isUsableDisplayValue","userId","trimmed","resolveParticipantDisplayName","EMOJIS","hashString","str","hash","i","char","getAvatarEmoji","id","index","Avatar","image","size","className","starred","shape","dmAgentEnabled","emoji","fontSizeClass","aiBorderWidth","borderStyle","avatarInner","classNames","jsxs","StarIcon","SparkleIcon","isTipMessage","isPaidMessage","isChatbotMessage","isAttachmentMessage","isTipOrPaidMessage","isTipOnlyMessage","MessageTag","standalone","isMyMessage","hasAttachment","isTipOrPaid","isChatbot","amountText","label","GiftIcon","isSenderAttachmentVariant","chatbotLabel","chatbotClassName","icon","Fragment","CustomChannelPreview","unread","selectedChannel","onChannelSelect","renderMessagePreview","isSelected","handleClick","handleKeyDown","isActivationKey","isRepeatedKeydown","participant","member","participantName","participantImage","lastMessage","messages","lastMessageText","displayText","attachment","lastMessageTime","isLastMessageFromChatbot","messagePreview","unreadCount","_c","DEFAULT_SORT","ChannelList","filters","allowNewMessagesFromUnfilteredChannels","onMessageNew","onAddedToChannel","channelRenderFilterFn","sort","customEmptyStateIndicator","wrappedChannelRenderFilterFn","channels","StreamChannelList","ActionButton","variant","rest","IconButton","CloseButton","onClick","XIcon","ChannelInfoDialog","dialogRef","onClose","participantDisplayName","followerStatusLabel","onLeaveConversation","onBlockParticipant","showDeleteConversation","onDeleteConversationClick","onBlockParticipantClick","onReportParticipantClick","customProfileContent","customChannelActions","isParticipantBlocked","setIsParticipantBlocked","isLeaving","setIsLeaving","isUpdatingBlockStatus","setIsUpdatingBlockStatus","checkIsParticipantBlocked","isBlocked","handleLeaveConversation","actingUserId","handleBlockUser","handleUnblockUser","handleReportUser","participantUsername","participantSecondary","participantId","_d","e","SpinnerGapIcon","SignOutIcon","ProhibitInsetIcon","FlagIcon","CustomDateSeparator","props","DateSeparator","VOTE_UP","VOTE_DOWN","getVoteFromReactions","ownReactions","r","useMessageVote","useChannelStateContext","useChatContext","selected","useMemo","voteUp","voteDown","ComposerCardLazy","SentCardLazy","ReceivedCardLazy","LockedAttachmentFallback","Composer","Suspense","Sent","Received","Creator","Visitor","LockedAttachment","DOCUMENT_ICON_PATTERNS","getSourceType","mimeType","getDocumentIconType","match","pattern","MEDIA_TYPE_ICON","VideoCameraIcon","SpeakerHighIcon","ImageIcon","FileIcon","DOCUMENT_ICON_COMPONENT","FilePdfIcon","FileDocIcon","FileXlsIcon","FileCsvIcon","FilePptIcon","FileZipIcon","FileTextIcon","FileMdIcon","getTypeIcon","sourceType","renderTypeIcon","getClientXFromEvent","MediaPlayer","source","poster","autoPlay","playingProp","loop","controls","showProgress","muted","onContainerClick","playerRef","trackRef","rafRef","prevPlayingPropRef","playing","setPlaying","played","setPlayed","seeking","setSeeking","scrubberHovered","setScrubberHovered","manualPlayRequired","setManualPlayRequired","buffering","setBuffering","initialLoad","setInitialLoad","videoAspect","setVideoAspect","startPlaybackFromGesture","getFraction","track","rect","seekTo","fraction","el","handleTrackPointerDown","tick","onMove","onUp","aspectStyle","aspectClass","scrubberPercent","p","CircleNotchIcon","PlayIcon","PauseIcon","placeholderIconClass","posterShellClass","AttachmentThumbnail","sourceUrl","thumbnailUrl","title","mediaPlayerProps","containedImage","sourceReady","setSourceReady","AttachmentCard","thumbnail","placeholderTitle","detail","statusBadge","action","topLeft","topRight","rootRef","dataTestId","isDark","displayTitle","titleDimmed","formatBytes","bytes","linkCardShellClass","linkThumbnailBg","linkPrimaryText","linkSecondaryText","linkTertiaryText","linkIconColor","LinkCard","text","image_url","og_scrape_url","title_link","rawUrl","url","body","LinkIcon","isLinkAttachment","a","resolveLinkAttachment","triggerDownload","filename","name","res","blob","objectUrl","DownloadAction","busy","setBusy","fallback","DownloadSimpleIcon","resolveMediaFromMessage","videoAttachment","imageAttachment","audioAttachment","fileAttachment","activeAttachment","resolvedUrl","resolvedType","fileSize","MediaMessageRoot","linkAttachment","resolved","MediaMessageCreatorEntry","MediaMessageVisitorEntry","MediaMessage","defaultLockedAttachmentContextValue","customMessageDefaults","CustomMessageContext","CustomMessageProvider","useCustomMessage","key","MessageVoteButtons","onVoteUp","onVoteDown","ThumbsUpIcon","ThumbsDownIcon","CustomMessageWithContext","additionalMessageInputProps","chatbotVotingEnabled","editing","endOfGroup","firstOfGroup","groupedByUser","handleAction","handleOpenThread","handleRetry","highlighted","isMessageAIGenerated","renderText","threadList","isUnlocking","onUnlockClick","onFetchSource","onDownloadClick","isBounceDialogOpen","setIsBounceDialogOpen","reminder","useMessageReminder","voteState","Attachment","DefaultAttachment","EditMessageModal","DefaultEditMessageModal","MessageActions","MessageBlocked","DefaultMessageBlocked","MessageBouncePrompt","DefaultMessageBouncePrompt","MessageDeleted","DefaultMessageDeleted","MessageIsThreadReplyInChannelButtonIndicator","DefaultMessageIsThreadReplyInChannelButtonIndicator","MessageRepliesCountButton","DefaultMessageRepliesCountButton","ReminderNotification","DefaultReminderNotification","StreamedMessageText","DefaultStreamedMessageText","PinIndicator","useComponentContext","messageHasAttachments","hasReactions","messageHasReactions","isAIGenerated","finalAttachments","attachments","raw","filtered","displayMessage","isDateSeparatorMessage","isMessageBlocked","showReplyCountButton","showIsReplyInChannel","allowRetry","isBounced","isMessageBounced","isMine","rootClassName","poll","isTipOnly","isAttachment","hasRenderableAttachments","useAttachmentFooterChatbotTag","MessageBounceModal","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","MessageText","Poll","MessageErrorIcon","MemoizedCustomMessage","prev","next","areMessageUIPropsEqual","CustomMessage","messageContext","useMessageContext","f","n","o","clsx","ChannelStateContext","componentName","ChatContext","ComponentContext","_componentName","require$$0","is","x","y","objectIs","useLayoutEffect","useDebugValue","useSyncExternalStore$2","subscribe","getSnapshot","_useState","inst","forceUpdate","checkIfSnapshotChanged","latestGetSnapshot","nextValue","useSyncExternalStore$1","shim","useSyncExternalStoreShim_production","didWarnOld18Alpha","didWarnUncachedGetSnapshot","cachedValue","useSyncExternalStoreShim_development","shimModule","require$$1","noop","useStateStore","store","selector","wrappedSubscription","onStoreChange","wrappedSnapshot","cachedTuple","currentValue","newlySelected","selectededAreEqualToCached","useSyncExternalStore","useDialog","dialogManagerId","dialogManager","useDialogManager","useDialogOnNearestManager","useNearestDialogManagerContext","useDialogIsOpen","dialogIsOpenSelector","dialogsById","Portal","getPortalDestination","isOpen","portalDestination","setPortalDestination","destination","createPortal","DialogPortalEntry","dialogId","dialogIsOpen","dialogManagersRegistry","StateStore","DialogManagerProviderContext","getManagerFromStore","newState","previousState","managerInNewState","managerInPrevState","dialogMng","nearestDialogManagerContext","dialogManagerContext","setDialogManagerContext","unsubscribe","state","prevState","MessageContext","t","module","this","s","c","h","d","l","$","M","m","v","u","g","D","S","_","w","O","b","k","defaultTranslatorFunction","defaultDateTimeParser","input","Dayjs","calendar","localizedFormat","TranslationContext","useTranslationContext","ThreadContext","useThreadContext","Icon","getWholeChar","code","onMouseOver","nameStr","initials","showImage","isUserMuted","mutes","MESSAGE_ACTIONS","ACTIONS_NOT_WORKING_IN_THREAD","useUserRole","onlySenderCanEdit","disableQuotedMessages","channelCapabilities","isAdmin","isOwner","isModerator","canEdit","canDelete","canFlag","canMarkUnread","canMute","canQuote","canReact","canReply","messageId","reminderSelector","$d447af545b77c9f1$export$b204af158042fbac","$d447af545b77c9f1$export$f21a1ffae260145a","$d447af545b77c9f1$var$isNode","$d447af545b77c9f1$export$af51f0f06c0f328a","node","$6a20a7989e6c817a$var$_shadowDOM","$6a20a7989e6c817a$export$98658e8c59125e6a","$23f2114a1b82827e$export$4282f70798064fe0","otherNode","$eXv8n$shadowDOM","currentNode","$23f2114a1b82827e$export$cd4e5573fbe2b576","doc","activeElement","$23f2114a1b82827e$export$e58f029f0fbfdb29","$654b97e09f2a30c1$export$63eb3ababa9c55c4","root","whatToShow","filter","shadowRoot","walker","walkers","curNode","currentWalkerCurrentNode","newNode","nextNode","nodeResult","currentWalker","previousNode","$654b97e09f2a30c1$export$4d0f8be8b12a7ef6","$kGVXB$shadowDOM","$1969ac565cfec8d0$export$de79e2c695e052f3","element","$1969ac565cfec8d0$var$supportsPreventScroll","scrollableElements","$1969ac565cfec8d0$var$getScrollableElements","$1969ac565cfec8d0$var$restoreScrollPosition","$1969ac565cfec8d0$var$supportsPreventScrollCached","parent","rootScrollingElement","scrollTop","scrollLeft","$ae77152785188400$var$supportsCheckVisibility","$ae77152785188400$var$isStyleVisible","windowObject","display","visibility","isVisible","getComputedStyle","computedDisplay","computedVisibility","$ae77152785188400$var$isAttributeVisible","childElement","$ae77152785188400$export$e989c0fffaa6b27a","$3b8b240c1bf84ab9$var$focusableElements","$3b8b240c1bf84ab9$var$FOCUSABLE_ELEMENT_SELECTOR","$3b8b240c1bf84ab9$var$TABBABLE_ELEMENT_SELECTOR","$3b8b240c1bf84ab9$export$4c063cf1350e6fed","options","$3b8b240c1bf84ab9$var$isInert","$3b8b240c1bf84ab9$export$bebd5a1431fec25d","$c4867b2f328c2698$export$e5c5a5f917a5871c","$3ARPR$react","$a92dc41f639950be$export$fda7da73ab5d4c48","$2add3ce32c6007eb$var$testUserAgent","re","brands","brand","$2add3ce32c6007eb$var$testPlatform","$2add3ce32c6007eb$var$cached","fn","$2add3ce32c6007eb$export$9ac100e40613ea10","$2add3ce32c6007eb$export$186c6964ca17d99","$2add3ce32c6007eb$export$7bef049ce92e4224","$2add3ce32c6007eb$export$fedb369cb70207f1","$2add3ce32c6007eb$export$78551043582a6a98","$2add3ce32c6007eb$export$6446a186d09e379e","$2add3ce32c6007eb$export$a11b0059900ceec8","$2add3ce32c6007eb$export$b7d78993b74f766d","$b5c62b033c25b96d$export$60278871457622de","$caaf0dd3060ed57c$export$95185d699e05d4d7","target","modifiers","setOpening","metaKey","ctrlKey","altKey","shiftKey","$8f5a2122b0992be3$var$currentModality","$8f5a2122b0992be3$export$901e90a13c50a14e","$8f5a2122b0992be3$export$d90243b58daecda7","$8f5a2122b0992be3$var$hasEventBeforeFocus","$8f5a2122b0992be3$var$hasBlurredWindowRecently","$8f5a2122b0992be3$var$triggerChangeHandlers","modality","handler","$8f5a2122b0992be3$var$isValidKey","$8f5a2122b0992be3$var$handleKeyboardEvent","$8f5a2122b0992be3$var$handlePointerEvent","$8f5a2122b0992be3$var$handleClickEvent","$8f5a2122b0992be3$var$handleFocusEvent","ownerWindow","ownerDocument","$8f5a2122b0992be3$var$handleWindowBlur","$8f5a2122b0992be3$var$setupGlobalFocusEvents","documentObject","focus","$8f5a2122b0992be3$var$tearDownWindowFocusTracking","loadListener","$8f5a2122b0992be3$export$2f1888112f558a7d","$8f5a2122b0992be3$export$630ff653c5ada6a9","$081cb5757e08788e$var$transitionsByElement","$081cb5757e08788e$var$transitionCallbacks","$081cb5757e08788e$var$setupGlobalEvents","isTransitionEvent","onTransitionStart","eventTarget","transitions","onTransitionEnd","properties","cb","$081cb5757e08788e$var$cleanupDetachedElements","$081cb5757e08788e$export$24490316f764c430","$f192c2f16961cbe0$export$80f3e147d781571c","lastFocusedElement","$535772f9d2c1f38d$var$FocusContext","$jmfRy$react","$535772f9d2c1f38d$var$RESTORE_FOCUS_EVENT","$535772f9d2c1f38d$var$activeScope","$535772f9d2c1f38d$export$20e40289641fbbb6","contain","restoreFocus","autoFocus","startRef","$jmfRy$useRef","endRef","scopeRef","parentNode","$jmfRy$useContext","$jmfRy$useMemo","$535772f9d2c1f38d$var$TreeNode","$535772f9d2c1f38d$export$d06fae2ee68b101e","$535772f9d2c1f38d$var$isAncestorScope","activeNode","nodes","stopPropagation","$535772f9d2c1f38d$var$useActiveScopeTracker","$535772f9d2c1f38d$var$useFocusContainment","$535772f9d2c1f38d$var$useRestoreFocus","$535772f9d2c1f38d$var$useAutoFocus","$jmfRy$useEffect","scope","$535772f9d2c1f38d$var$isElementInScope","parentScope","focusManager","$535772f9d2c1f38d$var$createFocusManagerForScope","opts","from","tabbable","wrap","accept","sentinel","scopeRoot","$535772f9d2c1f38d$var$getScopeRoot","$535772f9d2c1f38d$export$2d6ec8fc375ceafa","$535772f9d2c1f38d$var$focusElement","$535772f9d2c1f38d$var$shouldContainFocus","$535772f9d2c1f38d$var$getRadiosInGroup","radio","radioList","$535772f9d2c1f38d$var$isTabbableRadio","radios","focusedNode","raf","onKeyDown","focusedElement","nextElement","onFocus","$535772f9d2c1f38d$var$isElementInChildScope","$535772f9d2c1f38d$var$focusFirstInScope","onBlur","shouldSkipFocusRestore","$535772f9d2c1f38d$var$isElementInAnyScope","ancestor","scroll","$535772f9d2c1f38d$var$getFirstInScope","autoFocusRef","restore","$535772f9d2c1f38d$var$shouldRestoreFocus","nodeToRestoreRef","treeNode","nodeToRestore","clonedTree","$535772f9d2c1f38d$var$restoreFocusToElement","rootElement","$535772f9d2c1f38d$var$Tree","data","current","child","newTree","hasWindow","getNodeName","isNode","getWindow","_node$ownerDocument","getDocumentElement","_ref","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflow","overflowX","overflowY","isTableElement","isTopLayer","willChangeRe","containRe","isNotNone","isWebKitValue","isContainingBlock","elementOrCss","css","isWebKit","getContainingBlock","getParentNode","isLastTraversableNode","getNodeScroll","result","getNearestOverflowAncestor","getOverflowAncestors","list","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","sides","alignments","placements","acc","side","min","max","round","floor","createCoords","oppositeSideMap","clamp","start","end","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","firstChar","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","isStart","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","padding","getPaddingObject","rectToClientRect","width","height","isClient","SafeReact","useInsertionEffect","useSafeInsertionEffect","useEffectEvent","callback","ref","_len","_key","computeCoordsFromPlacement","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","_await$platform$isEle","platform","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","MAX_RESET_COUNT","computePosition","config","middleware","platformWithDetectOverflow","statefulPlacement","resetCount","middlewareData","currentMiddleware","nextX","nextY","reset","getPlacementList","autoAlignment","allowedPlacements","autoPlacement","_middlewareData$autoP","_middlewareData$autoP2","_placementsThatFitOnE","crossAxis","detectOverflowOptions","placements$1","currentIndex","currentPlacement","alignmentSides","currentOverflows","allOverflows","nextPlacement","placementsSortedByMostSpace","resetPlacement","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","overflows","overflowsData","_middlewareData$flip2","_overflowsData$filter","nextIndex","_overflowsData$filter2","currentSideAxis","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","offset","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","_state$middlewareData","_state$middlewareData2","apply","isYAxis","heightSide","widthSide","maximumClippingHeight","maximumClippingWidth","overflowAvailableHeight","overflowAvailableWidth","noShift","availableHeight","availableWidth","xMin","xMax","yMin","yMax","nextDimensions","getCssDimensions","getComputedStyle$1","hasOffset","offsetWidth","offsetHeight","shouldFallback","unwrapElement","getScale","domElement","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","left","top","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","SCROLLBAR_MAX","getViewportRect","visualViewport","visualViewportBased","windowScrollbarX","bodyStyles","bodyMarginInline","clippingStableScrollbarWidth","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","getClippingRect","clippingAncestors","firstRect","right","bottom","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","rectsAreEqual","observeMove","io","timeoutId","cleanup","_io","refresh","skip","threshold","elementRectForRootMargin","insetTop","insetRight","insetBottom","insetLeft","isFirstUpdate","handleObserve","entries","ratio","autoUpdate","update","ancestorScroll","ancestorResize","elementResize","layoutShift","animationFrame","referenceEl","ancestors","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset$1","autoPlacement$1","shift$1","flip$1","size$1","mergedOptions","platformWithCache","computePosition$1","deepEqual","keys","getDPR","roundByDPR","dpr","useLatestRef","useFloating","externalReference","externalFloating","transform","whileElementsMounted","open","setData","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","referenceRef","setFloating","floatingRef","floatingEl","dataRef","hasWhileElementsMounted","whileElementsMountedRef","platformRef","openRef","fullData","isMountedRef","ReactDOM","refs","floatingStyles","initialStyles","deps","serverHandoffComplete","count","genId","useFloatingId","setId","useModernLayoutEffect","useReactId","useId","devMessageSet","_devMessageSet3","_len2","_key2","_devMessageSet4","createEventEmitter","map","_map$get","listener","_map$get2","FloatingNodeContext","FloatingTreeContext","useFloatingParentNodeId","_React$useContext","useFloatingTree","useFloatingRootContext","onOpenChangeProp","elementsProp","floatingId","events","nested","optionDomReference","positionReference","setPositionReference","onOpenChange","reason","nodeId","internalRootContext","rootContext","computedElements","_domReference","setDomReference","_setPositionReference","domReference","domReferenceRef","tree","position","useFloating$1","computedPositionReference","context","hasResizeObserver","autoMiddlewareFor","toOffsetMw","opt","offsetMw","usePopoverPosition","allowFlip","allowShift","autoUpdateOptions","fitAvailableSpace","freeze","autoMw","offsetMiddleware","isSidePlacement","flipMw","shiftMw","sizeMw","seedPlacement","useDialogAnchor","referenceElement","popperElement","setPopperElement","DialogAnchor","tabIndex","trapFocus","restDivProps","dialog","styles","hideOnEscape","FocusScope","ButtonWithSubmenu","Submenu","submenuContainerProps","buttonProps","buttonRef","dialogContainer","setDialogContainer","keepSubmenuOpen","dialogCloseTimeout","closeDialogLazily","handleClose","parentButton","handleFocusParentButton","RemindMeActionButton","RemindMeSubmenu","offsetMs","ActionsIcon","ReactionIcon","ThreadIcon","MessageActionsWrapper","customWrapperClass","inline","toggleOpen","defaultWrapperClass","wrapperProps","isMutableRef","getImageDimensions","resolve","reject","SpriteImage","columns","rows","spriteUrl","style","spriteWidth","spriteHeight","setSpriteDimensions","StreamSpriteEmojiPositions","STREAM_SPRITE_URL","StreamEmoji","type","defaultReactionOptions","UnMemoizedReactionSelector","propAvatar","detailedView","propHandleReaction","propLatestReactions","propOwnReactions","propReactionGroups","propReactionOptions","reverse","contextAvatar","contextReactionOptions","closeReactionSelectorOnClick","contextHandleReaction","reactionOptions","DefaultAvatar","handleReaction","latestReactions","reactionGroups","tooltipReactionType","setTooltipReactionType","tooltipPositions","setTooltipPositions","targetRef","tooltipRef","showTooltip","reactionType","hideTooltip","tooltip","container","tooltipPosition","arrowPosition","getUsersPerReactionType","reaction","iHaveReactedWithReaction","getLatestUserForReactionType","users","Component","reactionName","latestUser","ReactionSelector","ReactionSelectorWithButton","DefaultReactionSelector","LegacyThreadContext","useLegacyThreadContext","queueCache","FixedSizeQueueCache","useMessageComposer","editedMessage","parentMessage","threadInstance","cachedEditedMessage","cachedParentMessage","messageComposer","tag","MessageComposer","cachedComposer","compositionContext","useBaseMessageActionSetFilter","messageActionSet","disable","isInitialMessage","channelConfig","isMessageThreadReply","useSplitMessageActionSet","quickActionSet","dropdownActionSet","msgActionsBoxButtonClassName","DefaultDropdownActionButton","ariaSelected","role","DefaultMessageActionComponents","handleQuote","textarea","handlePin","handleMarkUnread","handleFlag","handleMute","handleEdit","handleDelete","DefaultReactionIcon","defaultMessageActionSet","disableBaseMessageActionSetFilter","theme","actionsBoxButtonElement","setActionsBoxButtonElement","filteredMessageActionSet","dropdownDialogId","reactionSelectorDialogId","dropdownDialogIsOpen","reactionSelectorDialogIsOpen","DropdownBox","DropdownActionComponent","QuickActionComponent","DeleteAction","ReportAction","MESSAGE_ACTION_SET","CustomMessageActions","linkPreviewsManagerStateSelector","preview","LinkPreviewsManager","CustomLinkPreviewCard","link","onDismiss","CustomLinkPreviewList","linkPreviewsManager","stateLinkPreviews","handleDismiss","linkPreview","DefaultSendButton","sendMessage","disabled","ArrowUpIcon","CustomMessageInputInner","isFrozen","handleSubmit","useMessageInputContext","SendButtonFromContext","SendButton","hasSendableData","useMessageComposerHasSendableData","SimpleAttachmentSelector","QuotedMessagePreview","AttachmentPreviewList","TextareaComposer","CustomMessageInput","renderActions","MessageInput","DM_AGENT_SYSTEM_TYPES","DM_AGENT_SYSTEM_MESSAGE_FALLBACK_TEXT","AGE_SAFETY_SYSTEM_TYPES","AGE_SAFETY_SYSTEM_MESSAGE_FALLBACK_TEXT","AGE_SAFETY_SYSTEM_MESSAGE_EMPHASIS","AGE_SAFETY_SYSTEM_MESSAGE_URL","isDmAgentSystemType","isAgeSafetySystemType","getCustomSystemMessageVariant","metadataCustomType","fallbackType","renderAgeSafetyMessageText","messageText","emphasisIndex","emphasisEndIndex","CustomSystemMessage","isDateHidden","customSystemMessageVariant","MessageTimestamp","ProhibitIcon","DmAgentEnabledContext","Circle","cx","AI_ACTIVE_STATES","AIStates","CustomTypingIndicator","thread","typing","useTypingContext","aiState","useAIState","agentUser","findOtherChannelUser","TypingBubble","typingInChannel","parent_id","typingInThread","typingUsers","typingUser","memberUser","avatarId","avatarName","avatarImage","testId","selfId","members","ChannelEmptyState","Loading","LoadingState","ICON_BTN_CLASS","DM_AGENT_HEADER_HELPER_TEXT","CustomChannelHeader","onBack","showBackButton","onShowInfo","canShowInfo","showStarButton","getParticipantDisplayName","myUserId","isStarred","handleStarClick","ArrowLeftIcon","CaretRightIcon","DotsThreeIcon","ChannelViewInner","renderMessageInputActions","renderConversationFooter","renderChannelBanner","renderMessage","infoDialogRef","currentMember","currentUserIsAccount","participantIsAccount","showDmAgentHeader","channelExtraData","handleShowInfo","handleCloseInfo","MessageOverride","messageNode","WithComponents","Window","MessageList","ChannelView","CustomChannelEmptyState","messageMetadata","onMessageSent","sendButton","getParticipantDisplayNameProp","doSendMessageRequest","_channel","agentPaused","shouldSuppressNotifications","finalMessage","finalOptions","response","Channel","ChatBubblesIllustration","EmptyState","hasChannels","channelsLoaded","ErrorState","MessagingShell","initialParticipantFilter","initialParticipantData","showChannelList","channelListCustomEmptyStateIndicator","setSelectedChannel","setHasChannels","setChannelsLoaded","directConversationMode","setDirectConversationMode","directConversationError","setDirectConversationError","channelFilters","syncedRef","syncChannels","createErr","handleChannelSelect","handleBackToChannelList","handleBlockParticipant","isChannelSelected","SCHEME_PATTERN","SAFE_SCHEMES","normalizeExternalHref","schemeMatch","scheme","BUTTON_CLASS_BY_VARIANT","CardCta","cta","normalizedHref","TITLE_CLASS_BY_VARIANT","TITLE_DIMMED_CLASS","SECONDARY_CLASS_BY_VARIANT","CardBody","description","appIcon","trailingAction","hasTitle","hasDescription","trimmedUrl","hasUrl","hasCta","titleClass","secondaryClass","SHELL_CLASS","CardShell","href","ariaLabel","bgClassName","isInteractive","corner","PLACEHOLDER_BG","PLACEHOLDER_ICON","isPlayableAudio","isPlayableMedia","AUDIO_BG_CLASS","CardThumbnail","isPlayableVideo","ComposerCard","layout","onEditClick","isClassic","isAudio","dismissButton","editButton","PencilSimpleIcon","ReceivedCard","isPlayingMedia","normalizedUrl","shellHref","shellOnClick","audioBg","wrappedCta","SentCard","LinkAttachment","BUBBLE_BG_BY_VARIANT","BUBBLE_TEXT_BY_VARIANT","BUBBLE_BORDER_BY_VARIANT","sideForVariant","CORNER_CLASSES_BY_SIDE_AND_POSITION","Bubble","bordered","groupPosition","hasText","cornerClasses","DismissButton","bubbleVariantForState","bubbleGroupPositionFromStream","resolveItems","src","items","NativeAudioPlayer","item","preload","AudioAttachmentRow","showDismiss","resolvedItems","resolvedPreload","AudioComposer","AudioSent","AudioReceived","AudioAttachment","formatFileSize","EXTENSION_LABEL_BY_DOCUMENT_TYPE","getFileExtensionLabel","lastDot","ext","docType","docLabel","subtype","buildCompactMetaLabel","filenameFromUrl","last","META_CLASS_BY_VARIANT","ICON_BG_BY_VARIANT","ICON_COLOR_BY_VARIANT","CompactDocumentRow","onActivate","activateLabel","resolvedTitle","metaLabel","iconTile","textBlock","FileRowButton","resolvedFilename","FileAttachmentRow","handleActivate","downloadIcon","FileComposer","FileSent","FileReceived","FileAttachment","iconOnly","tone","onTriggered","showIconOnly","iconProps","activeLockCount","previousBodyOverflow","lockBodyScroll","unlockBodyScroll","ViewerShell","actions","contentClassName","closeButtonRef","previouslyFocused","focusTarget","handleKey","MIN_SCALE","MAX_SCALE","ZOOM_STEP","RESET_STATE","ImageViewer","initialIndex","safeIndex","setIndex","view","setView","dragging","setDragging","dragStart","stageRef","goPrev","goNext","onKey","zoomBy","factor","nextScale","stage","handleWheel","handleDoubleClick","handleMouseDown","cursorClass","totalLabel","MagnifyingGlassMinusIcon","MagnifyingGlassPlusIcon","CaretLeftIcon","TILE_SHELL","MediaStackGrid","tiles","onTileActivate","maxVisible","total","visible","renderTile","tile","extra","sharedClass","isLastWithOverflow","useViewer","viewerOpen","setViewerOpen","viewerIndex","setViewerIndex","closeViewer","tileFromItem","totalCount","fallbackLoading","alt","buildViewerItems","ImageComposerInner","loading","ImageBubbleRow","ImageComposer","ImageSent","ImageReceived","ImageAttachment","PdfViewer","iframeSrc","withPdfViewerParams","hashIndex","base","existing","params","PdfRowButton","PdfAttachmentRow","activeItem","activeFilename","itemFilename","PdfComposer","PdfSent","PdfReceived","PdfAttachment","VideoViewer","PlayBadge","PosterTile","it","VideoComposerInner","VideoBubbleRow","VideoComposer","VideoSent","VideoReceived","VideoAttachment","MessageAttachment","FaqListItem","question","FaqList","faqs","onFaqClick","loadingFaqId","headerText","enabledFaqs","faq"],"mappings":"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","x_google_ignoreList":[30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]}