/* @oracle/oraclejet-preact: undefined */
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var jsxRuntime = require('preact/jsx-runtime');
var compat = require('preact/compat');
var hooks = require('preact/hooks');
require('./LayerHost-3cd73603.js');
require('./StyledCheckbox-9047ed7d.js');

require('./CollectionInteractionContext-f84ff7a1.js');


var ReorderableContext = require('./ReorderableContext-16396e17.js');
var HiddenAccessible = require('./HiddenAccessible-087eb49a.js');
var List = require('./List-afcfa338.js');
var keys = require('./keys-25710458.js');
var useReorderableItem = require('./useReorderableItem-64be8d2b.js');
var classNames = require('./classNames-c14c6ef3.js');
var UNSAFE_ListView_themes_ListViewStyles_css = require('./UNSAFE_ListView/themes/ListViewStyles.css.js');
var useNavigation = require('./useNavigation-fa3f5a50.js');
var mergeProps = require('./mergeProps-e3da7237.js');
var collectionUtils = require('./collectionUtils-f1d3183f.js');
var SelectMenuGroupContext = require('./SelectMenuGroupContext-a349d259.js');
require('preact');
require('./logger-2b636482.js');


require('./hooks/UNSAFE_useTooltip/themes/redwood/TooltipContentVariants.css.js');
require('./tooltipUtils-2bc15136.js');

require('./UNSAFE_Menu/themes/MenuItemStyles.css.js');
require('./UNSAFE_Separator/themes/SeparatorStyles.css.js');


require('./UNSAFE_Menu/themes/redwood/MenuSeparatorVariants.css.js');
var Dropdown = require('./Dropdown-1ba432a8.js');

var useItemAction = require('./useItemAction-66c2387c.js');
var useContextMenuGesture = require('./useContextMenuGesture-530ef8dd.js');
var LoadMoreCollection = require('./LoadMoreCollection-eb1f2603.js');
require('./index-0aa99b92.js');
require('./UNSAFE_Layer/themes/LayerHostStyles.css.js');

require('./Check-1272bb86.js');
require('./Icon-56789beb.js');
require('./size-1914356b.js');
require('./utils-c0efcd5e.js');
require('./themeContract.css-f3d431c6.js');
require('./colorUtils-01f3caa2.js');
require('./_curry1-e8f0d7ea.js');
require('./useTooltip-34accecc.js');
require('./useTooltipControlled-0a95856c.js');
require('./useId-6c0eeb27.js');
require('./useHover-49b0430d.js');
require('./useToggle-3ebba7d8.js');
require('./useFocus-1b288fb9.js');
require('./useTouch-4dec8729.js');
require('./useAnimation-65c0e455.js');
require('./useComponentTheme-082fc8e4.js');
require('./useTestId-4f53d561.js');
require('./useThemeInterpolations-a37b37d9.js');
require('./useColorScheme-f8b1447d.js');
require('./useScale-db16c2b8.js');
require('./theme-dfd6a9fe.js');
require('./Theme-f06687af.js');
require('./mergeInterpolations-6727b536.js');
require('./mergeDeepWithKey-210b024d.js');
require('./_curry3-18677bca.js');
require('./_curry2-c15d89cd.js');
require('./_isObject-28636267.js');
require('./useDensity-0b9fd9ca.js');
require('./unsafeDomAccess-c3a492f0.js');
require('./hooks/UNSAFE_useTooltip/themes/redwood/TooltipContentTheme.js');
require('./hooks/UNSAFE_useTooltip/themes/TooltipContentStyles.css.js');
require('./hooks/UNSAFE_useTooltip/themes/redwood/TooltipContentBaseTheme.css.js');

require('./vanilla-extract-recipes-createRuntimeFn.esm-d1301b2d.js');
require('./UNSAFE_Icon/themes/IconStyle.css.js');
require('./clientHints-c40c5250.js');
require('./CheckboxOff-a3ed334d.js');
require('./CheckboxOn-b5dda28b.js');
require('./CheckboxMixed-a17c8298.js');
require('./UNSAFE_Checkbox/themes/CheckboxIconContract.css.js');
require('./UNSAFE_Checkbox/themes/redwood/CheckboxIconTheme.js');
require('./UNSAFE_Checkbox/themes/CheckboxIconStyles.css.js');

