alongslide 0.9.10 → 0.9.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/Gemfile +2 -2
- data/Gemfile.lock +4 -1
- data/alongslide.gemspec +2 -2
- data/app/assets/javascripts/alongslide/alongslide.coffee +57 -37
- data/app/assets/javascripts/alongslide/layout.coffee +83 -29
- data/app/assets/javascripts/alongslide/parser.coffee +27 -26
- data/app/assets/javascripts/alongslide/scrolling.coffee +14 -14
- data/app/assets/javascripts/alongslide/state.coffee +43 -18
- data/app/assets/stylesheets/alongslide.sass +3 -9
- data/vendor/assets/javascripts/regionFlow.coffee +86 -59
- data/vendor/assets/javascripts/skrollr.js +13 -7
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YWU4YjgzNWM5MDYzMWZkNjhlZjc2YzJjNTBiNzdiNTRkZDU3ZGE2OQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 542170c9eaf643945063831eba1c4197003157a2
|
4
|
+
data.tar.gz: 97ff3fa6ea20d7292d3cbf2ad7c03cc82b72b01d
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ODM0MTcwMTUwZTgxY2QxMWE3NGEwN2UwYTkyMjI3ZDIyZGFiYTYyODRhMjgw
|
11
|
-
MDdlYWZjOGYwZGViZDRhYTM0OTQ5NjQ0YTc5ODBjZWFjMGIyNGU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
Y2FjZjZhMzUyYmJmNzNjOGJiZjZhMTIwNTcwOWZmMjlmMWU3NjZlMGYyZDcz
|
14
|
-
YzE0NTdkNDhiNDk2YmYzMzA1OTYwNWQwMTZjNDExZGJiNTkwOTc3MDEzY2Qy
|
15
|
-
MDczY2Y5NzNiODkwNmQxMGNhZDcxMjVlMGY0YWUyYTEzMDQ4OGY=
|
6
|
+
metadata.gz: d5df3c8d11284c544419845fee71be332c244b27432ad9e5aefe59e08902e91494140c5cf67c968d5d05de8c0e888e336866441c61c227fd1fc8a97639b2bffd
|
7
|
+
data.tar.gz: da422b446b18f80f98a4b85127eb2e25ae925e32276fe02e929b957bb59ee1d8ff98666ce00d4ff1057904f98cbbd5d07fcaed6d65f6d9351fc2e63c290f9cce
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/alongslide.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = 'alongslide'
|
3
|
-
gem.version = '0.9.
|
3
|
+
gem.version = '0.9.11'
|
4
4
|
|
5
5
|
gem.summary = "Create dynamic web layouts with an extended Markdown syntax"
|
6
6
|
gem.description = "Create dynamic web layouts with an extended Markdown syntax"
|
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.homepage = 'http://github.com/triplecanopy/alongslide'
|
11
11
|
|
12
12
|
gem.add_dependency('redcarpet')
|
13
|
-
gem.add_dependency('treetop')
|
13
|
+
gem.add_dependency('treetop','~>1.4.14')
|
14
14
|
gem.add_dependency('polyglot')
|
15
15
|
gem.add_development_dependency('rspec')
|
16
16
|
|
@@ -9,42 +9,47 @@ class Alongslide
|
|
9
9
|
panels : {}
|
10
10
|
sections : {}
|
11
11
|
|
12
|
-
parser
|
13
|
-
layout
|
14
|
-
scrolling
|
15
|
-
state
|
12
|
+
parser : null
|
13
|
+
layout : null
|
14
|
+
scrolling : null
|
15
|
+
state : null
|
16
16
|
|
17
17
|
constructor: (options= {}) ->
|
18
18
|
@source = $(options.source) ? $('#content .raw')
|
19
19
|
@frames = $(options.to) ? $('#frames')
|
20
20
|
@regionCls = options.regionCls ? 'column'
|
21
21
|
@marginTop = options.marginTop ? 0
|
22
|
-
@
|
22
|
+
@panelIndices = []
|
23
|
+
@flowIndices = []
|
23
24
|
|
24
25
|
RegionFlow::init()
|
25
26
|
|
26
27
|
# parse
|
27
28
|
@parser = new @Parser source: @source
|
28
|
-
{@flowNames, @backgrounds, @panels, @footnotes, @sourceLength} = @parser.parse()
|
29
|
+
{@flowNames, @panelNames, @backgrounds, @panels, @footnotes, @sourceLength} = @parser.parse()
|
29
30
|
|
30
31
|
# init layout
|
31
32
|
@layout = new @Layout
|
32
|
-
sourceLength:
|
33
|
-
frames:
|
34
|
-
flowNames:
|
35
|
-
backgrounds:
|
36
|
-
panels:
|
37
|
-
regionCls:
|
38
|
-
panelNames:
|
33
|
+
sourceLength: @sourceLength
|
34
|
+
frames : @frames
|
35
|
+
flowNames : @flowNames
|
36
|
+
backgrounds : @backgrounds
|
37
|
+
panels : @panels
|
38
|
+
regionCls : @regionCls
|
39
|
+
panelNames : @panelNames
|
40
|
+
panelIndices: @panelIndices
|
41
|
+
flowIndices : @flowIndices
|
39
42
|
|
40
43
|
# init scrolling
|
41
44
|
@scrolling = new @Scrolling
|
42
|
-
frames:
|
45
|
+
frames: @frames
|
43
46
|
|
44
47
|
# init broswer history
|
45
48
|
@state = new @State
|
46
|
-
panelNames: @panelNames
|
47
|
-
|
49
|
+
panelNames : @panelNames
|
50
|
+
flowNames : @flowNames
|
51
|
+
panelIndices: @panelIndices
|
52
|
+
flowIndices : @flowIndices
|
48
53
|
|
49
54
|
# Render flowing layout and scroll behavior.
|
50
55
|
#
|
@@ -55,6 +60,7 @@ class Alongslide
|
|
55
60
|
# @param postRenderCallback - to be called when layout returns
|
56
61
|
#
|
57
62
|
render: (postRenderCallback) ->
|
63
|
+
|
58
64
|
frameAspect = FixedAspect.prototype.fitFrame(@layout.FRAME_WIDTH, @marginTop)
|
59
65
|
@layout.render (lastFramePosition) =>
|
60
66
|
|
@@ -65,9 +71,14 @@ class Alongslide
|
|
65
71
|
@applyAnchorScrolling()
|
66
72
|
|
67
73
|
# Emit notification that layout is complete.
|
74
|
+
#
|
68
75
|
$(document).triggerHandler 'alongslide.ready', @frames
|
69
76
|
|
77
|
+
# Default array of indices for URL rewrites is set to section names
|
78
|
+
#
|
79
|
+
@state.setIndices(@flowIndices)
|
70
80
|
@hashToPosition()
|
81
|
+
|
71
82
|
FixedAspect.prototype.fitPanels(frameAspect)
|
72
83
|
postRenderCallback()
|
73
84
|
|
@@ -80,11 +91,14 @@ class Alongslide
|
|
80
91
|
|
81
92
|
hashToPosition: ->
|
82
93
|
hash = window.location.hash
|
83
|
-
if hash.length
|
84
|
-
@goToPanel(hash.substr(1))
|
85
|
-
else
|
86
|
-
@goToPanel('titlesplash')
|
94
|
+
if hash.length
|
87
95
|
|
96
|
+
# State will update hash on skroll
|
97
|
+
#
|
98
|
+
stateIndex = @goToPanel(hash.substr(1))
|
99
|
+
|
100
|
+
state = {index: stateIndex || 0}
|
101
|
+
@state.updateLocation state
|
88
102
|
|
89
103
|
# Create footnotes
|
90
104
|
#
|
@@ -93,34 +107,40 @@ class Alongslide
|
|
93
107
|
# For each footnote in the article
|
94
108
|
@frames.find('.als-fn-ref').each (i, el) =>
|
95
109
|
# Reference the footnote
|
110
|
+
#
|
96
111
|
$el = $(el)
|
97
|
-
# Find the footnote text
|
98
|
-
$footnote = @footnotes.find($el.data('anchor'))
|
99
112
|
|
100
|
-
#
|
113
|
+
# Find and clone the footnote element
|
114
|
+
#
|
115
|
+
$footnote = @footnotes.find($el.data('anchor')).clone()
|
116
|
+
|
117
|
+
# Append the cloned element to the column
|
118
|
+
#
|
101
119
|
$column = $el.parents('.column')
|
102
120
|
$column.append($footnote)
|
103
121
|
|
104
|
-
|
105
|
-
bottom = $column.height() + $column.offset().top
|
106
|
-
if ($el.offset().top + $footnote.height()) > bottom
|
107
|
-
$footnote.css('bottom', 0)
|
108
|
-
else
|
109
|
-
$footnote.css('top', $el.parent().position().top )
|
110
|
-
|
111
|
-
$el.on "mouseenter click", (e) ->
|
122
|
+
$el.on 'click mouseenter', (e) ->
|
112
123
|
e.preventDefault()
|
113
124
|
e.stopImmediatePropagation()
|
125
|
+
|
126
|
+
# Place footnote, prevent placing offscreen
|
127
|
+
#
|
128
|
+
bottom = $column.height() + $column.offset().top
|
129
|
+
if ($el.offset().top + $footnote.height()) > bottom
|
130
|
+
$footnote.css('bottom', 0)
|
131
|
+
else
|
132
|
+
$footnote.css('top', $el.parent().position().top )
|
133
|
+
|
114
134
|
$footnote.fadeIn(150)
|
115
|
-
false
|
116
135
|
|
117
|
-
$footnote.on
|
118
|
-
setTimeout
|
119
|
-
|
136
|
+
$footnote.on 'click mouseleave', (e) ->
|
137
|
+
setTimeout ->
|
138
|
+
$footnote.fadeOut(150)
|
139
|
+
, 100
|
120
140
|
|
121
141
|
applyAnchorScrolling: ->
|
122
142
|
self = @
|
123
|
-
@frames.find('a[href
|
143
|
+
@frames.find('a[href*=\\#]:not([href=\\#])').on('click', (e) ->
|
124
144
|
self.goToPanel(@hash.substr(1))
|
125
145
|
)
|
126
146
|
|
@@ -128,7 +148,7 @@ class Alongslide
|
|
128
148
|
$target = $('#frames').find('[data-alongslide-id=' + alsId + ']')
|
129
149
|
targetPos = $target.data('als-in-position')
|
130
150
|
@scrolling.scrollToPosition(targetPos)
|
131
|
-
|
151
|
+
targetPos
|
132
152
|
|
133
153
|
# Make global
|
134
154
|
#
|
@@ -38,7 +38,7 @@ class Alongslide::Layout
|
|
38
38
|
#
|
39
39
|
#
|
40
40
|
constructor: (options = {}) ->
|
41
|
-
{@frames, @flowNames, @backgrounds, @panels, @regionCls, @sourceLength, @
|
41
|
+
{@frames, @flowNames, @flowIndices, @panel, @panelIndices, @backgrounds, @panels, @regionCls, @sourceLength, @cols} = options
|
42
42
|
|
43
43
|
# Main entrypoint for asynchronous chain of render calls.
|
44
44
|
#
|
@@ -71,15 +71,23 @@ class Alongslide::Layout
|
|
71
71
|
renderSection: ->
|
72
72
|
flowName = @flowNames[@currentFlowIndex]
|
73
73
|
|
74
|
-
|
75
|
-
background = @findBackground(flowName)
|
76
|
-
@setPositionOf background, to: @nextFramePosition() if background.length
|
77
|
-
background.addClass('unstaged')
|
74
|
+
if flowName?
|
78
75
|
|
79
|
-
|
80
|
-
|
76
|
+
# If there `flowName` exists, i.e., not `undefined`, lay out the section
|
77
|
+
# and increment `@currentFlowIndex`
|
78
|
+
#
|
79
|
+
@log "Laying out section \"#{flowName}\"", @SUPER_FRAME_LEVEL
|
80
|
+
@currentFlowIndex++
|
81
|
+
background = @findBackground(flowName)
|
82
|
+
@setPositionOf background, to: @nextFramePosition()
|
83
|
+
background.addClass('unstaged')
|
81
84
|
|
82
|
-
|
85
|
+
# Reset section index before building another section
|
86
|
+
#
|
87
|
+
@currentSectionFlowIndex = 0
|
88
|
+
position = @nextFramePosition()
|
89
|
+
@pushFlows(flowName, position, @flowIndices)
|
90
|
+
@renderFrame(flowName)
|
83
91
|
|
84
92
|
# Render one frame and its containing columns.
|
85
93
|
#
|
@@ -97,7 +105,8 @@ class Alongslide::Layout
|
|
97
105
|
column = @buildRegion frame, flowName
|
98
106
|
|
99
107
|
# Give each section flow an index
|
100
|
-
@currentSectionFlowIndex++
|
108
|
+
# @currentSectionFlowIndex++
|
109
|
+
|
101
110
|
column.find('.section').attr('data-section-flow-idx', @currentSectionFlowIndex)
|
102
111
|
|
103
112
|
# Move three-columns class from .section to .frame
|
@@ -115,17 +124,19 @@ class Alongslide::Layout
|
|
115
124
|
|
116
125
|
# Section is complete. Current column is the last column of the
|
117
126
|
# section (no longer the overflow column).
|
127
|
+
#
|
118
128
|
if @flowComplete(flowName)
|
119
129
|
@updateProgress column
|
120
130
|
@checkForDirectives column, true
|
121
131
|
@checkForEmpties column
|
122
132
|
|
123
133
|
# render next section, or complete render.
|
124
|
-
@
|
134
|
+
# @currentSectionFlowIndex++
|
135
|
+
|
125
136
|
unless @currentFlowIndex is @flowNames.length
|
126
137
|
background = @findBackground(flowName)
|
127
138
|
@setPositionOf background, until: @lastFramePosition() if background.length
|
128
|
-
setTimeout((=> @renderSection()),
|
139
|
+
setTimeout((=> @renderSection()), 0)
|
129
140
|
else
|
130
141
|
@log "Layout complete"
|
131
142
|
@reorder()
|
@@ -138,9 +149,7 @@ class Alongslide::Layout
|
|
138
149
|
|
139
150
|
# unstage earlier frames
|
140
151
|
frame.prevAll().addClass('unstaged')
|
141
|
-
|
142
|
-
# render next frame
|
143
|
-
setTimeout((=> @renderFrame(flowName, frame, lastColumn)), 1)
|
152
|
+
@renderFrame(flowName, frame, lastColumn)
|
144
153
|
|
145
154
|
# Check the last "fit" column for any special directives (CSS classes).
|
146
155
|
#
|
@@ -213,6 +222,7 @@ class Alongslide::Layout
|
|
213
222
|
|
214
223
|
# If we changed this frame's layout, re-flow this whole section's
|
215
224
|
# regions.
|
225
|
+
#
|
216
226
|
if directive.hasClass("now")
|
217
227
|
sectionId = flowFrame.data('als-section-id')
|
218
228
|
@frames.children('.flow').find(".frame[data-als-section-id=#{sectionId}]").removeClass('unstaged')
|
@@ -315,7 +325,14 @@ class Alongslide::Layout
|
|
315
325
|
if panelPosition > frame.data(@IN_POINT_KEY)
|
316
326
|
@log "Moving panel \"#{$(panel).data('alongslide-id')}\" at " +
|
317
327
|
"#{panelPosition} to #{panelPosition-1}", @FRAME_LEVEL
|
328
|
+
@movePanelPos($(panel).data('alongslide-id'), panelPosition-1, panelPosition)
|
318
329
|
$(panel).data(@IN_POINT_KEY, panelPosition-1)
|
330
|
+
oldOutKey = $(panel).data(@OUT_POINT_KEY)
|
331
|
+
newOutKey = if !isNaN(oldOutKey) and oldOutKey > -1
|
332
|
+
oldOutKey - 1
|
333
|
+
else
|
334
|
+
oldOutKey
|
335
|
+
$(panel).data(@OUT_POINT_KEY, newOutKey)
|
319
336
|
|
320
337
|
# Create region to receive flowing text (column). Return jQuery object.
|
321
338
|
#
|
@@ -327,20 +344,54 @@ class Alongslide::Layout
|
|
327
344
|
document.namedFlows.get(flowName).addRegion(region.get(0))
|
328
345
|
return region
|
329
346
|
|
347
|
+
# Create an index of flow names and panel names. Since `position` can
|
348
|
+
# increment by steps (0: a, 1: b, 3: c), we fill the gaps in the indices
|
349
|
+
# array with the array's previous index, if there is one (0: a, 1: b, 2: b,
|
350
|
+
# 3: c). This is used to sync skroll position with flow/panel name by
|
351
|
+
# `State`.
|
352
|
+
#
|
353
|
+
pushFlows: (id, position, arr) ->
|
354
|
+
# Frames named `sectionFlow[0-9]` are not part of the regular flow, and
|
355
|
+
# therefore shouldn't be included.
|
356
|
+
#
|
357
|
+
if position is arr.length and id.match(/^sectionFlow[0-9]/) is null
|
358
|
+
arr.push(id)
|
359
|
+
else if position > arr.length
|
360
|
+
while position > arr.length
|
361
|
+
arr.push(arr[arr.length - 1])
|
362
|
+
if id.match(/^sectionFlow[0-9]/) is null
|
363
|
+
arr.push(id)
|
364
|
+
|
365
|
+
# To build an array of panel objects indicating each panel's scroll position
|
366
|
+
# and id
|
367
|
+
#
|
368
|
+
pushPanels: (id, pos) ->
|
369
|
+
if pos then @panelIndices.push({pos:pos, id:id})
|
370
|
+
|
371
|
+
# When frames are destroyed, panels shift around, so we need to update the
|
372
|
+
# pointer to their scroll position in `@panelIndices` accordingly
|
373
|
+
#
|
374
|
+
movePanelPos:(panelName, newIndex, oldIndex)->
|
375
|
+
obj = _.findWhere(@panelIndices, {pos:oldIndex})
|
376
|
+
obj.pos = newIndex
|
377
|
+
|
330
378
|
# Pull panel element out of @panels storage, apply its transition, and
|
331
379
|
# append to DOM!
|
332
380
|
#
|
333
381
|
# @param id - Alongslide panel ID
|
334
382
|
#
|
335
383
|
buildPanel: (id, position) ->
|
336
|
-
|
337
|
-
|
384
|
+
panel = @panels[id]
|
385
|
+
.clone()
|
386
|
+
.addClass('unstaged frame')
|
387
|
+
.attr('data-panel-index', position)
|
388
|
+
.show()
|
389
|
+
.appendTo @frames.children('.panels')
|
338
390
|
alignment = _.filter @ALIGNMENTS, (alignment) -> panel.hasClass(alignment)
|
339
391
|
@log "Building #{alignment} panel frame \"#{id}\" at position #{position}", @FRAME_LEVEL
|
340
|
-
panel.addClass('frame')
|
341
|
-
panel.attr('data-panel-index', position);
|
342
|
-
panel.appendTo @frames.children('.panels')
|
343
392
|
@setPositionOf panel, to: position
|
393
|
+
@pushPanels(id, position)
|
394
|
+
|
344
395
|
return panel
|
345
396
|
|
346
397
|
# Destroy all previously laid out content.
|
@@ -368,16 +419,19 @@ class Alongslide::Layout
|
|
368
419
|
# until: out point (= end position)
|
369
420
|
#
|
370
421
|
setPositionOf: (frame, options={}) ->
|
371
|
-
|
372
|
-
if
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
422
|
+
parent = frame.parent()
|
423
|
+
if parent.length
|
424
|
+
frameType = parent[0].className
|
425
|
+
|
426
|
+
if options.to?
|
427
|
+
if (currentFramePosition = @getPositionOf frame)?
|
428
|
+
@log "Moving #{frameType} frame at #{currentFramePosition} to " +
|
429
|
+
"#{options.to}", @SUB_FRAME_LEVEL
|
430
|
+
frame.data @IN_POINT_KEY, options.to
|
431
|
+
if options.until?
|
432
|
+
@log "Dismissing #{frameType} frame \"#{frame.data('alongslide-id')}\" " +
|
433
|
+
"at #{options.until}", @SUB_FRAME_LEVEL
|
434
|
+
frame.data @OUT_POINT_KEY, options.until
|
381
435
|
return frame
|
382
436
|
|
383
437
|
# Return start position.
|
@@ -1,56 +1,56 @@
|
|
1
|
-
#
|
2
|
-
# parser.coffee: parse raw HTML into Alongslide types: sections, panels, etc.
|
3
|
-
#
|
1
|
+
#
|
2
|
+
# parser.coffee: parse raw HTML into Alongslide types: sections, panels, etc.
|
3
|
+
#
|
4
4
|
# Copyright 2013 Canopy Canopy Canopy, Inc.
|
5
5
|
# Author Adam Florin
|
6
6
|
|
7
7
|
class Alongslide::Parser
|
8
8
|
|
9
9
|
# Store names of flows here as we create them.
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# sections: []
|
12
12
|
backgrounds: []
|
13
|
-
flowNames: []
|
13
|
+
flowNames : []
|
14
|
+
panelNames : []
|
14
15
|
|
15
16
|
constructor: (options) ->
|
16
17
|
{@source} = options
|
17
18
|
@preprocessSource()
|
18
19
|
|
19
|
-
#
|
20
|
-
#
|
20
|
+
#
|
21
|
+
#
|
21
22
|
preprocessSource: ->
|
22
23
|
# Put dummy content inside empty directives as CSSRegions trims any empty
|
23
24
|
# elements found near the boundaries of a region.
|
24
25
|
(@source.find ".alongslide:empty").text("[ALS]")
|
25
26
|
|
26
27
|
# Parser entrypoint.
|
27
|
-
#
|
28
|
+
#
|
28
29
|
# Build sections and store them directly as CSSRegions named flows.
|
29
|
-
#
|
30
|
+
#
|
30
31
|
# Retun panels and footnotes, which will be needed by other components.
|
31
|
-
#
|
32
|
+
#
|
32
33
|
# Note! Parse order matters! Sections should go last, once all non-section
|
33
34
|
# material has been scraped out of @source.
|
34
|
-
#
|
35
|
+
#
|
35
36
|
parse: ->
|
36
37
|
@sourceLength = 0
|
37
38
|
|
38
|
-
panels
|
39
|
+
panels = @collectPanels()
|
39
40
|
footnotes = @collectFootnotes()
|
40
41
|
@collectSections()
|
41
42
|
|
42
|
-
flowNames: @flowNames
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
flowNames : @flowNames
|
44
|
+
panelNames : @panelNames
|
45
|
+
backgrounds : @backgrounds
|
46
|
+
panels : panels
|
47
|
+
footnotes : footnotes
|
46
48
|
sourceLength: @sourceLength
|
47
49
|
|
48
|
-
#
|
49
|
-
#
|
50
50
|
collectPanels: ->
|
51
51
|
rawPanels = @source.find('.alongslide.show.panel')
|
52
52
|
|
53
|
-
_.object _.map rawPanels, (el)
|
53
|
+
_.object _.map rawPanels, (el) =>
|
54
54
|
$el = $(el)
|
55
55
|
panelId = $el.data('alongslide-id')
|
56
56
|
panelEl = $el.clone().removeClass('show')
|
@@ -58,11 +58,12 @@ class Alongslide::Parser
|
|
58
58
|
# Cleanup
|
59
59
|
$el.empty().removeClass('panel')
|
60
60
|
|
61
|
+
@panelNames.push(panelId)
|
61
62
|
return [ panelId, panelEl ]
|
62
63
|
|
63
64
|
# Sift through passed-in sections, delineating them based on `enter` and `exit`
|
64
65
|
# directives, then assigning each to a flow.
|
65
|
-
#
|
66
|
+
#
|
66
67
|
collectSections: ->
|
67
68
|
@source.find('.alongslide.enter.section').each (index, directiveElement) =>
|
68
69
|
directive = $(directiveElement)
|
@@ -84,15 +85,15 @@ class Alongslide::Parser
|
|
84
85
|
@buildSection @source.children() unless @source.is(':empty')
|
85
86
|
|
86
87
|
# Build section, given content.
|
87
|
-
#
|
88
|
+
#
|
88
89
|
# Create new NamedFlow for it, and log the name.
|
89
|
-
#
|
90
|
+
#
|
90
91
|
# Create section background.
|
91
|
-
#
|
92
|
+
#
|
92
93
|
# @param content - jQuery object of section contents
|
93
94
|
# @param directive (optional) - directive which specified the section
|
94
95
|
# @param id (optional) - Alongslide section ID
|
95
|
-
#
|
96
|
+
#
|
96
97
|
buildSection: (content, directive, id) ->
|
97
98
|
flowName = id || "sectionFlow#{@flowNames.length}"
|
98
99
|
|
@@ -115,10 +116,10 @@ class Alongslide::Parser
|
|
115
116
|
@backgrounds.push(background)
|
116
117
|
|
117
118
|
# Search for footntes as formatted by Redcarpet's footnotes callback
|
118
|
-
#
|
119
|
+
#
|
119
120
|
# Each has an ID of the form `fn1`, which corresponds to the links in the
|
120
121
|
# footnote references.
|
121
|
-
#
|
122
|
+
#
|
122
123
|
# Returns a DOM node whose child elements are footnote definitions and removes the generated footnotes from DOM
|
123
124
|
collectFootnotes: ->
|
124
125
|
@source.find('.als-footnotes:last')
|
@@ -9,27 +9,27 @@ class Alongslide::Scrolling
|
|
9
9
|
# For applyTransition.
|
10
10
|
#
|
11
11
|
TRANSITIONS:
|
12
|
-
in: [-1..0]
|
12
|
+
in : [-1..0]
|
13
13
|
out: [0..1]
|
14
14
|
|
15
|
-
FLIP_THRESHOLD: 0.04
|
16
|
-
WAIT_BEFORE_RESET_MS: 250
|
17
|
-
SLIDE_DURATION_MS: 250
|
18
|
-
FORCE_SLIDE_DURATION_MS: 100
|
15
|
+
FLIP_THRESHOLD : 0.04
|
16
|
+
WAIT_BEFORE_RESET_MS : 250
|
17
|
+
SLIDE_DURATION_MS : 250
|
18
|
+
FORCE_SLIDE_DURATION_MS : 100
|
19
19
|
NUM_WHEEL_HISTORY_EVENTS: 10
|
20
|
-
MAGNITUDE_THRESHOLD: 2.2
|
20
|
+
MAGNITUDE_THRESHOLD : 2.2
|
21
21
|
|
22
|
-
currentPosition: 0
|
23
|
-
indexedTransitions: {}
|
22
|
+
currentPosition : 0
|
23
|
+
indexedTransitions : {}
|
24
24
|
|
25
25
|
# For desktop scroll throttling.
|
26
26
|
#
|
27
|
-
wheelHistory: []
|
28
|
-
lastAverageMagnitude: 0
|
29
|
-
ignoreScroll: false
|
27
|
+
wheelHistory : []
|
28
|
+
lastAverageMagnitude : 0
|
29
|
+
ignoreScroll : false
|
30
30
|
lastRequestedPosition: 0
|
31
31
|
|
32
|
-
mouseDown: false
|
32
|
+
mouseDown : false
|
33
33
|
|
34
34
|
# browser history
|
35
35
|
stateData: {}
|
@@ -372,9 +372,9 @@ class Alongslide::Scrolling
|
|
372
372
|
duration: duration
|
373
373
|
easing: 'easeOutQuad'
|
374
374
|
done: (skrollr) =>
|
375
|
-
|
375
|
+
stateData =
|
376
376
|
index: @currentPosition
|
377
|
-
alongslide.state.
|
377
|
+
alongslide.state.updateLocation(stateData)
|
378
378
|
|
379
379
|
# For mobile, stage/unstage frames after transition
|
380
380
|
if @skrollr.isMobile()
|
@@ -5,28 +5,53 @@
|
|
5
5
|
#
|
6
6
|
class Alongslide::State
|
7
7
|
|
8
|
-
panelNames : {}
|
9
|
-
documentTitle: ''
|
10
|
-
hash : '#'
|
11
|
-
|
12
8
|
constructor: (options = {}) ->
|
9
|
+
|
13
10
|
History = window.History
|
14
|
-
|
11
|
+
|
15
12
|
@documentTitle = document.getElementsByTagName('title')[0].innerHTML
|
16
13
|
@panelNames = options.panelNames
|
14
|
+
@flowNames = options.flowNames
|
15
|
+
@panelIndices = options.panelIndices
|
16
|
+
@flowIndices = options.flowIndices
|
17
|
+
@hashIndices = []
|
18
|
+
@hash = '#'
|
17
19
|
|
18
|
-
|
20
|
+
setIndices:(arr) ->
|
21
|
+
@hashIndices = arr
|
22
|
+
# Manually pushing 'digital-project-context' to sections
|
23
|
+
#
|
24
|
+
@flowIndices.push('digital-project-context')
|
25
|
+
|
26
|
+
rewindIndex:(state) ->
|
19
27
|
state.index -= 1
|
20
|
-
@
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
@
|
31
|
-
|
28
|
+
@updateLocation(state);
|
29
|
+
|
30
|
+
updateLocation:(state = {})->
|
31
|
+
|
32
|
+
if !History.enabled then return
|
33
|
+
|
34
|
+
# Account for layouts that only have one section, as the `position`s
|
35
|
+
# won't be in the indices array.
|
36
|
+
#
|
37
|
+
if !@hashIndices[state.index] and state.index > -1
|
38
|
+
@rewindIndex(state)
|
39
|
+
|
40
|
+
# Exit if the indices array is empty
|
41
|
+
#
|
42
|
+
else if state.index < 0
|
32
43
|
return
|
44
|
+
|
45
|
+
# Update the hash
|
46
|
+
#
|
47
|
+
else if @hashIndices[state.index]
|
48
|
+
|
49
|
+
History.replaceState null, @documentTitle, @hash + @hashIndices[state.index]
|
50
|
+
|
51
|
+
data =
|
52
|
+
index : state.index
|
53
|
+
sectionHash : @flowIndices[state.index]
|
54
|
+
panels : @panelIndices
|
55
|
+
sections : @flowIndices
|
56
|
+
|
57
|
+
$(document).triggerHandler 'alongslide.stateChange', data
|
@@ -66,9 +66,8 @@ $white-bg: #ffffff
|
|
66
66
|
position: absolute
|
67
67
|
text-rendering: optimizelegibility
|
68
68
|
text-transform: auto
|
69
|
-
|
70
|
-
|
71
|
-
line-height: 1em
|
69
|
+
p:nth-of-type(1):not(.region-flow-post-text-break)
|
70
|
+
text-indent: 0
|
72
71
|
|
73
72
|
// One frame is one screen's worth.
|
74
73
|
//
|
@@ -99,12 +98,6 @@ $white-bg: #ffffff
|
|
99
98
|
height: 45 * $vertical-grid-unit
|
100
99
|
top: $outer-margin-height
|
101
100
|
position: absolute
|
102
|
-
// > div
|
103
|
-
// height: $full-bleed - $frame-height-padding
|
104
|
-
.section
|
105
|
-
&[data-section-flow-idx]
|
106
|
-
p:first-child
|
107
|
-
text-indent: 0 !important
|
108
101
|
|
109
102
|
// Left/right columns
|
110
103
|
//
|
@@ -333,6 +326,7 @@ $white-bg: #ffffff
|
|
333
326
|
text-indent: 0%
|
334
327
|
padding: 2% 6% 0% 6%
|
335
328
|
.als-fn-sup
|
329
|
+
line-height: 0
|
336
330
|
position: relative
|
337
331
|
top: -0.8em
|
338
332
|
z-index: 1000000
|
@@ -1,121 +1,121 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
2
|
# regionFlow.coffee: ultralightweight, if somewhat naïve, implementation of
|
3
3
|
# CSS regions, according to the spec at:
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# http://dev.w3.org/csswg/css-regions/
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# Copyright 2013 Canopy Canopy Canopy, Inc.
|
8
|
-
#
|
8
|
+
#
|
9
9
|
|
10
10
|
|
11
11
|
# Initialize NamedFlowMap.
|
12
|
-
#
|
12
|
+
#
|
13
13
|
class RegionFlow
|
14
14
|
|
15
15
|
# To be spec compliant, the NamedFlow .overset property should be proactively
|
16
16
|
# calculated after any layout change.
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# However, in reality, checking a DOM element's scrollHeight is very expensive,
|
19
19
|
# so it's best not to call it any more than is stricly necessary.
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# For that reason, lazy mode is enabled by default, and callers should call
|
22
22
|
# .updateOverset() on namedFlows instead of checking the .overset property.
|
23
|
-
#
|
23
|
+
#
|
24
24
|
lazyMode: true
|
25
25
|
|
26
26
|
init: ->
|
27
27
|
document.namedFlows = new @NamedFlowMap
|
28
28
|
|
29
29
|
# Document has one NamedFlowMap, so that flows may be looked up by index.
|
30
|
-
#
|
30
|
+
#
|
31
31
|
# [MapClass(DOMString, NamedFlow)]
|
32
|
-
#
|
32
|
+
#
|
33
33
|
class RegionFlow::NamedFlowMap
|
34
34
|
|
35
35
|
namedFlows: {}
|
36
36
|
|
37
|
-
#
|
38
|
-
#
|
37
|
+
#
|
38
|
+
#
|
39
39
|
build: (flowName) ->
|
40
40
|
@namedFlows[flowName] = new RegionFlow::NamedFlow(flowName)
|
41
41
|
|
42
42
|
# As specified:
|
43
|
-
#
|
43
|
+
#
|
44
44
|
# NamedFlow? get(DOMString flowName);
|
45
|
-
#
|
45
|
+
#
|
46
46
|
get: (flowName) ->
|
47
47
|
@namedFlows[flowName] || @build(flowName)
|
48
48
|
|
49
49
|
# As specified:
|
50
|
-
#
|
50
|
+
#
|
51
51
|
# boolean has(DOMString flowName);
|
52
|
-
#
|
52
|
+
#
|
53
53
|
has: (flowName) ->
|
54
54
|
@namedFlows[flowName]?
|
55
55
|
|
56
56
|
# As specified:
|
57
|
-
#
|
57
|
+
#
|
58
58
|
# NamedFlowMap set(DOMString flowName, NamedFlow flowValue);
|
59
|
-
#
|
59
|
+
#
|
60
60
|
set: (flowName, flowValue) ->
|
61
61
|
@namedFlows[flowName] = flowValue
|
62
62
|
|
63
63
|
# As specified:
|
64
|
-
#
|
64
|
+
#
|
65
65
|
# boolean delete(DOMString flowName);
|
66
|
-
#
|
66
|
+
#
|
67
67
|
delete: (flowName) ->
|
68
68
|
delete @namedFlows[flowName]
|
69
69
|
|
70
70
|
# A NamedFlow
|
71
|
-
#
|
71
|
+
#
|
72
72
|
# interface NamedFlow : EventTarget {
|
73
73
|
# };
|
74
|
-
#
|
74
|
+
#
|
75
75
|
class RegionFlow::NamedFlow
|
76
76
|
# readonly attribute DOMString name;
|
77
77
|
# readonly attribute boolean overset;
|
78
78
|
# readonly attribute integer firstEmptyRegionIndex;
|
79
79
|
|
80
|
-
#
|
81
|
-
#
|
80
|
+
#
|
81
|
+
#
|
82
82
|
constructor: (@name) ->
|
83
83
|
@contentNodes = []
|
84
84
|
@overset = false
|
85
85
|
@resetRegions()
|
86
86
|
|
87
87
|
# Reset, assuming all previously-tracked regions have been destroyed.
|
88
|
-
#
|
88
|
+
#
|
89
89
|
# Leave content nodes right where they are.
|
90
|
-
#
|
90
|
+
#
|
91
91
|
resetRegions: ->
|
92
92
|
@regions = []
|
93
93
|
@firstEmptyRegionIndex = -1
|
94
94
|
@updateOverset() unless RegionFlow::lazyMode
|
95
95
|
|
96
96
|
# As specified:
|
97
|
-
#
|
97
|
+
#
|
98
98
|
# sequence<Region> getRegions();
|
99
|
-
#
|
99
|
+
#
|
100
100
|
getRegions: ->
|
101
101
|
@regions
|
102
102
|
|
103
103
|
# Push region to end of array and doFlow.
|
104
|
-
#
|
104
|
+
#
|
105
105
|
addRegion: (regionNode) ->
|
106
106
|
@regions.push new RegionFlow::Region(regionNode)
|
107
107
|
@firstEmptyRegionIndex = @regions.length - 1
|
108
108
|
@doFlow()
|
109
109
|
|
110
110
|
# As specified:
|
111
|
-
#
|
111
|
+
#
|
112
112
|
# sequence<Node> getContent();
|
113
|
-
#
|
113
|
+
#
|
114
114
|
getContent: ->
|
115
115
|
@contentNodes
|
116
116
|
|
117
117
|
# Push content to end of array and doFlow.
|
118
|
-
#
|
118
|
+
#
|
119
119
|
addContent: (contentNode) ->
|
120
120
|
@contentNodes.push($(contentNode))
|
121
121
|
@doFlow()
|
@@ -123,7 +123,7 @@ class RegionFlow::NamedFlow
|
|
123
123
|
# If regions are all still there, but the dimensions of already laid-out
|
124
124
|
# regions has changed, re-flow all regions from scratch (like resetRegions,
|
125
125
|
# but softer).
|
126
|
-
#
|
126
|
+
#
|
127
127
|
reFlow: ->
|
128
128
|
node.empty() for node in _.pluck @regions, 'node'
|
129
129
|
|
@@ -134,16 +134,16 @@ class RegionFlow::NamedFlow
|
|
134
134
|
@firstEmptyRegionIndex++
|
135
135
|
|
136
136
|
# Layout logic.
|
137
|
-
#
|
137
|
+
#
|
138
138
|
doFlow: ->
|
139
139
|
if @firstEmptyRegionIndex is 0
|
140
140
|
|
141
141
|
# TODO: prune marginal nodes? comments, scripts?
|
142
|
-
|
142
|
+
|
143
143
|
@populateRegions()
|
144
144
|
|
145
145
|
else if @firstEmptyRegionIndex > 0
|
146
|
-
|
146
|
+
|
147
147
|
# move all nodes from oversetRegion to lastRegion
|
148
148
|
# (which will later become the oversetRegion)
|
149
149
|
nodes = $(@oversetRegion().node).contents().remove()
|
@@ -151,21 +151,36 @@ class RegionFlow::NamedFlow
|
|
151
151
|
|
152
152
|
# enter recursive loop
|
153
153
|
@breakUp nodes: nodes
|
154
|
-
|
154
|
+
|
155
155
|
@updateOverset() unless RegionFlow::lazyMode
|
156
156
|
|
157
157
|
# Place all content into regions. Performed only on first time.
|
158
|
-
#
|
158
|
+
#
|
159
159
|
populateRegions: ->
|
160
160
|
@lastRegion().appendNode(node.clone()) for node in @contentNodes
|
161
161
|
|
162
|
+
|
163
|
+
# Verify that a node can be separated from it's predecessor. Used to prevent
|
164
|
+
# breaks on context-dependent elements, e.g., footnote references.
|
165
|
+
#
|
166
|
+
contextDependent:(node) ->
|
167
|
+
conditions = [
|
168
|
+
-> Boolean(@nodeName is 'SUP')
|
169
|
+
]
|
170
|
+
result = false
|
171
|
+
i = conditions.length
|
172
|
+
while i--
|
173
|
+
result = conditions[i].call(node)
|
174
|
+
if result then break
|
175
|
+
result
|
176
|
+
|
162
177
|
# Recursive layout call.
|
163
|
-
#
|
178
|
+
#
|
164
179
|
# @params options - hash
|
165
180
|
# node - HTML element to be broken up. ignored if nodes option is specified.
|
166
181
|
# nodes - array of HTML elements. overrides node option if specified.
|
167
182
|
# into - targetNode to break up 'node' into. defaults to oversetRegion's root.
|
168
|
-
#
|
183
|
+
#
|
169
184
|
breakUp: (options = {}) ->
|
170
185
|
nodes = options.nodes || $(options.node).contents()
|
171
186
|
|
@@ -182,11 +197,11 @@ class RegionFlow::NamedFlow
|
|
182
197
|
formerParent = $(childNode).parent()
|
183
198
|
$(childNode).remove().appendTo(targetNode)
|
184
199
|
|
185
|
-
if @oversetRegion().updateOverset() is 'overset'
|
200
|
+
if @oversetRegion().updateOverset() is 'overset' and not @contextDependent(childNode)
|
186
201
|
|
187
202
|
# move it back where it was
|
188
203
|
$(childNode).remove().prependTo(formerParent)
|
189
|
-
|
204
|
+
|
190
205
|
if childNode.nodeType is Node.TEXT_NODE
|
191
206
|
@breakUpText node: childNode, into: targetNode
|
192
207
|
else
|
@@ -198,17 +213,28 @@ class RegionFlow::NamedFlow
|
|
198
213
|
else if $(childNode).hasClass('break-after-always')
|
199
214
|
return false
|
200
215
|
|
216
|
+
# Helper function, recurses up the DOM looking for a block element
|
217
|
+
# @params elem - jQuery object
|
218
|
+
#
|
219
|
+
getBlockParent:(elem) ->
|
220
|
+
inlineEls = ['B', 'BIG', 'I', 'SMALL', 'TT', 'ABBR', 'ACRONYM', 'CITE', 'CODE', 'DFN', 'EM', 'KBD', 'STRONG', 'SAMP', 'VAR', 'A', 'BDO', 'BR', 'IMG', 'MAP', 'OBJECT', 'Q', 'SCRIPT', 'SPAN', 'SUB', 'SUP', 'BUTTON', 'INPUT', 'LABEL', 'SELECT', 'TEXTAREA']
|
221
|
+
blockElem = if $.inArray(elem.prop('tagName'), inlineEls) > -1
|
222
|
+
@getBlockParent(elem.parent(), inlineEls)
|
223
|
+
else
|
224
|
+
elem
|
225
|
+
return blockElem
|
226
|
+
|
201
227
|
# Given a text node and a target node (in the overset region), find the number
|
202
228
|
# of words which fit.
|
203
|
-
#
|
229
|
+
#
|
204
230
|
# @params options - hash
|
205
231
|
# node - textNode to copy words from
|
206
232
|
# into - targetNode to copy words to
|
207
|
-
#
|
233
|
+
#
|
208
234
|
breakUpText: (options = {}) ->
|
209
235
|
textNode = options.node
|
210
236
|
targetNode = document.createTextNode("")
|
211
|
-
$(targetNode).appendTo(options.into)
|
237
|
+
inlineElements = $(targetNode).appendTo(options.into)
|
212
238
|
|
213
239
|
words = textNode.nodeValue.split(/[ ]+/)
|
214
240
|
highIndex = words.length - 1
|
@@ -224,38 +250,39 @@ class RegionFlow::NamedFlow
|
|
224
250
|
lowIndex = tryIndex
|
225
251
|
|
226
252
|
tryIndex = Math.floor(lowIndex + (highIndex - lowIndex) / 2)
|
227
|
-
|
253
|
+
|
228
254
|
break if highIndex - lowIndex <= 1
|
229
|
-
|
255
|
+
|
230
256
|
if tryIndex is 0
|
231
257
|
$(targetNode).remove()
|
232
258
|
else
|
233
259
|
targetNode.textContent = words[0..tryIndex].join(" ")
|
234
260
|
textNode.nodeValue = words[tryIndex+1..words.length-1].join(" ")
|
235
|
-
$(textNode).parent()
|
261
|
+
$parentElem = @getBlockParent $(textNode).parent() # prevents us from attaching classes to inline elements
|
262
|
+
$parentElem.addClass("region-flow-post-text-break")
|
236
263
|
|
237
264
|
@oversetRegion().updateOverset() unless RegionFlow::lazyMode
|
238
265
|
|
239
266
|
# Calculate whether named flow is overset.
|
240
|
-
#
|
267
|
+
#
|
241
268
|
# Normally treated as a private method, but called publicly in lazy mode.
|
242
269
|
# See RegionFlow::lazyMode.
|
243
|
-
#
|
270
|
+
#
|
244
271
|
updateOverset: ->
|
245
272
|
@overset = @regions[@firstEmptyRegionIndex]?.updateOverset() is 'overset'
|
246
273
|
|
247
274
|
# Readability helpers.
|
248
|
-
#
|
275
|
+
#
|
249
276
|
oversetRegion: ->
|
250
277
|
@regions[@firstEmptyRegionIndex - 1]
|
251
278
|
lastRegion: ->
|
252
279
|
@regions[@firstEmptyRegionIndex]
|
253
|
-
|
280
|
+
|
254
281
|
|
255
282
|
# [NoInterfaceObject]
|
256
283
|
# interface Region {
|
257
284
|
# };
|
258
|
-
#
|
285
|
+
#
|
259
286
|
class RegionFlow::Region
|
260
287
|
|
261
288
|
constructor: (node) ->
|
@@ -263,21 +290,21 @@ class RegionFlow::Region
|
|
263
290
|
@updateOverset() unless RegionFlow::lazyMode
|
264
291
|
|
265
292
|
# Append one or more nodes.
|
266
|
-
#
|
293
|
+
#
|
267
294
|
appendNode: (contentNode) ->
|
268
295
|
$(@node).append(contentNode)
|
269
296
|
@updateOverset() unless RegionFlow::lazyMode
|
270
297
|
|
271
298
|
# As specified:
|
272
|
-
#
|
299
|
+
#
|
273
300
|
# readonly attribute DOMString regionOverset;
|
274
|
-
#
|
301
|
+
#
|
275
302
|
# Possible states
|
276
|
-
#
|
303
|
+
#
|
277
304
|
# 'overset': The region is the last one in the region chain and not able to fit the remaining content from the named flow.
|
278
305
|
# 'fit': The region's flow fragment content fits into the region's content box.
|
279
306
|
# 'empty': All content from the named flow was fitted in prior regions.
|
280
|
-
#
|
307
|
+
#
|
281
308
|
updateOverset: ->
|
282
309
|
node = @node.get(0)
|
283
310
|
isOverset = node.scrollHeight > node.clientHeight
|
@@ -301,5 +328,5 @@ class RegionFlow::Region
|
|
301
328
|
else
|
302
329
|
'fit'
|
303
330
|
|
304
|
-
#
|
331
|
+
#
|
305
332
|
window.RegionFlow = RegionFlow
|
@@ -722,7 +722,7 @@
|
|
722
722
|
var deltaTime;
|
723
723
|
|
724
724
|
_addEvent(documentElement, [EVENT_TOUCHSTART, EVENT_TOUCHMOVE, EVENT_TOUCHCANCEL, EVENT_TOUCHEND].join(' '), function(e) {
|
725
|
-
e.preventDefault();
|
725
|
+
// e.preventDefault();
|
726
726
|
|
727
727
|
var touch = e.changedTouches[0];
|
728
728
|
|
@@ -750,12 +750,18 @@
|
|
750
750
|
deltaX = currentTouchX - lastTouchX;
|
751
751
|
deltaTime = currentTouchTime - lastTouchTime;
|
752
752
|
|
753
|
-
|
754
|
-
|
753
|
+
// Allow horizontal scroll on overflowing elements
|
754
|
+
if (Math.abs(deltaX) < Math.abs(deltaY)) {
|
755
|
+
return;
|
756
|
+
} else {
|
757
|
+
var position = _mobileOffset - (!_scrollHorizontal ? deltaY : deltaX);
|
758
|
+
_instance.setScrollPosition(position, true);
|
759
|
+
|
760
|
+
lastTouchY = currentTouchY;
|
761
|
+
lastTouchX = currentTouchX;
|
762
|
+
lastTouchTime = currentTouchTime;
|
763
|
+
}
|
755
764
|
|
756
|
-
lastTouchY = currentTouchY;
|
757
|
-
lastTouchX = currentTouchX;
|
758
|
-
lastTouchTime = currentTouchTime;
|
759
765
|
break;
|
760
766
|
default:
|
761
767
|
case EVENT_TOUCHCANCEL:
|
@@ -1713,4 +1719,4 @@
|
|
1713
1719
|
//Animation frame id returned by RequestAnimationFrame (or timeout when RAF is not supported).
|
1714
1720
|
var _animFrame;
|
1715
1721
|
|
1716
|
-
}(window, document));
|
1722
|
+
}(window, document));
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alongslide
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Florin
|
@@ -9,62 +9,62 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-09-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redcarpet
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: treetop
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 1.4.14
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 1.4.14
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: polyglot
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
description: Create dynamic web layouts with an extended Markdown syntax
|
@@ -123,17 +123,17 @@ require_paths:
|
|
123
123
|
- lib
|
124
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
125
|
requirements:
|
126
|
-
- -
|
126
|
+
- - ">="
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
130
|
requirements:
|
131
|
-
- -
|
131
|
+
- - ">="
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: '0'
|
134
134
|
requirements: []
|
135
135
|
rubyforge_project:
|
136
|
-
rubygems_version: 2.
|
136
|
+
rubygems_version: 2.4.8
|
137
137
|
signing_key:
|
138
138
|
specification_version: 4
|
139
139
|
summary: Create dynamic web layouts with an extended Markdown syntax
|