75 lines
1.4 KiB
Plaintext
75 lines
1.4 KiB
Plaintext
# User Preview
|
|
#================================
|
|
|
|
riot = require \riot
|
|
|
|
riot.mixin \user-preview do
|
|
init: ->
|
|
@on \mount ~>
|
|
scan.call @
|
|
@on \updated ~>
|
|
scan.call @
|
|
|
|
function scan
|
|
elems = @root.query-selector-all '[data-user-preview]:not([data-user-preview-attached])'
|
|
elems.for-each attach.bind @
|
|
|
|
function attach el
|
|
el.set-attribute \data-user-preview-attached true
|
|
user = el.get-attribute \data-user-preview
|
|
|
|
tag = null
|
|
|
|
show-timer = null
|
|
hide-timer = null
|
|
|
|
el.add-event-listener \mouseover ~>
|
|
clear-timeout show-timer
|
|
clear-timeout hide-timer
|
|
show-timer := set-timeout ~>
|
|
show!
|
|
, 500ms
|
|
|
|
el.add-event-listener \mouseleave ~>
|
|
clear-timeout show-timer
|
|
clear-timeout hide-timer
|
|
hide-timer := set-timeout ~>
|
|
close!
|
|
, 500ms
|
|
|
|
@on \unmount ~>
|
|
clear-timeout show-timer
|
|
clear-timeout hide-timer
|
|
close!
|
|
|
|
function show
|
|
if tag?
|
|
return
|
|
|
|
preview = document.create-element \mk-user-preview
|
|
|
|
rect = el.get-bounding-client-rect!
|
|
x = rect.left + el.offset-width + window.page-x-offset
|
|
y = rect.top + window.page-y-offset
|
|
|
|
preview.style.top = y + \px
|
|
preview.style.left = x + \px
|
|
|
|
preview.add-event-listener \mouseover ~>
|
|
clear-timeout hide-timer
|
|
|
|
preview.add-event-listener \mouseleave ~>
|
|
clear-timeout show-timer
|
|
hide-timer := set-timeout ~>
|
|
close!
|
|
, 500ms
|
|
|
|
tag := riot.mount (document.body.append-child preview), do
|
|
user: user
|
|
.0
|
|
|
|
function close
|
|
if tag?
|
|
tag.close!
|
|
tag := null
|