require('./UNSAFE_Checkbox/themes/redwood/CheckboxIconBaseTheme.css.js');

require('./UNSAFE_Checkbox/themes/redwood/CheckboxIconVariants.css.js');

require('./TabbableModeContext-e99d527e.js');
require('./useTabbableMode-dbd254e8.js');


require('./VirtualizedCollection-a90800c7.js');
require('./Collection-e27077ff.js');
require('./useViewportIntersect-2e802bac.js');
require('./FocusTrap-4873a3f2.js');
require('./tabbableUtils-22a50472.js');
require('./head-68d0992f.js');
require('./_arity-c228159c.js');
require('./_isArray-73160ad5.js');
require('./_isString-f4443c9e.js');
require('./FocusTracker-e2ea43c3.js');
require('./PRIVATE_FocusTracker/themes/FocusTrackerStyles.css.js');

require('./useInteractionStyle-c203a8a0.js');
require('./useActive-6770f917.js');
require('./flexitem-fee13e26.js');

require('./vanilla-extract-sprinkles-createRuntimeSprinkles.esm-d68f3e0f.js');
require('./PRIVATE_List/themes/ListStyles.css.js');


require('./Skeleton-8e35c7d1.js');
require('./dimensions-6101ca1f.js');
require('./borders-4b8488cb.js');
require('./UNSAFE_Skeleton/themes/redwood/SkeletonTheme.js');
require('./UNSAFE_Skeleton/themes/SkeletonStyles.css.js');

require('./UNSAFE_Skeleton/themes/redwood/SkeletonBaseTheme.css.js');

require('./UNSAFE_Skeleton/themes/redwood/SkeletonVariants.css.js');
require('./Flex-3a257bc3.js');
require('./boxalignment-e287d370.js');
require('./arrayUtils-7d8dcfc3.js');

require('./flexbox-2cae9a01.js');


require('./ImageVars.css-3fbb1c0b.js');
require('./useTheme-2a034a21.js');
require('./useCollectionInteractionContext-6fc0200e.js');
require('./useSelection-37939f09.js');
require('./useUser-1295b5cb.js');
require('./textSelectionUtils-57082239.js');
require('./useAdditiveSelection-bf845689.js');
require('./Inset-69f359cd.js');
require('./UNSAFE_Inset/themes/InsetStyles.css.js');


require('./useTranslationBundle-12dd087d.js');
require('./dndUtils-21d97036.js');
require('./hooks/PRIVATE_useReorderable/themes/ReorderableItemStyles.css.js');

require('./useCurrentKey-1b9e3382.js');
require('./useReorderableContext-92514102.js');
require('./useCollectionFocusRing-bed0aa16.js');
require('./useTabbableModeSet-5bce852a.js');
require('./Selector-6550b8e0.js');
require('./BaseSelector-2dc69917.js');
require('./PRIVATE_BaseSelector/themes/SelectorStyles.css.js');
require('./Sheet-1d6e8cf8.js');
require('./Modal-b751b643.js');
require('./useModal-0739a528.js');
require('./Layer-b60deb1b.js');
require('./UNSAFE_Layer/themes/LayerStyles.css.js');

require('./UNSAFE_Modal/themes/ModalStyles.css.js');

require('./popupUtils-1d123cbe.js');
require('./WindowOverlay-85d999fa.js');
require('./vanilla-extract-dynamic.esm-2e1b7c25.js');
require('./UNSAFE_WindowOverlay/themes/WindowOverlayStyles.css.js');

require('./UNSAFE_WindowOverlay/themes/WindowOverlayContract.css.js');
require('./UNSAFE_WindowOverlay/themes/redwood/WindowOverlayTheme.js');
require('./UNSAFE_WindowOverlay/themes/redwood/WindowOverlayBaseTheme.css.js');

require('./UNSAFE_WindowOverlay/themes/redwood/WindowOverlayVariants.css.js');
require('./UNSAFE_Sheet/themes/SheetStyles.css.js');

require('./refUtils-a9872e75.js');
require('./useAnimationStatus-8075dc19.js');
require('./animationUtils-54852d03.js');
require('./UNSAFE_Menu/themes/MenuStyles.css.js');
require('./UNSAFE_Menu/themes/DropdownMenuStyles.css.js');

