UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

185 lines (151 loc) 5.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mapPropToPopperPlacement = exports.getNubbinClassName = exports.getNubbinMargins = void 0; var _classnames = _interopRequireDefault(require("classnames")); var _UNSAFE_direction = require("./../components/utilities/UNSAFE_direction"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* Copyright (c) 2015-present, salesforce.com, inc. All rights reserved */ /* Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license */ // Translates the prop into a string popper can use https://popper.js.org/popper-documentation.html#Popper.placements var mapPropToPopperPlacement = function mapPropToPopperPlacement(align, direction) { var placement; switch (align) { case 'top left': placement = 'top-start'; break; case 'top right': placement = 'top-end'; break; case 'right top': placement = 'right-start'; break; case 'right bottom': placement = 'right-end'; break; case 'bottom left': placement = 'bottom-start'; break; case 'bottom right': placement = 'bottom-end'; break; case 'left top': placement = 'left-start'; break; case 'left bottom': placement = 'left-end'; break; default: placement = align; } if (direction === _UNSAFE_direction.DIRECTIONS.RTL) { if (placement.indexOf('left') > -1) { placement = placement.replace('left', 'right'); } else if (placement.indexOf('right') > -1) { placement = placement.replace('right', 'left'); } else if (placement.indexOf('start') > -1) { placement = placement.replace('start', 'end'); } else if (placement.indexOf('end') > -1) { placement = placement.replace('end', 'start'); } } return placement; }; exports.mapPropToPopperPlacement = mapPropToPopperPlacement; var getNubbinClassName = function getNubbinClassName(align) { var popperData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (popperData.flipped) { return (0, _classnames.default)({ 'slds-nubbin_top': align === 'top', 'slds-nubbin_top-left': align === 'top left', 'slds-nubbin_top-right': align === 'top right', 'slds-nubbin_bottom': align === 'bottom', 'slds-nubbin_bottom-left': align === 'bottom left', 'slds-nubbin_bottom-right': align === 'bottom right', 'slds-nubbin_left': align === 'left', 'slds-nubbin_left-bottom': align === 'left bottom', 'slds-nubbin_left-top': align === 'left top', 'slds-nubbin_right': align === 'right', 'slds-nubbin_right-bottom': align === 'right bottom', 'slds-nubbin_right-top': align === 'right top' }); } return (0, _classnames.default)({ 'slds-nubbin_top': align === 'bottom', 'slds-nubbin_top-left': align === 'bottom left', 'slds-nubbin_top-right': align === 'bottom right', 'slds-nubbin_bottom': align === 'top', 'slds-nubbin_bottom-left': align === 'top left', 'slds-nubbin_bottom-right': align === 'top right', 'slds-nubbin_left': align === 'right', 'slds-nubbin_left-bottom': align === 'right bottom', 'slds-nubbin_left-top': align === 'right top', 'slds-nubbin_right': align === 'left', 'slds-nubbin_right-bottom': align === 'left bottom', 'slds-nubbin_right-top': align === 'left top' }); }; exports.getNubbinClassName = getNubbinClassName; var DISTANCE_OFFSET = 1.5; // 'rem' var NUBBIN_SIZE = 1; // 'rem' var ROTATED_HEIGHT = NUBBIN_SIZE / Math.sqrt(2); // 'rem' /* * * * * */ // FIXME - still need to account for border shadow of 2px. probably only needs to be added to the rotated height. // TODO - should we convert all rem to pixels right from the get go? Keep units consistent. Memoize the values for perf? var getNubbinMargins = function getNubbinMargins() { var popperData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var placement = popperData.placement; var top = 0; var left = 0; var DISTANCE_OFFSET_PX = 16 * DISTANCE_OFFSET; // FIXME - actually do a real convert based on font size. var ROTATED_HEIGHT_PX = 16 * ROTATED_HEIGHT; // FIXME - actually do a real convert based on font size. var halfWidth = popperData.offsets.reference.width * 0.5; var halfHeight = popperData.offsets.reference.height * 0.5; if (placement === 'top') { top = ROTATED_HEIGHT_PX * -1; } else if (placement === 'top-end') { top = ROTATED_HEIGHT_PX * -1; left = DISTANCE_OFFSET_PX - halfWidth; } else if (placement === 'top-start') { top = ROTATED_HEIGHT_PX * -1; left = halfWidth - DISTANCE_OFFSET_PX; } if (placement === 'bottom') { top = ROTATED_HEIGHT_PX; } else if (placement === 'bottom-end') { top = ROTATED_HEIGHT_PX; left = DISTANCE_OFFSET_PX - halfWidth; } else if (placement === 'bottom-start') { top = ROTATED_HEIGHT_PX; left = halfWidth - DISTANCE_OFFSET_PX; } if (placement === 'right') { left = ROTATED_HEIGHT_PX; } else if (placement === 'right-end') { left = ROTATED_HEIGHT_PX; top = DISTANCE_OFFSET_PX - halfHeight; } else if (placement === 'right-start') { left = ROTATED_HEIGHT_PX; top = halfHeight - DISTANCE_OFFSET_PX; } if (placement === 'left') { left = ROTATED_HEIGHT_PX * -1; } else if (placement === 'left-end') { left = ROTATED_HEIGHT_PX * -1; top = DISTANCE_OFFSET_PX - halfHeight; } else if (placement === 'left-start') { left = ROTATED_HEIGHT_PX * -1; top = halfHeight - DISTANCE_OFFSET_PX; } return { left: left, top: top }; }; exports.getNubbinMargins = getNubbinMargins;