@crispcode/shimmer 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.esdoc.json +21 -0
- package/.eslintrc +143 -0
- package/LICENSE +21 -0
- package/README.md +35 -0
- package/manual/advanced-usage.md +180 -0
- package/manual/basic-usage.md +38 -0
- package/package.json +64 -0
- package/scripts/button.js +137 -0
- package/scripts/controls.js +95 -0
- package/scripts/element.js +154 -0
- package/scripts/index.js +28 -0
- package/scripts/shimmer.js +195 -0
- package/scripts/tween.js +147 -0
- package/test/app.html +30 -0
- package/test/app.js +4 -0
- package/test/modux.config.js +8 -0
- package/test/public/image1.png +0 -0
- package/test/public/image2.png +0 -0
- package/test/scripts/components/layout/index.js +9 -0
- package/test/scripts/components/layout/template.html +3 -0
- package/test/scripts/components/shimmer/buttonMain.js +27 -0
- package/test/scripts/components/shimmer/debug.js +42 -0
- package/test/scripts/components/shimmer/index.js +88 -0
- package/test/scripts/components/shimmer/moon.js +88 -0
- package/test/scripts/index.js +28 -0
- package/test/styles/index.scss +22 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
'use strict'
|
2
|
+
|
3
|
+
export class Controls {
|
4
|
+
/**
|
5
|
+
* The pixi application renderer
|
6
|
+
* @param {Renderer} renderer
|
7
|
+
*/
|
8
|
+
constructor ( renderer ) {
|
9
|
+
this.__renderer = renderer
|
10
|
+
this.__listeners = []
|
11
|
+
}
|
12
|
+
|
13
|
+
/**
|
14
|
+
* Returns the custom event names
|
15
|
+
* @param {String} name The base event name
|
16
|
+
* @returns {String}
|
17
|
+
*/
|
18
|
+
__getEventName ( name ) {
|
19
|
+
return name // 'shimmer' + name.charAt( 0 ).toUpperCase() + name.slice( 1 )
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* Returns the pixi element at position { x,y }
|
24
|
+
* @param {Integer} x The x coordonate on the renderer
|
25
|
+
* @param {Integer} y The y coordonate on the renderer
|
26
|
+
* @returns {DisplayObject}
|
27
|
+
*/
|
28
|
+
__getTarget ( x, y ) {
|
29
|
+
let target = this.__renderer.plugins.interaction.hitTest( { x: x, y: y } )
|
30
|
+
if ( target && target.interactive ) {
|
31
|
+
return target
|
32
|
+
}
|
33
|
+
return null
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* Enables mouse wheel event on elements
|
38
|
+
*/
|
39
|
+
enableWheel () {
|
40
|
+
let onPush = ( e ) => {
|
41
|
+
let target = this.__getTarget( e.offsetX, e.offsetY )
|
42
|
+
if ( target && target.interactive ) {
|
43
|
+
target.emit( this.__getEventName( 'wheel' ), e )
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
this.__renderer.view.addEventListener( 'wheel', onPush, { passive: false } )
|
48
|
+
this.__listeners.push( () => {
|
49
|
+
this.__renderer.view.removeEventListener( 'wheel', onPush, { passive: false } )
|
50
|
+
} )
|
51
|
+
}
|
52
|
+
|
53
|
+
/**
|
54
|
+
* Enables long taps ( long clicks ) event on elements
|
55
|
+
*/
|
56
|
+
enableLongtap () {
|
57
|
+
let onPush = ( e ) => {
|
58
|
+
let target = this.__getTarget( e.offsetX, e.offsetY )
|
59
|
+
let timeout = null
|
60
|
+
if ( target && target.interactive ) {
|
61
|
+
timeout = setTimeout( () => {
|
62
|
+
target.emit( this.__getEventName( 'longtap' ), e )
|
63
|
+
}, 700 )
|
64
|
+
}
|
65
|
+
|
66
|
+
let onRelease = () => {
|
67
|
+
clearTimeout( timeout )
|
68
|
+
}
|
69
|
+
|
70
|
+
this.__renderer.view.addEventListener( 'touchend', onRelease, { once: true } )
|
71
|
+
this.__renderer.view.addEventListener( 'mouseup', onRelease, { once: true } )
|
72
|
+
}
|
73
|
+
|
74
|
+
this.__renderer.view.addEventListener( 'touchstart', onPush, { passive: false } )
|
75
|
+
this.__listeners.push( () => {
|
76
|
+
this.__renderer.view.removeEventListener( 'touchstart', onPush )
|
77
|
+
} )
|
78
|
+
|
79
|
+
this.__renderer.view.addEventListener( 'mousedown', onPush, { passive: false } )
|
80
|
+
this.__listeners.push( () => {
|
81
|
+
this.__renderer.view.removeEventListener( 'mousedown', onPush )
|
82
|
+
} )
|
83
|
+
}
|
84
|
+
|
85
|
+
/**
|
86
|
+
* Destroys all listeners
|
87
|
+
*/
|
88
|
+
destroy () {
|
89
|
+
this.__listeners.map( ( removeListener ) => {
|
90
|
+
removeListener()
|
91
|
+
return true
|
92
|
+
} )
|
93
|
+
this.__listeners = []
|
94
|
+
}
|
95
|
+
}
|
@@ -0,0 +1,154 @@
|
|
1
|
+
'use strict'
|
2
|
+
|
3
|
+
import { loop, uid } from '@crispcode/modux'
|
4
|
+
|
5
|
+
import { Container } from '@pixi/display'
|
6
|
+
|
7
|
+
import { Tween } from './tween.js'
|
8
|
+
|
9
|
+
/**
|
10
|
+
* This class is used to create elements for shimmer
|
11
|
+
*/
|
12
|
+
export class Element extends Container {
|
13
|
+
/**
|
14
|
+
* Creates an instance of Element
|
15
|
+
*/
|
16
|
+
constructor () {
|
17
|
+
super()
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Stores the current horizontal position of the Element
|
21
|
+
* @type {Number}
|
22
|
+
*/
|
23
|
+
this.x = 0
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Stores the current vertical position of the Element
|
27
|
+
* @type {Number}
|
28
|
+
*/
|
29
|
+
this.y = 0
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Stores the current alpha value for the Element
|
33
|
+
* @type {Number}
|
34
|
+
*/
|
35
|
+
this.alpha = 1
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Holds all the Tween instances for the Element
|
39
|
+
* @type {Object}
|
40
|
+
* @private
|
41
|
+
*/
|
42
|
+
this.__tweens = {}
|
43
|
+
|
44
|
+
/**
|
45
|
+
* Holds all the sub elements of the Element
|
46
|
+
* @type {Object}
|
47
|
+
* @private
|
48
|
+
*/
|
49
|
+
this.__children = {}
|
50
|
+
}
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Creates a new tween for the Element
|
54
|
+
* @param {Number} from The start point for the Tween
|
55
|
+
* @param {Number} to The end point for the Tween
|
56
|
+
* @param {Number} step The step value for the Tween
|
57
|
+
* @param {Function} oneach A listener which gets called on each Tween step
|
58
|
+
* @param {String} id An specific identifier to use in this element. If not defined, a random unique one will be used.
|
59
|
+
* @return {Promise} The promise is resolved on tween end
|
60
|
+
*/
|
61
|
+
createTween ( from, to, step, oneach, id ) {
|
62
|
+
return new Promise( ( resolve ) => {
|
63
|
+
id = id || uid()
|
64
|
+
let tween = new Tween( from, to, step )
|
65
|
+
tween.end( () => {
|
66
|
+
delete this.__tweens[ id ]
|
67
|
+
resolve()
|
68
|
+
} )
|
69
|
+
if ( typeof oneach === 'function' ) {
|
70
|
+
tween.each( oneach )
|
71
|
+
}
|
72
|
+
this.__tweens[ id ] = tween
|
73
|
+
} )
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Removes a tween from the element
|
78
|
+
* @param {String} id An specific identifier to used remove tweens from the element
|
79
|
+
*/
|
80
|
+
removeTween ( id ) {
|
81
|
+
if ( id ) {
|
82
|
+
delete this.__tweens[ id ]
|
83
|
+
} else {
|
84
|
+
this.__tweens = {}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Adds a sub element. An element child
|
90
|
+
* @param {String} id An identifier for the added child
|
91
|
+
* @param {Element} element An instance of the Element class
|
92
|
+
* @return {Element} The current instance
|
93
|
+
*/
|
94
|
+
addElementChild ( id, element ) {
|
95
|
+
super.addChild( element )
|
96
|
+
this.__children[ id ] = element
|
97
|
+
return this
|
98
|
+
}
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Removes a sub element. An element child
|
102
|
+
* @param {String} id An identifier used to find the child
|
103
|
+
* @return {Element} The current instance
|
104
|
+
*/
|
105
|
+
removeElementChild ( id ) {
|
106
|
+
let element = this.__children[ id ]
|
107
|
+
super.removeChild( element )
|
108
|
+
delete this.__children[ id ]
|
109
|
+
return this
|
110
|
+
}
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Returns a child or all child Elements
|
114
|
+
* @param {String} [name=null] If provided, will return the child with this identifier
|
115
|
+
* @return {Object} An object containing all the child Elements
|
116
|
+
*/
|
117
|
+
getElementChild ( name ) {
|
118
|
+
if ( name ) {
|
119
|
+
return this.__children[ name ]
|
120
|
+
}
|
121
|
+
return this.__children
|
122
|
+
}
|
123
|
+
|
124
|
+
/**
|
125
|
+
* Sets element visibility to true
|
126
|
+
* @return {Promise} A promise wich is resolved once the method is fully executed
|
127
|
+
*/
|
128
|
+
show () {
|
129
|
+
this.alpha = 1
|
130
|
+
return Promise.resolve()
|
131
|
+
}
|
132
|
+
|
133
|
+
/**
|
134
|
+
* Sets element visibility to false
|
135
|
+
* @return {Promise} A promise wich is resolved once the method is fully executed
|
136
|
+
*/
|
137
|
+
hide () {
|
138
|
+
this.alpha = 0
|
139
|
+
return Promise.resolve()
|
140
|
+
}
|
141
|
+
|
142
|
+
/**
|
143
|
+
* A method called by the renderer on each animation frame
|
144
|
+
* @param {Number} delta The delta time between cycles
|
145
|
+
*/
|
146
|
+
tick ( delta ) {
|
147
|
+
loop( this.__tweens, ( tween ) => {
|
148
|
+
tween.next( delta )
|
149
|
+
} )
|
150
|
+
loop( this.getElementChild(), ( element ) => {
|
151
|
+
element.tick( delta )
|
152
|
+
} )
|
153
|
+
}
|
154
|
+
}
|
package/scripts/index.js
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
'use strict'
|
2
|
+
|
3
|
+
import { Shimmer } from './shimmer.js'
|
4
|
+
|
5
|
+
import { Button } from './button.js'
|
6
|
+
import { Element } from './element.js'
|
7
|
+
import { Tween } from './tween.js'
|
8
|
+
|
9
|
+
import { Sprite } from '@pixi/sprite'
|
10
|
+
import { AnimatedSprite } from '@pixi/sprite-animated'
|
11
|
+
import { Text } from '@pixi/text'
|
12
|
+
import { Graphics } from '@pixi/graphics'
|
13
|
+
import { BaseTexture, Texture } from '@pixi/core'
|
14
|
+
|
15
|
+
export {
|
16
|
+
Shimmer,
|
17
|
+
|
18
|
+
Button,
|
19
|
+
Element,
|
20
|
+
Tween,
|
21
|
+
|
22
|
+
Sprite,
|
23
|
+
AnimatedSprite,
|
24
|
+
Text,
|
25
|
+
Texture,
|
26
|
+
BaseTexture,
|
27
|
+
Graphics
|
28
|
+
}
|
@@ -0,0 +1,195 @@
|
|
1
|
+
/* globals window */
|
2
|
+
|
3
|
+
'use strict'
|
4
|
+
|
5
|
+
import { Component, extend, loop, logger } from '@crispcode/modux'
|
6
|
+
|
7
|
+
import { autoDetectRenderer, Renderer, BatchRenderer } from '@pixi/core'
|
8
|
+
import { Loader } from '@pixi/loaders'
|
9
|
+
import { Ticker } from '@pixi/ticker'
|
10
|
+
import { InteractionManager } from '@pixi/interaction'
|
11
|
+
import { skipHello, isWebGLSupported } from '@pixi/utils'
|
12
|
+
|
13
|
+
// Canvas support
|
14
|
+
import '@pixi/canvas-display'
|
15
|
+
import { CanvasExtract } from '@pixi/canvas-extract'
|
16
|
+
import { CanvasGraphicsRenderer } from '@pixi/canvas-graphics'
|
17
|
+
import { CanvasMeshRenderer } from '@pixi/canvas-mesh'
|
18
|
+
import '@pixi/canvas-particle-container'
|
19
|
+
import { CanvasPrepare } from '@pixi/canvas-prepare'
|
20
|
+
import { CanvasRenderer } from '@pixi/canvas-renderer'
|
21
|
+
import '@pixi/canvas-sprite-tiling'
|
22
|
+
import { CanvasSpriteRenderer } from '@pixi/canvas-sprite'
|
23
|
+
import '@pixi/canvas-text'
|
24
|
+
|
25
|
+
import { Element } from './element.js'
|
26
|
+
import { Controls } from './controls.js'
|
27
|
+
|
28
|
+
Renderer.registerPlugin( 'interaction', InteractionManager )
|
29
|
+
Renderer.registerPlugin( 'batch', BatchRenderer )
|
30
|
+
|
31
|
+
CanvasRenderer.registerPlugin( 'interaction', InteractionManager )
|
32
|
+
CanvasRenderer.registerPlugin( 'extract', CanvasExtract )
|
33
|
+
CanvasRenderer.registerPlugin( 'graphics', CanvasGraphicsRenderer )
|
34
|
+
CanvasRenderer.registerPlugin( 'mesh', CanvasMeshRenderer )
|
35
|
+
CanvasRenderer.registerPlugin( 'prepare', CanvasPrepare )
|
36
|
+
CanvasRenderer.registerPlugin( 'sprite', CanvasSpriteRenderer )
|
37
|
+
|
38
|
+
/**
|
39
|
+
* This class is used to create the shimmer component
|
40
|
+
*/
|
41
|
+
export class Shimmer extends Component {
|
42
|
+
/**
|
43
|
+
* The html string that becomes the view for this component
|
44
|
+
* @type {String}
|
45
|
+
*/
|
46
|
+
get template () {
|
47
|
+
return '<canvas style="display: block; width: 100%; height: 100%;"></canvas>'
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* The initialization options for shimmer
|
52
|
+
* @type {Object}
|
53
|
+
*/
|
54
|
+
get settings () {
|
55
|
+
return {}
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* The method gets called whenever the container is resized
|
60
|
+
* @param {Number} width The width of the container
|
61
|
+
* @param {Number} height The height of the container
|
62
|
+
*/
|
63
|
+
onResize ( width, height ) {
|
64
|
+
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* This method preloads a colection of assets
|
69
|
+
* @param {Object} assets A collection of assets
|
70
|
+
* @return {Promise} A promise which is resolved upon loading the assets. It resolves the loaded resources.
|
71
|
+
*/
|
72
|
+
preload ( assets ) {
|
73
|
+
let loader = new Loader()
|
74
|
+
return new Promise( ( resolve ) => {
|
75
|
+
loop( assets, ( data, name ) => {
|
76
|
+
loader.add( name, data )
|
77
|
+
} )
|
78
|
+
loader.load( ( loader, resources ) => {
|
79
|
+
resolve( resources )
|
80
|
+
} )
|
81
|
+
} )
|
82
|
+
}
|
83
|
+
|
84
|
+
/**
|
85
|
+
* Creates an instance of Shimmer
|
86
|
+
* @param {HTMLElement} parent The parent wrapper
|
87
|
+
* @param {Module} module The parent module instance
|
88
|
+
* @param {Store} store An instance of @crispcode/pushstore, see https://www.npmjs.com/package/@crispcode/pushstore
|
89
|
+
*/
|
90
|
+
constructor ( parent, module, store ) {
|
91
|
+
super( parent, module, store )
|
92
|
+
|
93
|
+
skipHello()
|
94
|
+
|
95
|
+
/**
|
96
|
+
* Stores the parent Element
|
97
|
+
* @type {Element}
|
98
|
+
*/
|
99
|
+
this.stage = new Element()
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Holds the previous width and height of the element
|
103
|
+
* @type {Object}
|
104
|
+
* @private
|
105
|
+
*/
|
106
|
+
let previousElementSize = {}
|
107
|
+
/**
|
108
|
+
* Determines if the component watches for resize changes in parent dimensions
|
109
|
+
* @type {Boolean}
|
110
|
+
* @private
|
111
|
+
*/
|
112
|
+
this.__resizeWatcher = true
|
113
|
+
/**
|
114
|
+
* This function checks for element size changes every 100ms as long as the component exists
|
115
|
+
* @type {Function}
|
116
|
+
* @private
|
117
|
+
*/
|
118
|
+
const parentResizeCheck = () => {
|
119
|
+
setTimeout( () => {
|
120
|
+
if ( this.__resizeWatcher ) {
|
121
|
+
if ( previousElementSize.width !== this.element.clientWidth || previousElementSize.height !== this.element.clientHeight ) {
|
122
|
+
previousElementSize.width = this.element.clientWidth
|
123
|
+
previousElementSize.height = this.element.clientHeight
|
124
|
+
this.onResize( previousElementSize.width, previousElementSize.height )
|
125
|
+
}
|
126
|
+
parentResizeCheck()
|
127
|
+
}
|
128
|
+
}, 100 )
|
129
|
+
}
|
130
|
+
parentResizeCheck()
|
131
|
+
|
132
|
+
/**
|
133
|
+
* Stores the main ticker, which handles animation frames
|
134
|
+
* @type {Ticker}
|
135
|
+
*/
|
136
|
+
this.ticker = new Ticker()
|
137
|
+
this.ticker.add( ( delta ) => {
|
138
|
+
this.stage.tick( delta )
|
139
|
+
this.renderer.render( this.stage )
|
140
|
+
} )
|
141
|
+
|
142
|
+
/**
|
143
|
+
* Renderer initialization settings
|
144
|
+
* @type {Object}
|
145
|
+
* @private
|
146
|
+
*/
|
147
|
+
const rendererSettings = extend( {
|
148
|
+
view: this.element,
|
149
|
+
autoDensity: false,
|
150
|
+
backgroundAlpha: 0,
|
151
|
+
backgroundColor: 0x000000,
|
152
|
+
antialias: true,
|
153
|
+
resolution: window.devicePixelRatio || 1
|
154
|
+
}, {
|
155
|
+
autoDensity: this.settings.autoDensity,
|
156
|
+
backgroundAlpha: this.settings.backgroundAlpha,
|
157
|
+
backgroundColor: this.settings.backgroundColor,
|
158
|
+
antialias: this.settings.antialias,
|
159
|
+
resolution: this.settings.resolution
|
160
|
+
} )
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Stores the renderer
|
164
|
+
* @type {Renderer}
|
165
|
+
*/
|
166
|
+
this.renderer = ( isWebGLSupported() && !this.settings.forceCanvas ) ? autoDetectRenderer( rendererSettings ) : new CanvasRenderer( rendererSettings )
|
167
|
+
|
168
|
+
this.renderer.resize( this.element.clientWidth, this.element.clientHeight )
|
169
|
+
|
170
|
+
this.renderer.plugins.interaction.autoPreventDefault = false
|
171
|
+
|
172
|
+
if ( !isWebGLSupported() ) {
|
173
|
+
logger.warn( 'WebGL is not supported. Using Canvas fallback.' )
|
174
|
+
}
|
175
|
+
|
176
|
+
/**
|
177
|
+
* Stores the controls class, responsible with implementing special gestures
|
178
|
+
*/
|
179
|
+
this.controls = new Controls( this.renderer )
|
180
|
+
this.controls.enableWheel()
|
181
|
+
this.controls.enableLongtap()
|
182
|
+
}
|
183
|
+
|
184
|
+
/**
|
185
|
+
* The method gets called when the component is destroyed
|
186
|
+
*/
|
187
|
+
__destroy () {
|
188
|
+
super.__destroy()
|
189
|
+
this.controls.destroy()
|
190
|
+
this.__resizeWatcher = false
|
191
|
+
if ( this.ticker.started ) {
|
192
|
+
this.ticker.stop()
|
193
|
+
}
|
194
|
+
}
|
195
|
+
}
|
package/scripts/tween.js
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
'use strict'
|
2
|
+
|
3
|
+
import { approx, loop } from '@crispcode/modux'
|
4
|
+
|
5
|
+
/**
|
6
|
+
* This class is used to create a tween
|
7
|
+
*/
|
8
|
+
export class Tween {
|
9
|
+
/**
|
10
|
+
* Creates an instance of Shimmer
|
11
|
+
* @param {Number} from The start number
|
12
|
+
* @param {Number} to The end number
|
13
|
+
* @param {Number} step The value to increment by on each render
|
14
|
+
*/
|
15
|
+
constructor ( from, to, step ) {
|
16
|
+
/**
|
17
|
+
* Stores all event handlers attached
|
18
|
+
* @type {Object}
|
19
|
+
* @private
|
20
|
+
*/
|
21
|
+
this.__eventHandlers = {}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* Stores the starting point for the loop
|
25
|
+
* @type {Number}
|
26
|
+
*/
|
27
|
+
this.from = from || 0
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Stores the end point for the loop
|
31
|
+
* @type {Number}
|
32
|
+
*/
|
33
|
+
this.to = to || 0
|
34
|
+
|
35
|
+
/**
|
36
|
+
* Stores the step value for the loop
|
37
|
+
* @type {Number}
|
38
|
+
*/
|
39
|
+
this.step = step || 0
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Stores the current frame in the tween
|
43
|
+
* @type {Number}
|
44
|
+
* @private
|
45
|
+
*/
|
46
|
+
this.__current = this.from
|
47
|
+
}
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Method to attach an event listener to tween
|
51
|
+
* @param {String} ev The event name
|
52
|
+
* @param {Function} handler The event handler to be attached to the tween
|
53
|
+
* @return {Tween} Returns the instance of the class
|
54
|
+
*/
|
55
|
+
on ( ev, handler ) {
|
56
|
+
this.__eventHandlers[ ev ] = this.__eventHandlers[ ev ] || []
|
57
|
+
if ( typeof handler !== 'function' ) {
|
58
|
+
throw new Error( 'Tween expects an event handler ( function ) ' + ( typeof handler ) + ' given' )
|
59
|
+
}
|
60
|
+
this.__eventHandlers[ ev ].push( handler )
|
61
|
+
return this
|
62
|
+
}
|
63
|
+
|
64
|
+
// Shorthand event handlers
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Short hand for the onEach event listener to attach
|
68
|
+
* @param {Function} handler The event handler to be attached to the tween
|
69
|
+
* @return {Tween} Returns the instance of the class
|
70
|
+
*/
|
71
|
+
each ( handler ) {
|
72
|
+
return this.on( 'each', handler )
|
73
|
+
}
|
74
|
+
/**
|
75
|
+
* Short hand for the onEnd event listener to attach
|
76
|
+
* @param {Function} handler The event handler to be attached to the tween
|
77
|
+
* @return {Tween} Returns the instance of the class
|
78
|
+
*/
|
79
|
+
end ( handler ) {
|
80
|
+
return this.on( 'end', handler )
|
81
|
+
}
|
82
|
+
|
83
|
+
/**
|
84
|
+
* Calls every event listener attached to the class
|
85
|
+
* @param {String} name The event name
|
86
|
+
* @param {Number} value The value to be sent to each handler
|
87
|
+
* @private
|
88
|
+
*/
|
89
|
+
__triggerEvent ( name, value ) {
|
90
|
+
let events = this.__eventHandlers[ name ] || []
|
91
|
+
loop( events, ( event ) => {
|
92
|
+
event.call( this, value )
|
93
|
+
} )
|
94
|
+
}
|
95
|
+
|
96
|
+
/**
|
97
|
+
* Moves to a specific position in the tween
|
98
|
+
* @param {Number} frame The numeric position to move to in the tween
|
99
|
+
* @return {Tween} Returns the instance of the class
|
100
|
+
*/
|
101
|
+
goto ( frame ) {
|
102
|
+
if ( frame ) {
|
103
|
+
this.__current = frame
|
104
|
+
} else {
|
105
|
+
this.__current = this.from
|
106
|
+
}
|
107
|
+
return this
|
108
|
+
}
|
109
|
+
|
110
|
+
/**
|
111
|
+
* Method moves forward in the tween based on the detal
|
112
|
+
* @param {Number} delta The time interval caused by FPS
|
113
|
+
*/
|
114
|
+
next ( delta ) {
|
115
|
+
this.__current = approx( this.__current + approx( this.step * delta, 6 ), 6 )
|
116
|
+
|
117
|
+
if (
|
118
|
+
( ( this.from <= this.to ) && ( this.__current >= this.to ) ) ||
|
119
|
+
( ( this.from >= this.to ) && ( this.__current <= this.to ) )
|
120
|
+
) {
|
121
|
+
// End
|
122
|
+
this.__triggerEvent( 'end' )
|
123
|
+
this.__current = this.to
|
124
|
+
}
|
125
|
+
|
126
|
+
this.__triggerEvent( 'each', this.__current )
|
127
|
+
}
|
128
|
+
|
129
|
+
/**
|
130
|
+
* Method moves backwards in the tween based on the detal
|
131
|
+
* @param {Number} delta The time interval caused by FPS
|
132
|
+
*/
|
133
|
+
prev ( delta ) {
|
134
|
+
this.__current = approx( this.__current - approx( this.step * delta, 6 ), 6 )
|
135
|
+
|
136
|
+
if (
|
137
|
+
( ( this.from <= this.to ) && ( this.__current <= this.from ) ) ||
|
138
|
+
( ( this.from >= this.to ) && ( this.__current >= this.from ) )
|
139
|
+
) {
|
140
|
+
// End
|
141
|
+
this.__triggerEvent( 'end' )
|
142
|
+
this.__current = this.from
|
143
|
+
}
|
144
|
+
|
145
|
+
this.__triggerEvent( 'each', this.__current )
|
146
|
+
}
|
147
|
+
}
|
package/test/app.html
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<head>
|
3
|
+
<title> Shimmer </title>
|
4
|
+
|
5
|
+
<meta name="apple-mobile-web-app-capable" content="yes" />
|
6
|
+
<meta name="mobile-web-app-capable" content="yes" />
|
7
|
+
<meta name="format-detection" content="telephone=no">
|
8
|
+
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no">
|
9
|
+
|
10
|
+
<meta name="HandheldFriendly" content="true" />
|
11
|
+
<meta name="apple-mobile-web-app-capable" content="yes" />
|
12
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
13
|
+
<meta name="apple-mobile-web-app-title" content="Open the Box">
|
14
|
+
|
15
|
+
<script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js?flags=gated&features=default%2CMutationObserver%2CString.prototype.padStart%2Cconsole.info"></script>
|
16
|
+
|
17
|
+
<base href="/" />
|
18
|
+
|
19
|
+
<link rel="stylesheet" href="app.min.css" />
|
20
|
+
|
21
|
+
<script>
|
22
|
+
var config = {
|
23
|
+
debug: true
|
24
|
+
}
|
25
|
+
</script>
|
26
|
+
</head>
|
27
|
+
<body>
|
28
|
+
<script src="app.min.js"></script>
|
29
|
+
</body>
|
30
|
+
</html>
|
package/test/app.js
ADDED
Binary file
|
Binary file
|