require('./UNSAFE_Menu/themes/MenuSkeletonStyles.css.js');

require('./LiveRegion-62ce9ac7.js');

require('./UNSAFE_Menu/themes/redwood/MenuItemTheme.js');
require('./UNSAFE_Menu/themes/redwood/MenuItemBaseTheme.css.js');

require('./UNSAFE_Menu/themes/redwood/MenuItemVariants.css.js');


require('./Text-056f1ec5.js');
require('./UNSAFE_Text/themes/TextStyles.css.js');

require('./usePress-886180e4.js');
require('./EnvironmentProvider-5f2435e6.js');
require('./LayerManager-c535d963.js');
require('./Floating-79cbe5ad.js');
require('./useFloating-c753a7f9.js');
require('./positionUtils-a780137e.js');
require('./useOutsideClick-dbf3d604.js');
require('./UNSAFE_Floating/themes/redwood/FloatingTheme.js');
require('./UNSAFE_Floating/themes/FloatingStyles.css.js');

require('./UNSAFE_Floating/themes/redwood/FloatingBaseTheme.css.js');

require('./UNSAFE_Floating/themes/redwood/FloatingVariants.css.js');
require('./UNSAFE_Floating/themes/FloatingContract.css.js');
require('./useUnsafeDomElementRef-f22a2f0c.js');

require('./keyboardUtils-b42fe7d5.js');
require('./usePopupAnimation-f3b34413.js');
require('./popupAnimationUtils-dcace427.js');
require('./UNSAFE_Dropdown/themes/dropdownStyles.css.js');

require('./useOutsideMousedown-70f36cca.js');
require('./useEffectEvent-832ffba5.js');

/**
 * A private item that will be used by ReorderableCardFlexView, location TBD (could be moved to PRIVATE_CardFlexView)
 */
function ListViewReorderableItem({ children, dragKey, setDragKey, onReorder, rootRef, itemKey }) {
    const itemRef = hooks.useRef(null);
    const itemStyles = {
        itemOverlayFront: UNSAFE_ListView_themes_ListViewStyles_css.styles.reorderableItemOverlayFront,
        itemOverlayRear: UNSAFE_ListView_themes_ListViewStyles_css.styles.reorderableItemOverlayRear,
        itemDragger: UNSAFE_ListView_themes_ListViewStyles_css.styles.reorderableItemDragger
    };
    const getItem = () => itemRef?.current?.closest(useNavigation.LIST_ITEM_SELECTOR);
    const setTransferData = hooks.useCallback((event) => {
        event.dataTransfer?.setData('text/listview-items-key', JSON.stringify(itemKey));
    }, [itemKey]);
    const { rootProps, isDragged, overlayZoneBeforeProps, overlayZoneAfterProps } = useReorderableItem.useReorderableItem({
        isDisabled: onReorder ? false : true,
        dragKey,
        setDragKey,
        onReorder,
        rootRef,
        ref: itemRef,
        getItem,
        setTransferData,
        itemStyles,
        itemSelector: useNavigation.LIST_ITEM_SELECTOR,
        isVertical: true
    });
    const classes = classNames.classNames([rootProps?.class, UNSAFE_ListView_themes_ListViewStyles_css.styles.reorderableItemDnd]);
    return (jsxRuntime.jsxs("div", { ...rootProps, class: classes, children: [children, !isDragged && keys.isKeyDefined(dragKey) && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { ...overlayZoneBeforeProps }), jsxRuntime.jsx("div", { ...overlayZoneAfterProps })] }))] }));
}
const MemoizeListViewReorderableItem = compat.memo(ListViewReorderableItem, (prev, next) => {
    if (prev && next) {
        return prev.children === next.children && prev.dragKey === next.dragKey;
    }
    return false;
});

