Jacky Zhao
2023-06-20 24348b24a94c5f9ca285642b751e6798b92eedd9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
export function registerEscapeHandler(outsideContainer: HTMLElement | null, cb: () => void) {
  if (!outsideContainer) return
  function click(this: HTMLElement, e: HTMLElementEventMap["click"]) {
    if (e.target !== this) return
    e.preventDefault()
    cb()
  }
 
  function esc(e: HTMLElementEventMap["keydown"]) {
    if (!e.key.startsWith("Esc")) return
    e.preventDefault()
    cb()
  }
 
  outsideContainer?.removeEventListener("click", click)
  outsideContainer?.addEventListener("click", click)
  document.removeEventListener("keydown", esc)
  document.addEventListener('keydown', esc)
}
 
export function stripIndex(s: string): string {
  return s.endsWith("index") ? s.slice(0, -"index".length) : s
}
 
export function relative(from: string, to: string) {
  from = encodeURI(stripIndex(from))
  to = encodeURI(stripIndex(to))
  const start = [location.protocol, '//', location.host, location.pathname].join('')
  const trimEnd = from.length === 0 ? start.length : -from.length
  const url = start.slice(0, trimEnd) + to
  return url
}
 
export function removeAllChildren(node: HTMLElement) {
  while (node.firstChild) {
    node.removeChild(node.firstChild)
  }
}