welcome.coffee 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. _Drop = Drop.createContext classPrefix: 'tether'
  2. isMobile = $(window).width() < 567
  3. init = ->
  4. setupHero()
  5. setupBrowserDemo()
  6. setupHero = ->
  7. $target = $('.tether-target-demo')
  8. positions = [
  9. 'top left'
  10. 'left top'
  11. 'left middle'
  12. 'left bottom'
  13. 'bottom left'
  14. 'bottom center'
  15. 'bottom right'
  16. 'right bottom'
  17. 'right middle'
  18. 'right top'
  19. 'top right'
  20. 'top center'
  21. ]
  22. if isMobile
  23. positions = [
  24. 'top left'
  25. 'bottom left'
  26. 'bottom right'
  27. 'top right'
  28. ]
  29. window.drops = {}
  30. for position in positions
  31. drops[position] = new _Drop
  32. target: $target[0]
  33. classes: 'tether-theme-arrows-dark'
  34. position: position
  35. constrainToWindow: false
  36. openOn: ''
  37. content: '<div style="height: 50px; width: 50px"></div>'
  38. openIndex = 0
  39. frames = 0
  40. frameLengthMS = 10
  41. openAllDrops = ->
  42. for position, drop of drops
  43. drop.open()
  44. openNextDrop = ->
  45. for position, drop of drops
  46. drop.close()
  47. drops[positions[openIndex]].open()
  48. drops[positions[(openIndex + 6) % positions.length]].open()
  49. openIndex = (openIndex + 1) % positions.length
  50. if frames > 5
  51. finalDropState()
  52. return
  53. frames += 1
  54. setTimeout openNextDrop, frameLengthMS * frames
  55. finalDropState = ->
  56. $(drops['top left'].dropContent).html('Marrying DOM elements for life.')
  57. $(drops['bottom right'].dropContent).html('<a class="button" href="http://github.com/HubSpot/tether">★ On Github</a>')
  58. drops['top left'].open()
  59. drops['bottom right'].open()
  60. if true or isMobile
  61. drops['top left'].open()
  62. drops['top left'].tether.position()
  63. drops['bottom right'].open()
  64. drops['bottom right'].tether.position()
  65. finalDropState()
  66. else
  67. openNextDrop()
  68. setupBrowserDemo = ->
  69. $browserDemo = $('.browser-demo.showcase')
  70. $startPoint = $('.browser-demo-start-point')
  71. $stopPoint = $('.browser-demo-stop-point')
  72. $iframe = $('.browser-window iframe')
  73. $browserContents = $('.browser-content .browser-demo-inner')
  74. $sections = $('.browser-demo-section')
  75. $('body').append """
  76. <style>
  77. table.showcase.browser-demo.fixed-bottom {
  78. top: #{ $sections.length }00%
  79. }
  80. </style>
  81. """
  82. $(window).scroll ->
  83. scrollTop = $(window).scrollTop()
  84. if $startPoint.position().top < scrollTop and scrollTop + window.innerHeight < $stopPoint.position().top
  85. $browserDemo.removeClass('fixed-bottom')
  86. $browserDemo.addClass('fixed')
  87. $sections.each ->
  88. $section = $ @
  89. if $section.position().top < scrollTop < $section.position().top + $section.outerHeight()
  90. setSection $section.data('section')
  91. return true
  92. else
  93. $browserDemo.removeAttr('data-section')
  94. $browserDemo.removeClass('fixed')
  95. if scrollTop + window.innerHeight > $stopPoint.position().top
  96. $browserDemo.addClass('fixed-bottom')
  97. else
  98. $browserDemo.removeClass('fixed-bottom')
  99. $iframe.load ->
  100. iframeWindow = $iframe[0].contentWindow
  101. $items = $iframe.contents().find('.item')
  102. $items.each (i) ->
  103. $item = $(@)
  104. _iframeWindowDrop = iframeWindow.Drop.createContext classPrefix: 'tether'
  105. drop = new _iframeWindowDrop
  106. target: $item[0]
  107. classes: 'tether-theme-arrows-dark'
  108. position: 'right top'
  109. constrainToWindow: true
  110. openOn: 'click'
  111. content: '''
  112. <ul>
  113. <li>Action&nbsp;1</li>
  114. <li>Action&nbsp;2</li>
  115. <li>Action&nbsp;3</li>
  116. </ul>
  117. '''
  118. $item.data('drop', drop)
  119. scrollInterval = undefined
  120. scrollTop = 0
  121. scrollTopDirection = 1
  122. setSection = (section) ->
  123. $browserDemo.attr('data-section', section)
  124. $('.section-copy').removeClass('active')
  125. $(""".section-copy[data-section="#{ section }"]""").addClass('active')
  126. openExampleItem = ->
  127. if isMobile
  128. $iframe.contents().find('.item:first').data().drop.open()
  129. else
  130. $iframe.contents().find('.item:eq(2)').data().drop.open()
  131. closeAllItems = ->
  132. $iframe.contents().find('.item').each -> $(@).data().drop.close() or true
  133. scrollLeftSection = ->
  134. scrollInterval = setInterval ->
  135. $iframe.contents().find('.left').scrollTop scrollTop
  136. scrollTop += scrollTopDirection
  137. if scrollTop > 50
  138. scrollTopDirection = -1
  139. if scrollTop < 0
  140. scrollTopDirection = 1
  141. , 30
  142. stopScrollingLeftSection = ->
  143. clearInterval scrollInterval
  144. switch section
  145. when 'what'
  146. closeAllItems()
  147. openExampleItem()
  148. stopScrollingLeftSection()
  149. when 'how'
  150. closeAllItems()
  151. openExampleItem()
  152. stopScrollingLeftSection()
  153. scrollLeftSection()
  154. when 'why'
  155. closeAllItems()
  156. openExampleItem()
  157. stopScrollingLeftSection()
  158. scrollLeftSection()
  159. when 'outro'
  160. closeAllItems()
  161. openExampleItem()
  162. stopScrollingLeftSection()
  163. init()