{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;CAUC;;;;;;;;;;;;;;;AA4CD,MAAM,0CAAoB;AAC1B,MAAM,0CAAoB;AAKnB,MAAM,yDAAc,CAAA,GAAA,sCAAI,EAAE,UAAU,CAAC,SAAS,YACnD,KAAkC,EAClC,GAAW;IAEX,QAAQ,CAAA,GAAA,0CAAe,EAAE;IACzB,IAAI,QACF,OAAO,kBACP,WAAW,YACX,QAAQ,YACR,QAAQ,cACR,UAAU,YACV,QAAQ,oBACR,gBAAgB,EAChB,GAAG,YACJ,GAAG;IAEJ,oEAAoE;IACpE,IAAI,aAAkC,EAAE;IACxC,CAAA,GAAA,sCAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO;QACvC,kBAAI,CAAA,GAAA,sCAAI,EAAE,cAAc,CAAC,QAAQ;YAC/B,IAAI,MAAM,GAAG,IAAI,MACf,sBAAQ,CAAA,GAAA,sCAAI,EAAE,YAAY,CAAC,OAAO;gBAAC,KAAK;YAAK;YAE/C,WAAW,IAAI,CAAC;QAClB;IACF;IAEA,IAAI,SAAS,CAAA,GAAA,mCAAQ,EAAE;IACvB,IAAI,UAAU,CAAA,GAAA,mBAAK,EAAoB;IAEvC,IAAI,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,yDAAa,EAAE,WAAW,MAAM;IAEtE,IAAI,YAAC,QAAQ,EAAC,GAAG,CAAA,GAAA,6CAAa,EAAE;IAChC,IAAI,cAAC,UAAU,EAAC,GAAG,CAAA,GAAA,uCAAY,EAAE;IAEjC,IAAI,iBAAiB,CAAA,GAAA,wBAAU,EAAE;QAC/B,IAAI,sBAAsB,CAAC;YACzB,+BAA+B;YAC/B,IAAI,cAAuC,QAAQ,OAAO;YAC1D,IAAI,CAAC,aACH,OAAO;YAGT,IAAI,YAAY,MAAM,IAAI,CAAC,YAAY,QAAQ;YAC/C,IAAI,UAAU,MAAM,IAAI,GACtB,OAAO;YAET,IAAI,iBAAiB,YAAY,WAAW;YAC5C,IAAI,gBAAgB,WAAW,MAAM,GAAG;YACxC,IAAI,kBAAkB;YACtB,IAAI,kBAAkB;YACtB,IAAI,kBAAkB;YAEtB,IAAI,UAAU;gBACZ,mBAAmB,AAAC,UAAU,KAAK,GAAqB,WAAW;gBACnE;YACF;YAEA,IAAI,eAAe;gBACjB,mBAAmB,AAAC,UAAU,KAAK,GAAqB,WAAW;gBACnE;YACF;YAEA,IAAI,YAAY,mBAAmB,gBACjC;YAGF,oDAAoD;YACpD,IAAI,aAAa;gBACf,UAAU,GAAG;gBACb;YACF,OACE,IAAI,UAAU,MAAM,GAAG,GAAG;gBACxB,iEAAiE;gBACjE,IAAI,OAAO,UAAU,GAAG;gBACxB,KAAK,KAAK,CAAC,QAAQ,GAAG;gBAEtB,mBAAmB,KAAK,WAAW;gBACnC,IAAI,kBAAkB,gBACpB;gBAGF,KAAK,KAAK,CAAC,QAAQ,GAAG;YACxB;YAGF,KAAK,IAAI,cAAc,UAAU,OAAO,GAAI;gBAC1C,mBAAmB,WAAW,WAAW;gBACzC,IAAI,kBAAkB,gBACpB;YAEJ;YAEA,OAAO,KAAK,GAAG,CAAC,yCAAmB,KAAK,GAAG,CAAC,iBAAiB;QAC/D;QAEA,gBAAgB;YACd,4BAA4B;YAC5B,MAAM,WAAW,MAAM;YAEvB,kDAAkD;YAClD,IAAI,kBAAkB,oBAAoB,WAAW,MAAM;YAC3D,MAAM;YAEN,8DAA8D;YAC9D,kDAAkD;YAClD,IAAI,kBAAkB,WAAW,MAAM,IAAI,kBAAkB,GAC3D,MAAM,oBAAoB;QAE9B;IACF,GAAG;QAAC,WAAW,MAAM;QAAE;QAAiB;QAAU;KAAY;IAE9D,CAAA,GAAA,+DAAgB,EAAE;QAAC,KAAK;QAAQ,UAAU;IAAc;IAExD,IAAI,eAAe,CAAA,GAAA,mBAAK,EAA0B;IAClD,CAAA,GAAA,2DAAc,EAAE;QACd,IAAI,aAAa,aAAa,OAAO,EAAE;YACrC,aAAa,OAAO,GAAG;YACvB;QACF;IACF;IAEA,IAAI,WAAW;IACf,IAAI,WAAW,MAAM,GAAG,cAAc;QACpC,IAAI,eAAe,UAAU,CAAC,WAAW,MAAM,GAAG,EAAE;QACpD,IAAI,cAAc,aAAa,GAAG,IAAI,WAAW,MAAM,GAAG;QAC1D,IAAI,eAAe,CAAC;YAClB,qDAAqD;YACrD,IAAI,QAAQ,eAAe,UACzB,SAAS;QAEb;QAEA,IAAI,yBACF,0DAAC,CAAA,GAAA,wCAAa;YAAE,KAAI;YAAO,QAAA;yBACzB,0DAAC,CAAA,GAAA,qCAAU,uBACT,0DAAC,CAAA,GAAA,sCAAW;YACV,kBAAkB,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;YACrC,cAAW;YACX,SAAA;YACA,YAAY;yBACZ,0DAAC,CAAA,GAAA,gEAAe,yBAElB,0DAAC,CAAA,GAAA,8BAAG;YAAE,eAAc;YAAS,cAAc;gBAAC;aAAY;YAAE,UAAU;WACjE;QAMT,WAAW;YAAC;SAAS;QACrB,IAAI,cAAc;eAAI;SAAW;QACjC,IAAI,WAAW;QACf,IAAI,YAAY,eAAe,GAAG;YAChC,IAAI,WAAW,YAAY,KAAK;YAChC,IAAI,UACF,SAAS,OAAO,CAAC;YAEnB;QACF;QACA,SAAS,IAAI,IAAI,YAAY,KAAK,CAAC,CAAC;IACtC;IAEA,IAAI,YAAY,SAAS,MAAM,GAAG;IAClC,IAAI,kBAAkB,SAAS,GAAG,CAAC,CAAC,OAAO;QACzC,IAAI,YAAY,UAAU;QAC1B,IAAI,MAAM,MAAM,GAAG,IAAI;QACvB,IAAI,UAAU;YACZ,IAAI,UACF,SAAS;QAEb;QAEA,qBACE,0DAAC;YAAG,KAAK;YAAO,WAAW,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;yBAC5C,0DAAC,CAAA,GAAA,wCAAa;YACX,GAAG,MAAM,KAAK;YACf,KAAK;YACL,WAAW;YACX,YAAY;YACZ,SAAS;YACT,WAAW,aAAa;WACvB,MAAM,KAAK,CAAC,QAAQ;IAI7B;IAEA,qBACE,0DAAC;QAAK,GAAG,UAAU;QAAG,GAAG,QAAQ;QAAE,KAAK;qBACtC,0DAAC;QACC,KAAK;QACL,WAAW,CAAA,GAAA,oCAAS,EAClB,CAAA,GAAA,mDAAK,GACL,wBACA;YACE,+BAA+B,SAAS;YACxC,gCAAgC,SAAS;YACzC,mCAAmC;YACnC,kCAAkC;YAClC,eAAe;QACjB,GACA,WAAW,SAAS;OAErB;AAIT","sources":["packages/@adobe/react-spectrum/src/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["/*\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 */\nimport {ActionButton} from '../button/ActionButton';\n\nimport {AriaBreadcrumbsProps, useBreadcrumbs} from 'react-aria/useBreadcrumbs';\nimport {BreadcrumbItem} from './BreadcrumbItem';\nimport {classNames} from '../utils/classNames';\nimport {DOMRef, ItemProps, Key, StyleProps} from '@react-types/shared';\nimport FolderBreadcrumb from '@spectrum-icons/ui/FolderBreadcrumb';\nimport {Menu} from '../menu/Menu';\nimport {MenuTrigger} from '../menu/MenuTrigger';\nimport React, {ReactElement, useCallback, useRef} from 'react';\nimport styles from '@adobe/spectrum-css-temp/components/breadcrumb/vars.css';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useProviderProps} from '../provider/Provider';\nimport {useResizeObserver} from 'react-aria/private/utils/useResizeObserver';\nimport {useStyleProps} from '../utils/styleProps';\nimport {useValueEffect} from 'react-aria/private/utils/useValueEffect';\n\nexport interface SpectrumBreadcrumbsProps<T> extends AriaBreadcrumbsProps, StyleProps {\n  /** The breadcrumb items. */\n  children: ReactElement<ItemProps<T>> | ReactElement<ItemProps<T>>[];\n  /** Whether the Breadcrumbs are disabled. */\n  isDisabled?: boolean;\n  /** Called when an item is acted upon (usually selection via press). */\n  onAction?: (key: Key) => void;\n  /**\n   * Size of the Breadcrumbs including spacing and layout.\n   *\n   * @default 'L'\n   */\n  size?: 'S' | 'M' | 'L';\n  /** Whether to always show the root item if the items are collapsed. */\n  showRoot?: boolean;\n  /**\n   * Whether to place the last Breadcrumb item onto a new line.\n   */\n  isMultiline?: boolean;\n  /**\n   * Whether to autoFocus the last Breadcrumb item when the Breadcrumbs render.\n   */\n  autoFocusCurrent?: boolean;\n}\n\nconst MIN_VISIBLE_ITEMS = 1;\nconst MAX_VISIBLE_ITEMS = 4;\n\n/**\n * Breadcrumbs show hierarchy and navigational context for a user’s location within an application.\n */\nexport const Breadcrumbs = React.forwardRef(function Breadcrumbs<T>(\n  props: SpectrumBreadcrumbsProps<T>,\n  ref: DOMRef\n) {\n  props = useProviderProps(props);\n  let {\n    size = 'L',\n    isMultiline,\n    children,\n    showRoot,\n    isDisabled,\n    onAction,\n    autoFocusCurrent,\n    ...otherProps\n  } = props;\n\n  // Not using React.Children.toArray because it mutates the key prop.\n  let childArray: ReactElement<any>[] = [];\n  React.Children.forEach(children, (child, index) => {\n    if (React.isValidElement(child)) {\n      if (child.key == null) {\n        child = React.cloneElement(child, {key: index});\n      }\n      childArray.push(child);\n    }\n  });\n\n  let domRef = useDOMRef(ref);\n  let listRef = useRef<HTMLUListElement>(null);\n\n  let [visibleItems, setVisibleItems] = useValueEffect(childArray.length);\n\n  let {navProps} = useBreadcrumbs(props);\n  let {styleProps} = useStyleProps(otherProps);\n\n  let updateOverflow = useCallback(() => {\n    let computeVisibleItems = (visibleItems: number): number => {\n      // Refs can be null at runtime.\n      let currListRef: HTMLUListElement | null = listRef.current;\n      if (!currListRef) {\n        return visibleItems;\n      }\n\n      let listItems = Array.from(currListRef.children) as HTMLLIElement[];\n      if (listItems.length <= 0) {\n        return visibleItems;\n      }\n      let containerWidth = currListRef.offsetWidth;\n      let isShowingMenu = childArray.length > visibleItems;\n      let calculatedWidth = 0;\n      let newVisibleItems = 0;\n      let maxVisibleItems = MAX_VISIBLE_ITEMS;\n\n      if (showRoot) {\n        calculatedWidth += (listItems.shift() as HTMLLIElement).offsetWidth;\n        newVisibleItems++;\n      }\n\n      if (isShowingMenu) {\n        calculatedWidth += (listItems.shift() as HTMLLIElement).offsetWidth;\n        maxVisibleItems--;\n      }\n\n      if (showRoot && calculatedWidth >= containerWidth) {\n        newVisibleItems--;\n      }\n\n      // TODO: what if multiline and only one breadcrumb??\n      if (isMultiline) {\n        listItems.pop();\n        newVisibleItems++;\n      } else {\n        if (listItems.length > 0) {\n          // Ensure the last breadcrumb isn't truncated when we measure it.\n          let last = listItems.pop() as HTMLLIElement;\n          last.style.overflow = 'visible';\n\n          calculatedWidth += last.offsetWidth;\n          if (calculatedWidth < containerWidth) {\n            newVisibleItems++;\n          }\n\n          last.style.overflow = '';\n        }\n      }\n\n      for (let breadcrumb of listItems.reverse()) {\n        calculatedWidth += breadcrumb.offsetWidth;\n        if (calculatedWidth < containerWidth) {\n          newVisibleItems++;\n        }\n      }\n\n      return Math.max(MIN_VISIBLE_ITEMS, Math.min(maxVisibleItems, newVisibleItems));\n    };\n\n    setVisibleItems(function* () {\n      // Update to show all items.\n      yield childArray.length;\n\n      // Measure, and update to show the items that fit.\n      let newVisibleItems = computeVisibleItems(childArray.length);\n      yield newVisibleItems;\n\n      // If the number of items is less than the number of children,\n      // then update again to ensure that the menu fits.\n      if (newVisibleItems < childArray.length && newVisibleItems > 1) {\n        yield computeVisibleItems(newVisibleItems);\n      }\n    });\n  }, [childArray.length, setVisibleItems, showRoot, isMultiline]);\n\n  useResizeObserver({ref: domRef, onResize: updateOverflow});\n\n  let lastChildren = useRef<typeof children | null>(null);\n  useLayoutEffect(() => {\n    if (children !== lastChildren.current) {\n      lastChildren.current = children;\n      updateOverflow();\n    }\n  });\n\n  let contents = childArray;\n  if (childArray.length > visibleItems) {\n    let selectedItem = childArray[childArray.length - 1];\n    let selectedKey = selectedItem.key ?? childArray.length - 1;\n    let onMenuAction = (key: Key) => {\n      // Don't fire onAction when clicking on the last item\n      if (key !== selectedKey && onAction) {\n        onAction(key);\n      }\n    };\n\n    let menuItem = (\n      <BreadcrumbItem key=\"menu\" isMenu>\n        <MenuTrigger>\n          <ActionButton\n            UNSAFE_className={classNames(styles, 'spectrum-Breadcrumbs-actionButton')}\n            aria-label=\"…\"\n            isQuiet\n            isDisabled={isDisabled}>\n            <FolderBreadcrumb />\n          </ActionButton>\n          <Menu selectionMode=\"single\" selectedKeys={[selectedKey]} onAction={onMenuAction}>\n            {childArray}\n          </Menu>\n        </MenuTrigger>\n      </BreadcrumbItem>\n    );\n\n    contents = [menuItem];\n    let breadcrumbs = [...childArray];\n    let endItems = visibleItems;\n    if (showRoot && visibleItems > 1) {\n      let rootItem = breadcrumbs.shift();\n      if (rootItem) {\n        contents.unshift(rootItem);\n      }\n      endItems--;\n    }\n    contents.push(...breadcrumbs.slice(-endItems));\n  }\n\n  let lastIndex = contents.length - 1;\n  let breadcrumbItems = contents.map((child, index) => {\n    let isCurrent = index === lastIndex;\n    let key = child.key ?? index;\n    let onPress = () => {\n      if (onAction) {\n        onAction(key);\n      }\n    };\n\n    return (\n      <li key={index} className={classNames(styles, 'spectrum-Breadcrumbs-item')}>\n        <BreadcrumbItem\n          {...child.props}\n          key={key}\n          isCurrent={isCurrent}\n          isDisabled={isDisabled}\n          onPress={onPress}\n          autoFocus={isCurrent && autoFocusCurrent}>\n          {child.props.children}\n        </BreadcrumbItem>\n      </li>\n    );\n  });\n\n  return (\n    <nav {...styleProps} {...navProps} ref={domRef}>\n      <ul\n        ref={listRef}\n        className={classNames(\n          styles,\n          'spectrum-Breadcrumbs',\n          {\n            'spectrum-Breadcrumbs--small': size === 'S',\n            'spectrum-Breadcrumbs--medium': size === 'M',\n            'spectrum-Breadcrumbs--multiline': isMultiline,\n            'spectrum-Breadcrumbs--showRoot': showRoot,\n            'is-disabled': isDisabled\n          },\n          styleProps.className\n        )}>\n        {breadcrumbItems}\n      </ul>\n    </nav>\n  );\n});\n"],"names":[],"version":3,"file":"Breadcrumbs.cjs.map"}