mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-30 11:22:31 +00:00
Create Tooltip component Fix Popover positioning calculations Add margins to popover Remove @atlaskit/tooltip Update all components to use the new Tooltip component Added tooltip actions and reducers for the following functionality: when a user hovers over an element is sees the tooltip for that element and then hovers another element that has a tooltip, instead of using the delay and animations we just unmount the current tooltip and mount the next one immediately
154 lines
4.3 KiB
TypeScript
154 lines
4.3 KiB
TypeScript
const getLeftAlignedStyle = (bounds: DOMRect) => {
|
|
return {
|
|
position: 'fixed',
|
|
right: `${window.innerWidth - bounds.x}px`
|
|
};
|
|
};
|
|
|
|
const getRightAlignedStyle = (bounds: DOMRect) => {
|
|
return {
|
|
position: 'fixed',
|
|
left: `${bounds.x + bounds.width}px`
|
|
};
|
|
};
|
|
|
|
const getTopAlignedStyle = (bounds: DOMRect) => {
|
|
return {
|
|
position: 'fixed',
|
|
bottom: `${window.innerHeight - bounds.y}px`
|
|
};
|
|
};
|
|
|
|
const getBottomAlignedStyle = (bounds: DOMRect) => {
|
|
return {
|
|
position: 'fixed',
|
|
top: `${bounds.y + bounds.height}px`
|
|
};
|
|
};
|
|
|
|
const getLeftRightStartAlign = (bounds: DOMRect, size: DOMRectReadOnly) => {
|
|
return {
|
|
top: `${Math.min(bounds.y, window.innerHeight - size.height - 20)}px`
|
|
};
|
|
};
|
|
|
|
const getLeftRightMidAlign = (bounds: DOMRect, size: DOMRectReadOnly) => {
|
|
return {
|
|
bottom: `${window.innerHeight - bounds.y - (bounds.height / 2) - (size.height / 2)}px`
|
|
};
|
|
};
|
|
|
|
const getLeftRightEndAlign = (bounds: DOMRect, size: DOMRectReadOnly) => {
|
|
return {
|
|
bottom: `${Math.min(window.innerHeight - bounds.y - bounds.height, window.innerHeight - size.height)}px`
|
|
};
|
|
};
|
|
|
|
const getTopBotStartAlign = (bounds: DOMRect) => {
|
|
return {
|
|
right: `${window.innerWidth - bounds.x - 6}px`
|
|
};
|
|
};
|
|
|
|
const getTopBotMidAlign = (bounds: DOMRect, size: DOMRectReadOnly) => {
|
|
return {
|
|
right: `${window.innerWidth - bounds.x - (bounds.width / 2) - (size.width / 2)}px`
|
|
};
|
|
};
|
|
|
|
const getTopBotEndAlign = (bounds: DOMRect) => {
|
|
return {
|
|
left: `${bounds.x + bounds.width - 6}px`
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Gets the trigger element's and the context menu's bounds/size info and
|
|
* computes the style to apply to the context menu to positioning it correctly
|
|
* in regards to the given position info.
|
|
*
|
|
* @param {DOMRect} triggerBounds -The bounds info of the trigger html element.
|
|
* @param {DOMRectReadOnly} dialogSize - The size info of the context menu.
|
|
* @param {string} position - The position of the context menu in regards to the trigger element.
|
|
*
|
|
* @returns {Object} = The style to apply to context menu for positioning it correctly.
|
|
*/
|
|
export const getContextMenuStyle = (triggerBounds: DOMRect,
|
|
dialogSize: DOMRectReadOnly,
|
|
position: string) => {
|
|
const parsed = position.split('-');
|
|
|
|
switch (parsed[0]) {
|
|
case 'top': {
|
|
let alignmentStyle = {};
|
|
|
|
if (parsed[1]) {
|
|
alignmentStyle = parsed[1] === 'start'
|
|
? getTopBotStartAlign(triggerBounds)
|
|
: getTopBotEndAlign(triggerBounds);
|
|
} else {
|
|
alignmentStyle = getTopBotMidAlign(triggerBounds, dialogSize);
|
|
}
|
|
|
|
return {
|
|
...getTopAlignedStyle(triggerBounds),
|
|
...alignmentStyle
|
|
};
|
|
}
|
|
case 'bottom': {
|
|
let alignmentStyle = {};
|
|
|
|
if (parsed[1]) {
|
|
alignmentStyle = parsed[1] === 'start'
|
|
? getTopBotStartAlign(triggerBounds)
|
|
: getTopBotEndAlign(triggerBounds);
|
|
} else {
|
|
alignmentStyle = getTopBotMidAlign(triggerBounds, dialogSize);
|
|
}
|
|
|
|
return {
|
|
...getBottomAlignedStyle(triggerBounds),
|
|
...alignmentStyle
|
|
};
|
|
}
|
|
case 'left': {
|
|
let alignmentStyle = {};
|
|
|
|
if (parsed[1]) {
|
|
alignmentStyle = parsed[1] === 'start'
|
|
? getLeftRightStartAlign(triggerBounds, dialogSize)
|
|
: getLeftRightEndAlign(triggerBounds, dialogSize);
|
|
} else {
|
|
alignmentStyle = getLeftRightMidAlign(triggerBounds, dialogSize);
|
|
}
|
|
|
|
return {
|
|
...getLeftAlignedStyle(triggerBounds),
|
|
...alignmentStyle
|
|
};
|
|
}
|
|
case 'right': {
|
|
let alignmentStyle = {};
|
|
|
|
if (parsed[1]) {
|
|
alignmentStyle = parsed[1] === 'start'
|
|
? getLeftRightStartAlign(triggerBounds, dialogSize)
|
|
: getLeftRightEndAlign(triggerBounds, dialogSize);
|
|
} else {
|
|
alignmentStyle = getLeftRightMidAlign(triggerBounds, dialogSize);
|
|
}
|
|
|
|
return {
|
|
...getRightAlignedStyle(triggerBounds),
|
|
...alignmentStyle
|
|
};
|
|
}
|
|
default: {
|
|
return {
|
|
...getLeftAlignedStyle(triggerBounds),
|
|
...getLeftRightEndAlign(triggerBounds, dialogSize)
|
|
};
|
|
}
|
|
}
|
|
};
|