const useListViewReorder = ({ onReorder, rootRef, viewportConfig }) => {
    const isReorderEnabled = onReorder != undefined;
    const [dragKey, setDragKey] = hooks.useState(undefined);
    const { reorderProps, reorderContext, reorderInstructionsId, reorderInstructions } = useReorderableItem.useReorderable({
        onReorder,
        rootRef,
        itemSelector: useNavigation.LIST_ITEM_SELECTOR,
        isDisabled: !isReorderEnabled,
        columns: 1
    });
    // ensure the current item is scrolled into view during keyboard reordering,
    // disable that during mouse reordering
    const reorderScrollIntoView = hooks.useRef(false);
    hooks.useEffect(() => {
        if (isReorderEnabled && reorderScrollIntoView.current) {
            const rootElement = rootRef.current;
            const elem = collectionUtils.findElementByKey(rootElement, reorderContext.currentItemKey.current, useNavigation.LIST_ITEM_SELECTOR);
            if (elem) {
                const scroller = viewportConfig?.scrollerRef.current || rootElement;
                // make sure item is visible
                useNavigation.scrollToVisible(elem, scroller, 0);
                reorderScrollIntoView.current = false;
            }
        }
    });
    const reorderItemProps = hooks.useMemo(() => {
        return { dragKey, setDragKey, onReorder, rootRef };
    }, [dragKey, onReorder, rootRef]);
    if (!isReorderEnabled) {
        return {
            reorderProps,
            reorderContext,
            reorderInstructionsId,
            reorderInstructions
        };
    }
    const handleKeyDown = (event) => {
        // listview only do keyboard reordering with arrow up/down keys
        if (isReorderEnabled &&
            (event.key === 'ArrowUp' || event.key === 'ArrowDown') &&
            (event.metaKey || event.ctrlKey) &&
            event.shiftKey) {
            reorderScrollIntoView.current = true;
            reorderProps.onKeyDown?.(event);
        }
    };
    const handleDragOver = (event) => {
        if (dragKey !== undefined) {
            reorderScrollIntoView.current = false;
            collectionUtils.dragToScroll(event, dragKey !== undefined, rootRef.current);
        }
    };
    const reorderEventProps = mergeProps.mergeProps({ onKeyDown: handleKeyDown, onDragOver: handleDragOver });
    return {
        reorderProps: reorderEventProps,
        reorderItemProps,
        reorderContext,
        reorderInstructionsId,
        reorderInstructions
    };
};

/**
 * The internal component used to render a custom context menu
 */
function ListViewContextMenu({ contextMenuConfig, testId, contextMenuContext, ...menuProps }) {
    const accessibleLabel = contextMenuConfig.accessibleLabel;
    let menuItems;
    // Important to call items renderer only when isOpen is true so we know there is a contextMenuContext
    if (menuProps.isOpen) {
        menuItems = contextMenuConfig.itemsRenderer(contextMenuContext);
        if (Dropdown.isMenuChildrenFalsy(menuItems)) {
            return null;
        }
    }
    else {
        menuItems = null;
    }
    return (jsxRuntime.jsx(SelectMenuGroupContext.Menu, { ...menuProps, ...(accessibleLabel && {
            'aria-label': accessibleLabel
        }), testId: testId, children: menuItems }));
}

