@frontify/fondue 12.0.7 → 12.0.9
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkChooser.es.js","sources":["../../../src/components/LinkChooser/LinkChooser.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { useComboBox } from '@react-aria/combobox';\nimport { DismissButton } from '@react-aria/overlays';\nimport { scrollIntoView } from '@react-aria/utils';\nimport { useComboBoxState } from '@react-stately/combobox';\nimport { useMachine } from '@xstate/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { type Key, type MouseEvent, type ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { mapToAriaProps } from '@components/ActionMenu/Aria/helper';\nimport { Checkbox, CheckboxState } from '@components/Checkbox/Checkbox';\nimport IconArrowOutExternal from '@foundation/Icon/Generated/IconArrowOutExternal';\nimport IconBuildingBlock from '@foundation/Icon/Generated/IconBuildingBlock';\nimport IconDocument from '@foundation/Icon/Generated/IconDocument';\nimport IconDocumentStack from '@foundation/Icon/Generated/IconDocumentStack';\nimport IconLayersSingle from '@foundation/Icon/Generated/IconLayersSingle';\nimport IconLink from '@foundation/Icon/Generated/IconLink';\nimport { useDropdownAutoHeight } from '@hooks/useDropdownAutoHeight';\nimport { Validation } from '@utilities/validation';\n\nimport { NavigationMenu } from './NavigationMenu';\nimport { Popover } from './Popover';\nimport { SearchInput } from './SearchInput';\nimport { SearchResultsList } from './SearchResultsList';\nimport { defaultSection } from './sections';\nimport { linkChooserMachine } from './state/machine';\nimport { LinkChooserState } from './state/types';\nimport { IconName, type LinkChooserProps, type SearchMenuBlock } from './types';\nimport { decoratedResults, doesContainSubstring, findSection, getDefaultData } from './utils/helpers';\nimport { closeBoxState, isLoaded, openBoxState, queryMatchesSelection, shouldGoBack } from './utils/state';\nimport { createCustomLink } from './utils/transformers';\nimport { useManualComboBoxEventHandlers } from './utils/useManualComboBoxHandlers';\n\nexport const IconOptions: Record<IconName | string, ReactElement> = {\n [IconName.Document]: <IconDocument />,\n [IconName.Library]: <IconDocumentStack />,\n [IconName.Link]: <IconLink />,\n [IconName.External]: <IconArrowOutExternal />,\n [IconName.Template]: <IconLayersSingle />,\n [IconName.Block]: <IconBuildingBlock />,\n};\n\nexport const DEFAULT_ICON = IconName.Link;\nexport const CUSTOM_LINK_ID = 'custom-link';\nexport const MAX_STORED_ITEMS = 5;\nexport const QUERIES_STORAGE_KEY = 'queries';\n\nexport const LinkChooser = ({\n getGlobalByQuery = getDefaultData,\n openPreview = window.open,\n clipboardOptions = navigator.clipboard,\n selectedResult = null,\n openInNewTab = false,\n ariaLabel = 'Menu',\n extraSections = [],\n label,\n placeholder,\n onOpenInNewTabChange,\n onLinkChange,\n disabled,\n clearable,\n required,\n validation = Validation.Default,\n 'data-test-id': dataTestId = 'link-chooser',\n}: LinkChooserProps): ReactElement => {\n const [{ context, matches, value }, send, service] = useMachine(() =>\n linkChooserMachine.withContext({\n searchResults: [],\n selectedResult,\n query: '',\n interruptedFetch: false,\n getExtraResultsByQuery: null,\n currentSectionId: defaultSection.id,\n extraSections,\n clipboardOptions,\n openPreview,\n getGlobalByQuery,\n onLinkChange,\n }),\n );\n\n const [searchInput, setSearchInput] = useState(selectedResult?.title);\n const isDefault = !shouldGoBack(matches);\n const searchResultMenuBlocks = useMemo(\n () =>\n [\n !isDefault && { id: 'menu-top', menuItems: [findSection(extraSections, context.currentSectionId)] },\n {\n id: 'search',\n menuItems: decoratedResults(context.searchResults),\n },\n isDefault && { id: 'menu-bottom', menuItems: extraSections.map(({ id, title }) => ({ id, title })) },\n ].filter(Boolean),\n [isDefault, extraSections, context.currentSectionId, context.searchResults],\n ) as SearchMenuBlock[];\n\n const props = mapToAriaProps(ariaLabel, searchResultMenuBlocks);\n\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listBoxRef = useRef<HTMLUListElement | null>(null);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n\n const handleSelectionChange = (key: Key) => {\n const foundItem = context.searchResults.find((item) => item.id === key);\n if (foundItem) {\n setSearchInput(foundItem.title);\n send({ type: 'SET_SELECTED_SEARCH_RESULT', data: { selectedResult: foundItem } });\n }\n closeBoxState(state);\n setSelectedKey(key);\n };\n\n const handleInputChange = useCallback(\n (query: string) => {\n setSearchInput(query);\n send({ type: 'TYPING', data: { query } });\n },\n [send],\n );\n\n const [selectedKey, setSelectedKey] = useState<Key | undefined>(context.selectedResult?.id);\n\n const state = useComboBoxState({\n ...props,\n defaultFilter: (textValue, inputValue) => doesContainSubstring(textValue, inputValue, extraSections),\n inputValue: searchInput,\n onInputChange: handleInputChange,\n onSelectionChange: handleSelectionChange,\n menuTrigger: 'manual',\n shouldCloseOnBlur: false,\n allowsEmptyCollection: true,\n selectedKey,\n });\n\n const { inputProps, listBoxProps, labelProps } = useComboBox(\n {\n ...props,\n inputRef,\n listBoxRef,\n popoverRef,\n isRequired: required,\n placeholder,\n },\n state,\n );\n\n const handleClearClick = useCallback(() => {\n state.setInputValue('');\n setSelectedKey('');\n send({ type: 'CLEARING', data: { query: '' } });\n }, [send, state]);\n\n const handleDropdownOpen = () => {\n send('OPEN_DROPDOWN');\n openBoxState(state);\n };\n\n const handleWrapperClick = () => {\n if (document.activeElement !== inputRef.current) {\n inputRef.current?.focus();\n }\n handleDropdownOpen();\n };\n\n const handleWrapperMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n if (matches(LinkChooserState.Focused) && event.target !== inputRef.current) {\n event.preventDefault();\n }\n };\n\n const handleDropdownClose = () => {\n let selectedResult = null;\n if (context.query) {\n if (queryMatchesSelection(context.selectedResult, context.query)) {\n selectedResult = context.selectedResult;\n } else {\n selectedResult = createCustomLink(state.inputValue);\n }\n }\n send({ type: 'CLOSE_DROPDOWN', data: { selectedResult } });\n if (selectedResult && selectedKey !== selectedResult.id) {\n setSelectedKey(selectedResult.id);\n }\n closeBoxState(state);\n };\n\n const manualInputProps = useManualComboBoxEventHandlers(\n { inputProps, inputRef, popoverRef, state },\n {\n onOpen: handleDropdownOpen,\n onClose: handleDropdownClose,\n onNavigate: (id) => {\n if (isDefault) {\n send({\n type: 'SELECT_EXTRA_SECTION',\n data: {\n getExtraResultsByQuery: findSection(extraSections, id)?.getResults || null,\n currentSectionId: id.toString(),\n },\n });\n } else {\n send({\n type: 'BACK_TO_DEFAULT',\n data: { getExtraResultsByQuery: null },\n });\n }\n },\n onSelect: handleSelectionChange,\n },\n );\n\n useEffect(() => {\n if (isLoaded(matches) && context.interruptedFetch) {\n send({ type: 'TYPING', data: { query: context.query } });\n }\n }, [context.interruptedFetch, context.query, matches, send, value]);\n\n const { maxHeight } = useDropdownAutoHeight(inputRef, {\n isOpen: matches(LinkChooserState.Focused),\n autoResize: true,\n });\n\n const {\n isOpen,\n selectionManager: { focusedKey },\n } = state;\n\n useEffect(() => {\n if (focusedKey && popoverRef.current && isOpen) {\n const dropdownItem = popoverRef.current.querySelector(`[data-key=\"${focusedKey}\"]`);\n if (dropdownItem) {\n scrollIntoView(popoverRef.current, dropdownItem as HTMLElement);\n }\n }\n }, [focusedKey, isOpen]);\n\n const [flyoutWidth, setFlyoutWidth] = useState(0);\n\n const calcFlyoutWidth = () => {\n setFlyoutWidth(triggerRef.current?.getBoundingClientRect().width || 0);\n };\n\n useEffect(() => {\n calcFlyoutWidth();\n window.addEventListener('resize', calcFlyoutWidth, false);\n }, []);\n\n return (\n <div data-test-id={dataTestId} ref={triggerRef} className=\"tw-w-full tw-font-sans tw-text-s\">\n {!!label && (\n <label\n {...labelProps}\n data-test-id={`${dataTestId}-label`}\n className=\"tw-text-black-80 tw-mb-1 tw-flex tw-align-items-center\"\n >\n {label}\n {required && (\n <span\n data-test-id={`${dataTestId}-label-required`}\n className=\"tw-h-4 tw-text-m tw-text-red-60 dark:tw-text-red-50 tw-ml-1\"\n >\n *\n </span>\n )}\n </label>\n )}\n <SearchInput\n ariaProps={manualInputProps}\n selectedResult={context.selectedResult}\n ref={inputRef}\n disabled={disabled}\n decorator={IconOptions[context.selectedResult?.icon || DEFAULT_ICON]}\n clearable={clearable}\n onClear={handleClearClick}\n machineService={service}\n validation={validation}\n onClick={handleWrapperClick}\n onMouseDown={handleWrapperMouseDown}\n />\n <AnimatePresence>\n {matches(LinkChooserState.Focused) && (\n <motion.div\n style={{\n width: flyoutWidth,\n }}\n className=\"tw-absolute tw-left-auto tw-w-full tw-overflow-hidden tw-p-0 tw-shadow-mid tw-list-none tw-m-0 tw-mt-2 tw-z-20\"\n key=\"content\"\n initial={{ height: 0 }}\n animate={{ height: 'auto' }}\n exit={{ height: 0 }}\n transition={{ ease: [0.04, 0.62, 0.23, 0.98], duration: 0.5 }}\n data-test-id={`${dataTestId}-dropdown`}\n >\n <DismissButton onDismiss={handleDropdownClose} />\n <Popover\n popoverRef={popoverRef}\n isOpen={matches(LinkChooserState.Focused)}\n onClose={handleDropdownClose}\n maxHeight={maxHeight}\n >\n <SearchResultsList\n {...listBoxProps}\n listBoxRef={listBoxRef}\n state={state}\n menuBlocks={searchResultMenuBlocks}\n border={false}\n machineService={service}\n />\n <div data-test-id={`${dataTestId}-action-menu`} className=\"tw-border-t tw-border-black-10\">\n <NavigationMenu machineService={service} state={state} />\n </div>\n </Popover>\n <DismissButton onDismiss={handleDropdownClose} />\n </motion.div>\n )}\n </AnimatePresence>\n <div className=\"tw-my-2\" data-test-id={`${dataTestId}-new-tab`}>\n <Checkbox\n value=\"new-tab\"\n disabled={disabled}\n state={openInNewTab ? CheckboxState.Checked : CheckboxState.Unchecked}\n onChange={onOpenInNewTabChange}\n label=\"Open in New Tab\"\n />\n </div>\n </div>\n );\n};\n"],"names":["IconOptions","IconName","IconDocument","IconDocumentStack","IconLink","IconArrowOutExternal","IconLayersSingle","IconBuildingBlock","DEFAULT_ICON","CUSTOM_LINK_ID","MAX_STORED_ITEMS","QUERIES_STORAGE_KEY","LinkChooser","getGlobalByQuery","getDefaultData","openPreview","clipboardOptions","selectedResult","openInNewTab","ariaLabel","extraSections","label","placeholder","onOpenInNewTabChange","onLinkChange","disabled","clearable","required","validation","Validation","dataTestId","context","matches","value","send","service","useMachine","linkChooserMachine","defaultSection","searchInput","setSearchInput","useState","isDefault","shouldGoBack","searchResultMenuBlocks","useMemo","findSection","decoratedResults","id","title","props","mapToAriaProps","triggerRef","useRef","inputRef","listBoxRef","popoverRef","handleSelectionChange","key","foundItem","item","closeBoxState","state","setSelectedKey","handleInputChange","useCallback","query","selectedKey","_a","useComboBoxState","textValue","inputValue","doesContainSubstring","inputProps","listBoxProps","labelProps","useComboBox","handleClearClick","handleDropdownOpen","openBoxState","handleWrapperClick","handleWrapperMouseDown","event","LinkChooserState","handleDropdownClose","queryMatchesSelection","createCustomLink","manualInputProps","useManualComboBoxEventHandlers","useEffect","isLoaded","maxHeight","useDropdownAutoHeight","isOpen","focusedKey","dropdownItem","scrollIntoView","flyoutWidth","setFlyoutWidth","calcFlyoutWidth","jsxs","jsx","SearchInput","_b","AnimatePresence","motion","DismissButton","Popover","SearchResultsList","NavigationMenu","Checkbox","CheckboxState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LinkChooser.es.js","sources":["../../../src/components/LinkChooser/LinkChooser.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { useComboBox } from '@react-aria/combobox';\nimport { DismissButton } from '@react-aria/overlays';\nimport { scrollIntoView } from '@react-aria/utils';\nimport { useComboBoxState } from '@react-stately/combobox';\nimport { useMachine } from '@xstate/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { type Key, type MouseEvent, type ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { mapToAriaProps } from '@components/ActionMenu/Aria/helper';\nimport { Checkbox, CheckboxState } from '@components/Checkbox/Checkbox';\nimport IconArrowOutExternal from '@foundation/Icon/Generated/IconArrowOutExternal';\nimport IconBuildingBlock from '@foundation/Icon/Generated/IconBuildingBlock';\nimport IconDocument from '@foundation/Icon/Generated/IconDocument';\nimport IconDocumentStack from '@foundation/Icon/Generated/IconDocumentStack';\nimport IconLayersSingle from '@foundation/Icon/Generated/IconLayersSingle';\nimport IconLink from '@foundation/Icon/Generated/IconLink';\nimport { useDropdownAutoHeight } from '@hooks/useDropdownAutoHeight';\nimport { Validation } from '@utilities/validation';\n\nimport { NavigationMenu } from './NavigationMenu';\nimport { Popover } from './Popover';\nimport { SearchInput } from './SearchInput';\nimport { SearchResultsList } from './SearchResultsList';\nimport { defaultSection } from './sections';\nimport { linkChooserMachine } from './state/machine';\nimport { LinkChooserState } from './state/types';\nimport { IconName, type LinkChooserProps, type SearchMenuBlock } from './types';\nimport { decoratedResults, doesContainSubstring, findSection, getDefaultData } from './utils/helpers';\nimport { closeBoxState, isLoaded, openBoxState, queryMatchesSelection, shouldGoBack } from './utils/state';\nimport { createCustomLink } from './utils/transformers';\nimport { useManualComboBoxEventHandlers } from './utils/useManualComboBoxHandlers';\n\nexport const IconOptions: Record<IconName | string, ReactElement> = {\n [IconName.Document]: <IconDocument />,\n [IconName.Library]: <IconDocumentStack />,\n [IconName.Link]: <IconLink />,\n [IconName.External]: <IconArrowOutExternal />,\n [IconName.Template]: <IconLayersSingle />,\n [IconName.Block]: <IconBuildingBlock />,\n};\n\nexport const DEFAULT_ICON = IconName.Link;\nexport const CUSTOM_LINK_ID = 'custom-link';\nexport const MAX_STORED_ITEMS = 5;\nexport const QUERIES_STORAGE_KEY = 'queries';\n\n/**\n * @deprecated Please use the new LinkInput component from `@frontify/guideline-block-settings`.\n */\nexport const LinkChooser = ({\n getGlobalByQuery = getDefaultData,\n openPreview = window.open,\n clipboardOptions = navigator.clipboard,\n selectedResult = null,\n openInNewTab = false,\n ariaLabel = 'Menu',\n extraSections = [],\n label,\n placeholder,\n onOpenInNewTabChange,\n onLinkChange,\n disabled,\n clearable,\n required,\n validation = Validation.Default,\n 'data-test-id': dataTestId = 'link-chooser',\n}: LinkChooserProps): ReactElement => {\n const [{ context, matches, value }, send, service] = useMachine(() =>\n linkChooserMachine.withContext({\n searchResults: [],\n selectedResult,\n query: '',\n interruptedFetch: false,\n getExtraResultsByQuery: null,\n currentSectionId: defaultSection.id,\n extraSections,\n clipboardOptions,\n openPreview,\n getGlobalByQuery,\n onLinkChange,\n }),\n );\n\n const [searchInput, setSearchInput] = useState(selectedResult?.title);\n const isDefault = !shouldGoBack(matches);\n const searchResultMenuBlocks = useMemo(\n () =>\n [\n !isDefault && { id: 'menu-top', menuItems: [findSection(extraSections, context.currentSectionId)] },\n {\n id: 'search',\n menuItems: decoratedResults(context.searchResults),\n },\n isDefault && { id: 'menu-bottom', menuItems: extraSections.map(({ id, title }) => ({ id, title })) },\n ].filter(Boolean),\n [isDefault, extraSections, context.currentSectionId, context.searchResults],\n ) as SearchMenuBlock[];\n\n const props = mapToAriaProps(ariaLabel, searchResultMenuBlocks);\n\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listBoxRef = useRef<HTMLUListElement | null>(null);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n\n const handleSelectionChange = (key: Key) => {\n const foundItem = context.searchResults.find((item) => item.id === key);\n if (foundItem) {\n setSearchInput(foundItem.title);\n send({ type: 'SET_SELECTED_SEARCH_RESULT', data: { selectedResult: foundItem } });\n }\n closeBoxState(state);\n setSelectedKey(key);\n };\n\n const handleInputChange = useCallback(\n (query: string) => {\n setSearchInput(query);\n send({ type: 'TYPING', data: { query } });\n },\n [send],\n );\n\n const [selectedKey, setSelectedKey] = useState<Key | undefined>(context.selectedResult?.id);\n\n const state = useComboBoxState({\n ...props,\n defaultFilter: (textValue, inputValue) => doesContainSubstring(textValue, inputValue, extraSections),\n inputValue: searchInput,\n onInputChange: handleInputChange,\n onSelectionChange: handleSelectionChange,\n menuTrigger: 'manual',\n shouldCloseOnBlur: false,\n allowsEmptyCollection: true,\n selectedKey,\n });\n\n const { inputProps, listBoxProps, labelProps } = useComboBox(\n {\n ...props,\n inputRef,\n listBoxRef,\n popoverRef,\n isRequired: required,\n placeholder,\n },\n state,\n );\n\n const handleClearClick = useCallback(() => {\n state.setInputValue('');\n setSelectedKey('');\n send({ type: 'CLEARING', data: { query: '' } });\n }, [send, state]);\n\n const handleDropdownOpen = () => {\n send('OPEN_DROPDOWN');\n openBoxState(state);\n };\n\n const handleWrapperClick = () => {\n if (document.activeElement !== inputRef.current) {\n inputRef.current?.focus();\n }\n handleDropdownOpen();\n };\n\n const handleWrapperMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n if (matches(LinkChooserState.Focused) && event.target !== inputRef.current) {\n event.preventDefault();\n }\n };\n\n const handleDropdownClose = () => {\n let selectedResult = null;\n if (context.query) {\n if (queryMatchesSelection(context.selectedResult, context.query)) {\n selectedResult = context.selectedResult;\n } else {\n selectedResult = createCustomLink(state.inputValue);\n }\n }\n send({ type: 'CLOSE_DROPDOWN', data: { selectedResult } });\n if (selectedResult && selectedKey !== selectedResult.id) {\n setSelectedKey(selectedResult.id);\n }\n closeBoxState(state);\n };\n\n const manualInputProps = useManualComboBoxEventHandlers(\n { inputProps, inputRef, popoverRef, state },\n {\n onOpen: handleDropdownOpen,\n onClose: handleDropdownClose,\n onNavigate: (id) => {\n if (isDefault) {\n send({\n type: 'SELECT_EXTRA_SECTION',\n data: {\n getExtraResultsByQuery: findSection(extraSections, id)?.getResults || null,\n currentSectionId: id.toString(),\n },\n });\n } else {\n send({\n type: 'BACK_TO_DEFAULT',\n data: { getExtraResultsByQuery: null },\n });\n }\n },\n onSelect: handleSelectionChange,\n },\n );\n\n useEffect(() => {\n if (isLoaded(matches) && context.interruptedFetch) {\n send({ type: 'TYPING', data: { query: context.query } });\n }\n }, [context.interruptedFetch, context.query, matches, send, value]);\n\n const { maxHeight } = useDropdownAutoHeight(inputRef, {\n isOpen: matches(LinkChooserState.Focused),\n autoResize: true,\n });\n\n const {\n isOpen,\n selectionManager: { focusedKey },\n } = state;\n\n useEffect(() => {\n if (focusedKey && popoverRef.current && isOpen) {\n const dropdownItem = popoverRef.current.querySelector(`[data-key=\"${focusedKey}\"]`);\n if (dropdownItem) {\n scrollIntoView(popoverRef.current, dropdownItem as HTMLElement);\n }\n }\n }, [focusedKey, isOpen]);\n\n const [flyoutWidth, setFlyoutWidth] = useState(0);\n\n const calcFlyoutWidth = () => {\n setFlyoutWidth(triggerRef.current?.getBoundingClientRect().width || 0);\n };\n\n useEffect(() => {\n calcFlyoutWidth();\n window.addEventListener('resize', calcFlyoutWidth, false);\n }, []);\n\n return (\n <div data-test-id={dataTestId} ref={triggerRef} className=\"tw-w-full tw-font-sans tw-text-s\">\n {!!label && (\n <label\n {...labelProps}\n data-test-id={`${dataTestId}-label`}\n className=\"tw-text-black-80 tw-mb-1 tw-flex tw-align-items-center\"\n >\n {label}\n {required && (\n <span\n data-test-id={`${dataTestId}-label-required`}\n className=\"tw-h-4 tw-text-m tw-text-red-60 dark:tw-text-red-50 tw-ml-1\"\n >\n *\n </span>\n )}\n </label>\n )}\n <SearchInput\n ariaProps={manualInputProps}\n selectedResult={context.selectedResult}\n ref={inputRef}\n disabled={disabled}\n decorator={IconOptions[context.selectedResult?.icon || DEFAULT_ICON]}\n clearable={clearable}\n onClear={handleClearClick}\n machineService={service}\n validation={validation}\n onClick={handleWrapperClick}\n onMouseDown={handleWrapperMouseDown}\n />\n <AnimatePresence>\n {matches(LinkChooserState.Focused) && (\n <motion.div\n style={{\n width: flyoutWidth,\n }}\n className=\"tw-absolute tw-left-auto tw-w-full tw-overflow-hidden tw-p-0 tw-shadow-mid tw-list-none tw-m-0 tw-mt-2 tw-z-20\"\n key=\"content\"\n initial={{ height: 0 }}\n animate={{ height: 'auto' }}\n exit={{ height: 0 }}\n transition={{ ease: [0.04, 0.62, 0.23, 0.98], duration: 0.5 }}\n data-test-id={`${dataTestId}-dropdown`}\n >\n <DismissButton onDismiss={handleDropdownClose} />\n <Popover\n popoverRef={popoverRef}\n isOpen={matches(LinkChooserState.Focused)}\n onClose={handleDropdownClose}\n maxHeight={maxHeight}\n >\n <SearchResultsList\n {...listBoxProps}\n listBoxRef={listBoxRef}\n state={state}\n menuBlocks={searchResultMenuBlocks}\n border={false}\n machineService={service}\n />\n <div data-test-id={`${dataTestId}-action-menu`} className=\"tw-border-t tw-border-black-10\">\n <NavigationMenu machineService={service} state={state} />\n </div>\n </Popover>\n <DismissButton onDismiss={handleDropdownClose} />\n </motion.div>\n )}\n </AnimatePresence>\n <div className=\"tw-my-2\" data-test-id={`${dataTestId}-new-tab`}>\n <Checkbox\n value=\"new-tab\"\n disabled={disabled}\n state={openInNewTab ? CheckboxState.Checked : CheckboxState.Unchecked}\n onChange={onOpenInNewTabChange}\n label=\"Open in New Tab\"\n />\n </div>\n </div>\n );\n};\n"],"names":["IconOptions","IconName","IconDocument","IconDocumentStack","IconLink","IconArrowOutExternal","IconLayersSingle","IconBuildingBlock","DEFAULT_ICON","CUSTOM_LINK_ID","MAX_STORED_ITEMS","QUERIES_STORAGE_KEY","LinkChooser","getGlobalByQuery","getDefaultData","openPreview","clipboardOptions","selectedResult","openInNewTab","ariaLabel","extraSections","label","placeholder","onOpenInNewTabChange","onLinkChange","disabled","clearable","required","validation","Validation","dataTestId","context","matches","value","send","service","useMachine","linkChooserMachine","defaultSection","searchInput","setSearchInput","useState","isDefault","shouldGoBack","searchResultMenuBlocks","useMemo","findSection","decoratedResults","id","title","props","mapToAriaProps","triggerRef","useRef","inputRef","listBoxRef","popoverRef","handleSelectionChange","key","foundItem","item","closeBoxState","state","setSelectedKey","handleInputChange","useCallback","query","selectedKey","_a","useComboBoxState","textValue","inputValue","doesContainSubstring","inputProps","listBoxProps","labelProps","useComboBox","handleClearClick","handleDropdownOpen","openBoxState","handleWrapperClick","handleWrapperMouseDown","event","LinkChooserState","handleDropdownClose","queryMatchesSelection","createCustomLink","manualInputProps","useManualComboBoxEventHandlers","useEffect","isLoaded","maxHeight","useDropdownAutoHeight","isOpen","focusedKey","dropdownItem","scrollIntoView","flyoutWidth","setFlyoutWidth","calcFlyoutWidth","jsxs","jsx","SearchInput","_b","AnimatePresence","motion","DismissButton","Popover","SearchResultsList","NavigationMenu","Checkbox","CheckboxState"],"mappings":"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"}
|