@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
268 lines • 8.93 kB
JavaScript
export { debounce, debounceAsync } from "./helpers/debounce.js";
export const PLATFORM_MAC = 'Mac|iPad|iPhone|iPod';
export const PLATFORM_WIN = 'Win';
export const PLATFORM_ANDROID = 'Android';
export const PLATFORM_LINUX = 'Linux';
export const PLATFORM_IOS = 'iOS|iPhone|iPad|iPod';
export let IS_EDGE = false;
export let IS_IOS = false;
export let IS_SAFARI = false;
export let IS_WIN = false;
export let IS_MAC = false;
export let IS_ANDROID = false;
export let IS_LINUX = false;
export const isMac = () => IS_MAC = typeof navigator !== 'undefined' && new RegExp(PLATFORM_MAC, 'i').test(navigator?.platform);
export const isWin = () => IS_WIN = typeof navigator !== 'undefined' && new RegExp(PLATFORM_WIN, 'i').test(navigator?.platform);
export const isAndroid = () => IS_ANDROID = typeof navigator !== 'undefined' && new RegExp(PLATFORM_ANDROID, 'i').test(navigator?.userAgent);
export const isLinux = () => IS_LINUX = typeof navigator !== 'undefined' && new RegExp(PLATFORM_LINUX, 'i').test(navigator?.platform);
export const isiOS = () => IS_IOS = typeof navigator !== 'undefined' && new RegExp(PLATFORM_IOS, 'i').test(navigator?.platform);
export const isSafari = () => IS_SAFARI = typeof navigator !== 'undefined' && /safari/i.test(navigator?.userAgent) && !/chrome/i.test(navigator?.userAgent);
export const isEdge = () => IS_EDGE = typeof navigator !== 'undefined' && /edge/i.test(navigator?.userAgent);
isEdge();
isiOS();
isSafari();
isWin();
isAndroid();
isMac();
isLinux();
const pageFocusElements = {};
export function setPageFocusElement(selectorOrElement, key = 'default') {
return pageFocusElements[key] = selectorOrElement;
}
export function applyPageFocus(selector = 'default', callback = null) {
try {
let element = /^[.#]/.test(selector) ? selector : pageFocusElements[selector];
if (typeof element === 'string' && typeof document !== 'undefined') {
element = document.querySelector(element);
} else if (!element && typeof document !== 'undefined') {
element = document.querySelector('.dnb-no-focus');
}
if (!(element instanceof HTMLElement)) {
return;
}
const role = element.getAttribute('role');
const list = ['a', 'button', 'input', 'textarea', 'select', 'label', 'menu'];
const isInteractive = list.includes(String(element.nodeName).toLowerCase()) || list.includes(String(role).toLowerCase());
const hasTabIndex = element.hasAttribute('tabindex');
const hasNoFocus = element.classList.contains('dnb-no-focus');
if (!isInteractive) {
if (!hasTabIndex) {
element.setAttribute('tabindex', '-1');
}
if (!hasNoFocus) {
element.classList.add('dnb-no-focus');
}
}
element.focus();
const onBlur = () => {
if (!isInteractive) {
if (!hasTabIndex) {
element.removeAttribute('tabindex');
}
if (!hasNoFocus) {
element.classList.remove('dnb-no-focus');
}
}
};
element.addEventListener('blur', onBlur, {
once: true
});
if (typeof callback === 'function') {
callback(element);
}
} catch (e) {
warn('Error on applyPageFocus:', e);
}
}
export function getOffsetTop(elem) {
let offsetTop = 0;
if (elem) {
do {
if (!isNaN(elem.offsetTop)) {
offsetTop += elem.offsetTop;
}
} while (elem = elem.offsetParent);
}
return offsetTop;
}
export function getOffsetLeft(elem) {
let offsetLeft = 0;
if (elem) {
do {
if (!isNaN(elem.offsetLeft)) {
offsetLeft += elem.offsetLeft;
}
} while (elem = elem.offsetParent);
}
return offsetLeft;
}
export function scrollToLocationHashId({
offset = 0,
delay = null,
onCompletion = null
} = {}) {
if (typeof document !== 'undefined' && typeof window !== 'undefined' && window.location) {
try {
let _timeout;
const id = String(window.location.hash).replace('#', '');
if (id.length > 0) {
const handleScroll = () => {
const runScroll = () => {
const totalOffset = getOffsetTop(elem);
if (totalOffset <= 0) {
return;
}
const top = totalOffset - offset;
try {
if (typeof IntersectionObserver !== 'undefined') {
const intersectionObserver = new IntersectionObserver(entries => {
const [entry] = entries;
if (entry.isIntersecting) {
intersectionObserver.unobserve(elem);
if (typeof onCompletion === 'function') {
onCompletion(elem);
}
}
});
intersectionObserver.observe(elem);
}
if (window.scrollTo) {
window.scrollTo({
top,
behavior: 'smooth'
});
} else {
window.scrollTop = top;
}
} catch (e) {
warn('Error on scrollToLocationHashId:', e);
}
};
if (delay > 0) {
clearTimeout(_timeout);
_timeout = setTimeout(runScroll, delay);
} else {
runScroll();
}
};
const elem = document.getElementById(id);
if (elem instanceof HTMLElement) {
window.addEventListener('beforeunload', () => clearTimeout(_timeout));
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', handleScroll);
} else {
handleScroll();
}
}
return elem;
}
} catch (e) {
warn('Error on scrollToLocationHashId:', e);
}
}
}
export function insertElementBeforeSelection(elem) {
try {
const selection = window.getSelection();
const range = selection.getRangeAt(0);
range.cloneRange().insertNode(elem);
selection.addRange(range);
} catch (e) {}
}
export function getSelectedText() {
try {
return window.getSelection().toString();
} catch (e) {}
}
export function emptySelectedText() {
try {
if (window.getSelection && window.getSelection().empty) {
window.getSelection().empty();
}
} catch (e) {}
}
export function hasSelectedText() {
return getSelectedText().length > 0;
}
export function getSelectedElement() {
try {
const selection = window.getSelection();
if (selection.rangeCount > 0) {
let elem = selection.getRangeAt(0).startContainer;
if (elem && typeof elem === 'object') {
elem = elem.parentNode;
}
return elem;
}
} catch (e) {}
return null;
}
export async function copyToClipboard(string) {
if (typeof window === 'undefined' || typeof document === 'undefined') {
return false;
}
const selection = window.getSelection();
const range = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;
const resetSelection = () => {
try {
selection.removeAllRanges();
selection.addRange(range);
} catch (e) {}
};
const copyFallback = () => {
try {
const elem = document.createElement('textarea');
elem.value = String(string);
elem.contentEditable = true;
elem.readOnly = false;
elem.style.position = 'fixed';
elem.style.top = '-1000px';
document.body.appendChild(elem);
elem.select();
const success = document.execCommand('copy');
document.body.removeChild(elem);
resetSelection();
if (success) {
return true;
}
} catch (e) {
return e;
}
return `Could not copy! Unknown reason. ${string}`;
};
let success;
if (typeof navigator !== 'undefined' && navigator?.clipboard) {
try {
await navigator.clipboard.writeText(String(string));
success = true;
resetSelection();
} catch (e) {
success = e;
const newTry = copyFallback();
if (newTry === true) {
success = newTry;
}
}
} else {
success = copyFallback();
}
return success;
}
export const warn = (...params) => {
if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production' && typeof console !== 'undefined' && typeof console.log === 'function') {
const isBrowser = typeof window !== 'undefined' && process.env.NODE_ENV !== 'test';
if (isBrowser) {
const styles = [`padding: 0.125rem 0.5rem ${IS_SAFARI ? '' : '0'}`, 'font-weight: bold', 'color: #00343E', 'background: #A5E1D2'].join(';');
console.log('%cEufemia', styles, ...params);
} else {
console.log('\u001b[0m\u001b[1m\u001b[38;5;23m\u001b[48;5;152mEufemia\u001b[49m\u001b[39m\u001b[22m\u001b[0m', ...params);
}
}
};
export function getColor(value) {
if (String(value).includes('--')) {
return value;
}
return value ? !/#|var/.test(value) ? `var(--color-${value})` : value : undefined;
}
//# sourceMappingURL=helpers.js.map