const TOUCH_OFFSET_VALUE = 40;
const menuPropGestureStates = {
    mouse: {
        initialFocus: 'menu',
        placement: 'bottom-start',
        offsetValue: 0
    },
    keyboard: {
        initialFocus: 'firstItem',
        placement: 'bottom-start',
        offsetValue: 0
    },
    touch: {
        initialFocus: 'firstItem',
        placement: 'end',
        offsetValue: TOUCH_OFFSET_VALUE
    }
};
const initialMenuProps = {
    isOpen: false,
    initialFocus: 'menu',
    placement: 'bottom-start',
    offsetValue: 0,
    anchorRef: { current: null }
};
const useListViewContextMenu = (dataState, contextMenuConfig, scrollListRef, updateCurrentKey) => {
    /*Context Menu section
     TODO: A version of context Menu listview will be merged using useContextMenuGesture instead. Once it's merged we
     can go back to this to create a hook or utility that could be share among all collection comps. JET-60320
    */
    /*
    Steps to open a menu:
      1.- useContextMenu handler is called when menu is supposed to be opened.
      2.- We set contextMenuContext when contextMenuRenderer is called.
      3.- We dispatch opening the menu with the correct anchor.
      5.- Menu receives updated props and updated contextMenuContext.
      6.- Menu is opened.
  
      */
    //Supposed to be updated when menu is about to be opened
    //We set an initial key value for the context menu context, to allow user use object destructuring inside the
    //contextMenuRenderer. It doesn't matter if the key is not correct at the initial rendering since menu starts
    //being closed always
    const [contextMenuContext, setContextMenuContext] = hooks.useState();
    const [menuProps, setMenuProps] = hooks.useState(initialMenuProps);
    const currentKeyRef = hooks.useRef();
    const notifyCurrentKeyChanged = (detail) => {
        currentKeyRef.current = detail.value;
    };
    const { triggerProps } = useContextMenuGesture.useContextMenuGesture(({ gesture, anchor, target }) => {
        let anchorBasedOnGesture = anchor;
        if (gesture === 'keyboard') {
            //We find the element where the position of the menu is going to be based of
            const elem = collectionUtils.findElementByKey(scrollListRef.current, currentKeyRef.current, useNavigation.LIST_ITEM_SELECTOR);
            //We set the correct anchor
            anchorBasedOnGesture = elem ? elem : anchor;
            const context = useItemAction.findItemContext(currentKeyRef.current, dataState);
            setContextMenuContext(context);
        }
        else {
            //We search for the key using the target of the event
            const key = collectionUtils.keyExtractor(target, useNavigation.LIST_ITEM_SELECTOR);
            const context = useItemAction.findItemContext(key, dataState);
            setContextMenuContext(context);
            //We update the key so when we close logical focus is on the correct item
            updateCurrentKey(key);
        }
        setMenuProps({
            ...menuPropGestureStates[gesture],
            anchorRef: { current: anchorBasedOnGesture },
            isOpen: true
        });
    }, {
        isDisabled: !contextMenuConfig //If there is no a context menu renderer we disable the hook
    });
    const handleCloseContextMenu = hooks.useCallback((detail) => {
        /*
        TODO: Focus ring should be visible when context menu was closed because of selecting an item using keyboard,
        but should not be visible when the selection was done using mouse or touch. This would probably means menu
        onClose API is going to be changed a little bit so we can satisfy this requirement. JET-62372
        */
        //Focus has to be set on the current target that was obtained
        //during context menu gesture when menu is dismissed or item is "selected"
        if (detail.reason === 'dismissed' || detail.reason === 'itemAction') {
            scrollListRef.current?.focus({ preventScroll: true });
        }
        // We close the menu.The only prop that matters here is isOpen
        setMenuProps({ ...initialMenuProps });
    }, [scrollListRef]);
    return {
        menuProps: { ...menuProps, onClose: handleCloseContextMenu },
        onClose: handleCloseContextMenu,
        contextMenuContext: contextMenuContext,
        triggerProps,
        notifyCurrentKeyChanged
    };
};

/**
 * This hook handles the currentItemOverride passing to PRIVATE_List layer.
 *
 * If the app provided new value for 'currentItemOverride', we pass that down to PRIVATE_List layer;
 * otherwise, we will pass down the value of internal override, which would be the value
 * updated by useListViewContextMenu hook
 *
 * @param currentItemOverride
 */
const useListViewCurrentItemOverride = (currentItemOverride) => {
    // the override that will be passed down to PRIVATE_List layer
    const listOverrideRef = hooks.useRef();
    // track the currentItemOverride attribute set by app
    const appOverrideRef = hooks.useRef();
    if (appOverrideRef.current !== currentItemOverride) {
        appOverrideRef.current = currentItemOverride;
        listOverrideRef.current = currentItemOverride;
    }
    // track the internal override updated by useListViewContextMenu hook
    // we can just update ref here since the hook will trigger a state update for its context, which will trigger a rerender
    const updateCurrentItemOverride = hooks.useCallback((key) => {
        listOverrideRef.current = { rowKey: key };
    }, []);
    return {
        currentItemOverride: listOverrideRef.current,
        updateCurrentItemOverride
    };
};

/**
 * A list view displays data items as a list or a grid with highly interactive features.
 */
