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

      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


        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
