UNPKG

@base-ui-components/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

170 lines (169 loc) 7.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VERTICAL_KEYS_WITH_EXTRA_KEYS = exports.VERTICAL_KEYS = exports.SHIFT = exports.MODIFIER_KEYS = exports.META = exports.HORIZONTAL_KEYS_WITH_EXTRA_KEYS = exports.HORIZONTAL_KEYS = exports.HOME = exports.END = exports.CONTROL = exports.COMPOSITE_KEYS = exports.ARROW_UP = exports.ARROW_RIGHT = exports.ARROW_LEFT = exports.ARROW_KEYS = exports.ARROW_DOWN = exports.ALT = exports.ALL_KEYS = void 0; Object.defineProperty(exports, "createGridCellMap", { enumerable: true, get: function () { return _utils.createGridCellMap; } }); Object.defineProperty(exports, "findNonDisabledListIndex", { enumerable: true, get: function () { return _utils.findNonDisabledListIndex; } }); Object.defineProperty(exports, "getGridCellIndexOfCorner", { enumerable: true, get: function () { return _utils.getGridCellIndexOfCorner; } }); Object.defineProperty(exports, "getGridCellIndices", { enumerable: true, get: function () { return _utils.getGridCellIndices; } }); Object.defineProperty(exports, "getGridNavigatedIndex", { enumerable: true, get: function () { return _utils.getGridNavigatedIndex; } }); Object.defineProperty(exports, "getMaxListIndex", { enumerable: true, get: function () { return _utils.getMaxListIndex; } }); Object.defineProperty(exports, "getMinListIndex", { enumerable: true, get: function () { return _utils.getMinListIndex; } }); Object.defineProperty(exports, "isIndexOutOfListBounds", { enumerable: true, get: function () { return _utils.isIndexOutOfListBounds; } }); Object.defineProperty(exports, "isListIndexDisabled", { enumerable: true, get: function () { return _utils.isListIndexDisabled; } }); exports.isNativeInput = isNativeInput; exports.scrollIntoViewIfNeeded = scrollIntoViewIfNeeded; Object.defineProperty(exports, "stopEvent", { enumerable: true, get: function () { return _utils.stopEvent; } }); var _utils = require("../floating-ui-react/utils"); const ARROW_UP = exports.ARROW_UP = 'ArrowUp'; const ARROW_DOWN = exports.ARROW_DOWN = 'ArrowDown'; const ARROW_LEFT = exports.ARROW_LEFT = 'ArrowLeft'; const ARROW_RIGHT = exports.ARROW_RIGHT = 'ArrowRight'; const HOME = exports.HOME = 'Home'; const END = exports.END = 'End'; const HORIZONTAL_KEYS = exports.HORIZONTAL_KEYS = new Set([ARROW_LEFT, ARROW_RIGHT]); const HORIZONTAL_KEYS_WITH_EXTRA_KEYS = exports.HORIZONTAL_KEYS_WITH_EXTRA_KEYS = new Set([ARROW_LEFT, ARROW_RIGHT, HOME, END]); const VERTICAL_KEYS = exports.VERTICAL_KEYS = new Set([ARROW_UP, ARROW_DOWN]); const VERTICAL_KEYS_WITH_EXTRA_KEYS = exports.VERTICAL_KEYS_WITH_EXTRA_KEYS = new Set([ARROW_UP, ARROW_DOWN, HOME, END]); const ARROW_KEYS = exports.ARROW_KEYS = new Set([...HORIZONTAL_KEYS, ...VERTICAL_KEYS]); const ALL_KEYS = exports.ALL_KEYS = new Set([...ARROW_KEYS, HOME, END]); const COMPOSITE_KEYS = exports.COMPOSITE_KEYS = new Set([ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, HOME, END]); const SHIFT = exports.SHIFT = 'Shift'; const CONTROL = exports.CONTROL = 'Control'; const ALT = exports.ALT = 'Alt'; const META = exports.META = 'Meta'; const MODIFIER_KEYS = exports.MODIFIER_KEYS = new Set([SHIFT, CONTROL, ALT, META]); function isNativeInput(element) { if (element instanceof HTMLInputElement && element.selectionStart != null) { return true; } if (element instanceof HTMLTextAreaElement) { return true; } return false; } function scrollIntoViewIfNeeded(scrollContainer, element, direction, orientation) { if (!scrollContainer || !element || !element.scrollTo) { return; } let targetX = scrollContainer.scrollLeft; let targetY = scrollContainer.scrollTop; const isOverflowingX = scrollContainer.clientWidth < scrollContainer.scrollWidth; const isOverflowingY = scrollContainer.clientHeight < scrollContainer.scrollHeight; if (isOverflowingX && orientation !== 'vertical') { const elementOffsetLeft = getOffset(scrollContainer, element, 'left'); const containerStyles = getStyles(scrollContainer); const elementStyles = getStyles(element); if (direction === 'ltr') { if (elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight > scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight) { // overflow to the right, scroll to align right edges targetX = elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight - scrollContainer.clientWidth + containerStyles.scrollPaddingRight; } else if (elementOffsetLeft - elementStyles.scrollMarginLeft < scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft) { // overflow to the left, scroll to align left edges targetX = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft; } } if (direction === 'rtl') { if (elementOffsetLeft - elementStyles.scrollMarginRight < scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft) { // overflow to the left, scroll to align left edges targetX = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft; } else if (elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight > scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight) { // overflow to the right, scroll to align right edges targetX = elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight - scrollContainer.clientWidth + containerStyles.scrollPaddingRight; } } } if (isOverflowingY && orientation !== 'horizontal') { const elementOffsetTop = getOffset(scrollContainer, element, 'top'); const containerStyles = getStyles(scrollContainer); const elementStyles = getStyles(element); if (elementOffsetTop - elementStyles.scrollMarginTop < scrollContainer.scrollTop + containerStyles.scrollPaddingTop) { // overflow upwards, align top edges targetY = elementOffsetTop - elementStyles.scrollMarginTop - containerStyles.scrollPaddingTop; } else if (elementOffsetTop + element.offsetHeight + elementStyles.scrollMarginBottom > scrollContainer.scrollTop + scrollContainer.clientHeight - containerStyles.scrollPaddingBottom) { // overflow downwards, align bottom edges targetY = elementOffsetTop + element.offsetHeight + elementStyles.scrollMarginBottom - scrollContainer.clientHeight + containerStyles.scrollPaddingBottom; } } scrollContainer.scrollTo({ left: targetX, top: targetY, behavior: 'auto' }); } function getOffset(ancestor, element, side) { const propName = side === 'left' ? 'offsetLeft' : 'offsetTop'; let result = 0; while (element.offsetParent) { result += element[propName]; if (element.offsetParent === ancestor) { break; } element = element.offsetParent; } return result; } function getStyles(element) { const styles = getComputedStyle(element); return { scrollMarginTop: parseFloat(styles.scrollMarginTop) || 0, scrollMarginRight: parseFloat(styles.scrollMarginRight) || 0, scrollMarginBottom: parseFloat(styles.scrollMarginBottom) || 0, scrollMarginLeft: parseFloat(styles.scrollMarginLeft) || 0, scrollPaddingTop: parseFloat(styles.scrollPaddingTop) || 0, scrollPaddingRight: parseFloat(styles.scrollPaddingRight) || 0, scrollPaddingBottom: parseFloat(styles.scrollPaddingBottom) || 0, scrollPaddingLeft: parseFloat(styles.scrollPaddingLeft) || 0 }; }