         fn()
         songEl.style.visibility = ''
 
+      onMenuMouseHover: (e) ->
+        if e.type == 'mouseenter'
+          clearTimeout @hideMenuTimer
+        else
+          @hideMenuAfterWhile()
+
   # TODO(steida): Set by platform.
   @MIN_READABLE_FONT_SIZE: 8
   @MAX_FONT_SIZE: 60

      onSongPointerUp: (e) ->
        pointerUpOnMenu = goog.dom.contains @menuEl(), e.target
        return if pointerUpOnMenu
        # console.log pointerUpOnMenu
        # show = if pointerUpOnMenu then true else null
        @toggleMenu null, e

      menuEl: ->
        @refs['menu'].getDOMNode()

      ###*
        @param {?boolean} show
        @param {goog.events.BrowserEvent=} e
      ###
      toggleMenu: (show, e) ->
        show ?= goog.dom.classlist.contains @menuEl(), 'hidden'
        goog.dom.classlist.enable @menuEl(), 'hidden', !show
        @positionMenu e if show
        clearTimeout @hideMenuTimer
        @hideMenuAfterWhile() if show

      ###*
        @param {goog.events.BrowserEvent} e
      ###
      positionMenu: (e) ->
        position = new goog.positioning.ViewportClientPosition e.clientX, e.clientY
        position.setLastResortOverflow goog.positioning.Overflow.ADJUST_X | goog.positioning.Overflow.ADJUST_Y
        position.reposition @menuEl(), goog.positioning.Corner.BOTTOM_START


          article
            dangerouslySetInnerHTML: '__html': @lyricsHtml()
            ref: 'article'
          menu
            className: 'hidden'
            onMouseEnter: @onMenuMouseHover
            onMouseLeave: @onMenuMouseHover
            ref: 'menu'
          ,
            a
              href: routes.home.createUrl(),
            , Song.MSG_BACK