const ListView = compat.forwardRef(({ children, ...props }, ref) => {
    const { contextMenuConfig } = props;
    const listRef = hooks.useRef(null);
    const { currentItemOverride, updateCurrentItemOverride } = useListViewCurrentItemOverride(props.currentItemOverride);
    const dataMetadata = props.data
        ? props.data.map((aData) => {
            const key = props.getRowKey(aData);
            return { data: aData, metadata: { key } };
        })
        : null;
    const loadRange = props.onLoadMore ? props.onLoadMore : () => { };
    const dataState = dataMetadata
        ? {
            offset: 0,
            data: dataMetadata,
            sizePrecision: props.hasMore ? 'atLeast' : 'exact',
            totalSize: dataMetadata.length
        }
        : null;
    hooks.useImperativeHandle(ref, () => ({
        getScrollPosition: () => {
            if (listRef.current) {
                return List.getScrollPosition(listRef.current);
            }
            return { y: 0 };
        },
        focus: () => {
            if (listRef.current) {
                listRef.current.focus();
            }
        }
    }));
    /**
     * Reorder Section
     */
    const isReorderEnabled = props.onReorder != undefined;
    const { reorderProps, reorderItemProps, reorderContext, reorderInstructionsId, reorderInstructions } = useListViewReorder({
        onReorder: props.onReorder,
        rootRef: listRef,
        viewportConfig: props.viewportConfig
    });
    const { triggerProps, menuProps, contextMenuContext, notifyCurrentKeyChanged } = useListViewContextMenu(dataState, contextMenuConfig, listRef, updateCurrentItemOverride);
    const onPersistCurrentItem = (detail) => {
        props.onPersistCurrentItem?.(detail);
        notifyCurrentKeyChanged(detail);
    };
    const reorderableItemRenderer = hooks.useCallback((context) => (jsxRuntime.jsx(MemoizeListViewReorderableItem, { ...reorderItemProps, itemKey: context.metadata.key, children: children(context) })), [children, reorderItemProps]);
    if (isReorderEnabled && reorderItemProps) {
        return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(ReorderableContext.ReorderableContext.Provider, { value: reorderContext, children: [jsxRuntime.jsx(List.List, { ...props, "aria-describedby": reorderInstructionsId, contextMenuTriggerProps: triggerProps, reorderProps: reorderProps, onLoadRange: loadRange, scrollerRef: listRef, data: dataState, currentItemOverride: currentItemOverride, onPersistCurrentItem: onPersistCurrentItem, children: reorderableItemRenderer }), jsxRuntime.jsx("span", { id: reorderInstructionsId, children: jsxRuntime.jsx(HiddenAccessible.HiddenAccessible, { children: reorderInstructions }) })] }), contextMenuConfig && (jsxRuntime.jsx(ListViewContextMenu, { ...menuProps, testId: props.testId ? props.testId + '-menu' : undefined, contextMenuConfig: contextMenuConfig, contextMenuContext: contextMenuContext }))] }));
    }
    const customInitialSkeleton = (skeletonRenderer) => {
        return (jsxRuntime.jsx(List.SkeletonContainer, { minimumCount: 25, children: (index) => {
                const context = {
                    loadingStatus: 'initial',
                    index: index
                };
                return skeletonRenderer(context);
            } }));
    };
    const customLoadMoreSkeleton = (skeletonRenderer) => {
        return (jsxRuntime.jsx("div", { class: LoadMoreCollection.LOADMORE_STYLE_CLASS, children: jsxRuntime.jsx(List.SkeletonContainer, { minimumCount: 3, children: (index) => {
                    const context = {
                        loadingStatus: 'loadMore',
                        index: index
                    };
                    return skeletonRenderer(context);
                } }) }));
    };
    return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(List.List, { ...props, loadingIndicator: props.skeletonRenderer ? customInitialSkeleton(props.skeletonRenderer) : undefined, loadMoreIndicator: props.skeletonRenderer ? customLoadMoreSkeleton(props.skeletonRenderer) : undefined, onLoadRange: loadRange, scrollerRef: listRef, data: dataState, contextMenuTriggerProps: triggerProps, currentItemOverride: currentItemOverride, onPersistCurrentItem: onPersistCurrentItem, children: children }), contextMenuConfig && (jsxRuntime.jsx(ListViewContextMenu, { ...menuProps, contextMenuConfig: contextMenuConfig, contextMenuContext: contextMenuContext, testId: props.testId ? props.testId + '-menu' : undefined }))] }));
});

exports.ListView = ListView;
//# sourceMappingURL=UNSAFE_ListView.js.map
