export function getCss(docEle: HTMLElement) { const css: { transform?: string; transition?: string; transitionDuration?: string; transitionDelay?: string; transitionTimingFn?: string; transitionStart?: string; transitionEnd?: string; transformOrigin?: string; animationDelay?: string; } = {}; // transform var i: number; var keys = ['webkitTransform', '-webkit-transform', 'webkit-transform', 'transform']; for (i = 0; i < keys.length; i++) { if ((docEle.style)[keys[i]] !== undefined) { css.transform = keys[i]; break; } } // transition keys = ['webkitTransition', 'transition']; for (i = 0; i < keys.length; i++) { if ((docEle.style)[keys[i]] !== undefined) { css.transition = keys[i]; break; } } // The only prefix we care about is webkit for transitions. var isWebkit = css.transition.indexOf('webkit') > -1; // transition duration css.transitionDuration = (isWebkit ? '-webkit-' : '') + 'transition-duration'; // transition timing function css.transitionTimingFn = (isWebkit ? '-webkit-' : '') + 'transition-timing-function'; // transition delay css.transitionDelay = (isWebkit ? '-webkit-' : '') + 'transition-delay'; // To be sure transitionend works everywhere, include *both* the webkit and non-webkit events css.transitionEnd = (isWebkit ? 'webkitTransitionEnd ' : '') + 'transitionend'; // transform origin css.transformOrigin = (isWebkit ? '-webkit-' : '') + 'transform-origin'; // animation delay css.animationDelay = (isWebkit ? 'webkitAnimationDelay' : 'animationDelay'); return css; } export function pointerCoord(ev: any): PointerCoordinates { // get coordinates for either a mouse click // or a touch depending on the given event if (ev) { var changedTouches = ev.changedTouches; if (changedTouches && changedTouches.length > 0) { var touch = changedTouches[0]; return { x: touch.clientX, y: touch.clientY }; } var pageX = ev.pageX; if (pageX !== undefined) { return { x: pageX, y: ev.pageY }; } } return { x: 0, y: 0 }; } export function hasPointerMoved(threshold: number, startCoord: PointerCoordinates, endCoord: PointerCoordinates) { if (startCoord && endCoord) { const deltaX = (startCoord.x - endCoord.x); const deltaY = (startCoord.y - endCoord.y); const distance = deltaX * deltaX + deltaY * deltaY; return distance > (threshold * threshold); } return false; } export function isTextInput(ele: any) { return !!ele && (ele.tagName === 'TEXTAREA' || ele.contentEditable === 'true' || (ele.tagName === 'INPUT' && !(NON_TEXT_INPUT_REGEX.test(ele.type)))); } export const NON_TEXT_INPUT_REGEX = /^(radio|checkbox|range|file|submit|reset|color|image|button)$/i; const skipInputAttrsReg = /^(value|checked|disabled|type|class|style|id|autofocus|autocomplete|autocorrect)$/i; export function copyInputAttributes(srcElement: HTMLElement, destElement: HTMLElement) { // copy attributes from one element to another // however, skip over a few of them as they're already // handled in the angular world var attrs = srcElement.attributes; for (var i = 0; i < attrs.length; i++) { var attr = attrs[i]; if (!skipInputAttrsReg.test(attr.name)) { destElement.setAttribute(attr.name, attr.value); } } } export interface PointerCoordinates { x?: number; y?: number; } export function pointerCoordX(ev: any): number { // get X coordinates for either a mouse click // or a touch depending on the given event if (ev) { var changedTouches = ev.changedTouches; if (changedTouches && changedTouches.length > 0) { return changedTouches[0].clientX; } if (ev.pageX !== undefined) { return ev.pageX; } } return 0; } export function pointerCoordY(ev: any): number { // get Y coordinates for either a mouse click // or a touch depending on the given event if (ev) { var changedTouches = ev.changedTouches; if (changedTouches && changedTouches.length > 0) { return changedTouches[0].clientY; } if (ev.pageY !== undefined) { return ev.pageY; } } return 0; } export function getElementReference(elm: any, ref: string) { if (ref === 'child') { return elm.firstElementChild; } if (ref === 'parent') { if (elm.parentElement ) { // normal element with a parent element return elm.parentElement; } if (elm.parentNode && elm.parentNode.host) { // shadow dom's document fragment return elm.parentNode.host; } } if (ref === 'body') { return elm.ownerDocument.body; } if (ref === 'document') { return elm.ownerDocument; } if (ref === 'window') { return elm.ownerDocument.defaultView; } return elm; } export function getKeyCodeByName(keyName: string) { if (keyName === 'enter') { return 13; } if (keyName === 'escape') { return 27; } if (keyName === 'space') { return 32; } if (keyName === 'tab') { return 9; } return null; } export function applyStyles(elm: HTMLElement, styles: {[styleProp: string]: string|number}) { const styleProps = Object.keys(styles); for (var i = 0; i < styleProps.length; i++) { (elm.style)[styleProps[i]] = styles[styleProps[i]]; } }