personal web client for Bluesky
typescript
solidjs
bluesky
atcute
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};