personal web client for Bluesky
typescript solidjs bluesky atcute
at trunk 1.2 kB view raw
1export const isMac = /^Mac/i.test(navigator.platform); 2 3const DEFAULT_EXCLUSION = 'a, button, img, video, dialog, [role=button]'; 4export const INTERACTION_TAGS = 'a, button, [role=button]'; 5 6export const hasSelectionRange = () => { 7 const selection = window.getSelection(); 8 return selection !== null && selection.type === 'Range'; 9}; 10 11export const isElementClicked = (ev: Event, exclusion = DEFAULT_EXCLUSION) => { 12 const target = ev.currentTarget as HTMLElement; 13 const path = ev.composedPath() as HTMLElement[]; 14 15 if ( 16 !path.includes(target) || 17 (ev.type === 'keydown' && (ev as KeyboardEvent).key !== 'Enter') || 18 (ev.type === 'auxclick' && (ev as MouseEvent).button !== 1) 19 ) { 20 return false; 21 } 22 23 for (let idx = 0, len = path.length; idx < len; idx++) { 24 const node = path[idx]; 25 26 if (node == target) { 27 break; 28 } 29 30 if (node.matches(exclusion)) { 31 return false; 32 } 33 } 34 35 return !hasSelectionRange(); 36}; 37 38export const isElementAltClicked = (ev: MouseEvent | KeyboardEvent) => { 39 return ev.type === 'auxclick' || isCtrlKeyPressed(ev); 40}; 41 42export const isCtrlKeyPressed = (ev: MouseEvent | KeyboardEvent) => { 43 return isMac ? ev.metaKey : ev.ctrlKey; 44};