jqtools-rails 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/README.md +56 -0
- data/VERSION +1 -1
- data/jqtools-rails.gemspec +8 -3
- data/lib/jqtools-rails.rb +2 -0
- data/vendor/assets/javascripts/effect/fullscreen.jquery.js +0 -0
- data/vendor/assets/javascripts/knobs/knobs.jquery.js +120 -0
- data/vendor/assets/javascripts/knobs/transform.js +532 -0
- data/vendor/assets/stylesheets/knobs.css +51 -0
- metadata +8 -3
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -2,10 +2,16 @@
|
|
2
2
|
|
3
3
|
This gem is a Rails engine and is configured to integrate with Rails asset pipeline.
|
4
4
|
|
5
|
+
This gem was extracted from the JQuery Tools project, v1.2.6
|
6
|
+
|
7
|
+
## Install
|
8
|
+
|
5
9
|
Simply add to Gemfile and bundle:
|
6
10
|
|
7
11
|
`gem 'jqtools-rails'`
|
8
12
|
|
13
|
+
## Add tools
|
14
|
+
|
9
15
|
You can choose to use either the minified js for all the tools:
|
10
16
|
|
11
17
|
```text
|
@@ -21,6 +27,56 @@ Or the tools individually
|
|
21
27
|
//= require dateinput/dateinput.js
|
22
28
|
```
|
23
29
|
|
30
|
+
## Tools included
|
31
|
+
|
32
|
+
* dateinput
|
33
|
+
* overlay
|
34
|
+
* rangeinput
|
35
|
+
* tabs
|
36
|
+
* toolbox
|
37
|
+
* tooltip
|
38
|
+
* validator
|
39
|
+
|
40
|
+
In addition to the original toolset, the following have been added:
|
41
|
+
|
42
|
+
* fullscreen
|
43
|
+
* knobs
|
44
|
+
|
45
|
+
## Fullscreen
|
46
|
+
|
47
|
+
See [jQuery-FullScreen](https://github.com/martinaglv/jQuery-FullScreen)
|
48
|
+
|
49
|
+
```javascript
|
50
|
+
// The plugin sets the $.support.fullscreen flag:
|
51
|
+
if($.support.fullscreen){
|
52
|
+
|
53
|
+
// Show your full screen button here
|
54
|
+
|
55
|
+
$('#fullScreen').click(function(e){
|
56
|
+
$('#content').fullScreen();
|
57
|
+
});
|
58
|
+
}
|
59
|
+
```
|
60
|
+
|
61
|
+
## Knobs
|
62
|
+
|
63
|
+
See [KnobKnob](https://github.com/martinaglv/KnobKnob)
|
64
|
+
|
65
|
+
```javascript
|
66
|
+
$('#elem').knobKnob({
|
67
|
+
snap : 10, // Snap to zero if less than this deg.
|
68
|
+
value: 154, // Default rotation
|
69
|
+
turn : function(ratio){
|
70
|
+
// Do what you want here. Ratio moves from 0 to 1
|
71
|
+
// relative to the knob rotation. 0 - off, 1 - max
|
72
|
+
}
|
73
|
+
});
|
74
|
+
``
|
75
|
+
|
76
|
+
Demo [pretty-switches](http://tutorialzine.com/2011/11/pretty-switches-css3-jquery/)
|
77
|
+
|
78
|
+
Note: You also need to add `knobs.css` to your project, fx using your `application.css` manifest.
|
79
|
+
|
24
80
|
## Contributing to jqtools-rails
|
25
81
|
|
26
82
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/jqtools-rails.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "jqtools-rails"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kristian Mandrup"]
|
12
|
-
s.date = "2012-08-
|
12
|
+
s.date = "2012-08-26"
|
13
13
|
s.description = "Gem is an engine and is configured to integrate with Rails asset pipeline"
|
14
14
|
s.email = "kmandrup@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
21
|
".rspec",
|
22
|
+
"CHANGELOG.md",
|
22
23
|
"Gemfile",
|
23
24
|
"Gemfile.lock",
|
24
25
|
"LICENSE.txt",
|
@@ -30,7 +31,10 @@ Gem::Specification.new do |s|
|
|
30
31
|
"spec/jqtools-rails_spec.rb",
|
31
32
|
"spec/spec_helper.rb",
|
32
33
|
"vendor/assets/javascripts/dateinput/dateinput.js",
|
34
|
+
"vendor/assets/javascripts/effect/fullscreen.jquery.js",
|
33
35
|
"vendor/assets/javascripts/jquery.tools.min.js",
|
36
|
+
"vendor/assets/javascripts/knobs/knobs.jquery.js",
|
37
|
+
"vendor/assets/javascripts/knobs/transform.js",
|
34
38
|
"vendor/assets/javascripts/overlay/overlay.apple.js",
|
35
39
|
"vendor/assets/javascripts/overlay/overlay.js",
|
36
40
|
"vendor/assets/javascripts/rangeinput/rangeinput.js",
|
@@ -46,7 +50,8 @@ Gem::Specification.new do |s|
|
|
46
50
|
"vendor/assets/javascripts/tooltip/tooltip.dynamic.js",
|
47
51
|
"vendor/assets/javascripts/tooltip/tooltip.js",
|
48
52
|
"vendor/assets/javascripts/tooltip/tooltip.slide.js",
|
49
|
-
"vendor/assets/javascripts/validator/validator.js"
|
53
|
+
"vendor/assets/javascripts/validator/validator.js",
|
54
|
+
"vendor/assets/stylesheets/knobs.css"
|
50
55
|
]
|
51
56
|
s.homepage = "http://github.com/kristianmandrup/jqtools-rails"
|
52
57
|
s.licenses = ["MIT"]
|
data/lib/jqtools-rails.rb
CHANGED
File without changes
|
@@ -0,0 +1,120 @@
|
|
1
|
+
/**
|
2
|
+
* @name jQuery KnobKnob plugin
|
3
|
+
* @author Martin Angelov
|
4
|
+
* @version 1.0
|
5
|
+
* @url http://tutorialzine.com/2011/11/pretty-switches-css3-jquery/
|
6
|
+
* @license MIT License
|
7
|
+
*/
|
8
|
+
|
9
|
+
(function($){
|
10
|
+
|
11
|
+
$.fn.knobKnob = function(props){
|
12
|
+
|
13
|
+
var options = $.extend({
|
14
|
+
snap: 0,
|
15
|
+
value: 0,
|
16
|
+
turn: function(){}
|
17
|
+
}, props || {});
|
18
|
+
|
19
|
+
var tpl = '<div class="knob">\
|
20
|
+
<div class="top"></div>\
|
21
|
+
<div class="base"></div>\
|
22
|
+
</div>';
|
23
|
+
|
24
|
+
return this.each(function(){
|
25
|
+
|
26
|
+
var el = $(this);
|
27
|
+
el.append(tpl);
|
28
|
+
|
29
|
+
var knob = $('.knob',el),
|
30
|
+
knobTop = knob.find('.top'),
|
31
|
+
startDeg = -1,
|
32
|
+
currentDeg = 0,
|
33
|
+
rotation = 0,
|
34
|
+
lastDeg = 0,
|
35
|
+
doc = $(document);
|
36
|
+
|
37
|
+
if(options.value > 0 && options.value <= 359){
|
38
|
+
rotation = lastDeg = currentDeg = options.value;
|
39
|
+
knobTop.css('transform','rotate('+(currentDeg)+'deg)');
|
40
|
+
options.turn(currentDeg/359);
|
41
|
+
}
|
42
|
+
|
43
|
+
knob.on('mousedown touchstart', function(e){
|
44
|
+
|
45
|
+
e.preventDefault();
|
46
|
+
|
47
|
+
var offset = knob.offset();
|
48
|
+
var center = {
|
49
|
+
y : offset.top + knob.height()/2,
|
50
|
+
x: offset.left + knob.width()/2
|
51
|
+
};
|
52
|
+
|
53
|
+
var a, b, deg, tmp,
|
54
|
+
rad2deg = 180/Math.PI;
|
55
|
+
|
56
|
+
knob.on('mousemove.rem touchmove.rem',function(e){
|
57
|
+
|
58
|
+
e = (e.originalEvent.touches) ? e.originalEvent.touches[0] : e;
|
59
|
+
|
60
|
+
a = center.y - e.pageY;
|
61
|
+
b = center.x - e.pageX;
|
62
|
+
deg = Math.atan2(a,b)*rad2deg;
|
63
|
+
|
64
|
+
// we have to make sure that negative
|
65
|
+
// angles are turned into positive:
|
66
|
+
if(deg<0){
|
67
|
+
deg = 360 + deg;
|
68
|
+
}
|
69
|
+
|
70
|
+
// Save the starting position of the drag
|
71
|
+
if(startDeg == -1){
|
72
|
+
startDeg = deg;
|
73
|
+
}
|
74
|
+
|
75
|
+
// Calculating the current rotation
|
76
|
+
tmp = Math.floor((deg-startDeg) + rotation);
|
77
|
+
|
78
|
+
// Making sure the current rotation
|
79
|
+
// stays between 0 and 359
|
80
|
+
if(tmp < 0){
|
81
|
+
tmp = 360 + tmp;
|
82
|
+
}
|
83
|
+
else if(tmp > 359){
|
84
|
+
tmp = tmp % 360;
|
85
|
+
}
|
86
|
+
|
87
|
+
// Snapping in the off position:
|
88
|
+
if(options.snap && tmp < options.snap){
|
89
|
+
tmp = 0;
|
90
|
+
}
|
91
|
+
|
92
|
+
// This would suggest we are at an end position;
|
93
|
+
// we need to block further rotation.
|
94
|
+
if(Math.abs(tmp - lastDeg) > 180){
|
95
|
+
return false;
|
96
|
+
}
|
97
|
+
|
98
|
+
currentDeg = tmp;
|
99
|
+
lastDeg = tmp;
|
100
|
+
|
101
|
+
knobTop.css('transform','rotate('+(currentDeg)+'deg)');
|
102
|
+
options.turn(currentDeg/360);
|
103
|
+
});
|
104
|
+
|
105
|
+
doc.on('mouseup.rem touchend.rem',function(){
|
106
|
+
knob.off('.rem');
|
107
|
+
doc.off('.rem');
|
108
|
+
|
109
|
+
// Saving the current rotation
|
110
|
+
rotation = currentDeg;
|
111
|
+
|
112
|
+
// Marking the starting degree as invalid
|
113
|
+
startDeg = -1;
|
114
|
+
});
|
115
|
+
|
116
|
+
});
|
117
|
+
});
|
118
|
+
};
|
119
|
+
|
120
|
+
})(jQuery);
|
@@ -0,0 +1,532 @@
|
|
1
|
+
/*
|
2
|
+
* transform: A jQuery cssHooks adding cross-browser 2d transform capabilities to $.fn.css() and $.fn.animate()
|
3
|
+
*
|
4
|
+
* limitations:
|
5
|
+
* - requires jQuery 1.4.3+
|
6
|
+
* - Should you use the *translate* property, then your elements need to be absolutely positionned in a relatively positionned wrapper **or it will fail in IE678**.
|
7
|
+
* - transformOrigin is not accessible
|
8
|
+
*
|
9
|
+
* latest version and complete README available on Github:
|
10
|
+
* https://github.com/louisremi/jquery.transform.js
|
11
|
+
*
|
12
|
+
* Copyright 2011 @louis_remi
|
13
|
+
* Licensed under the MIT license.
|
14
|
+
*
|
15
|
+
* This saved you an hour of work?
|
16
|
+
* Send me music http://www.amazon.co.uk/wishlist/HNTU0468LQON
|
17
|
+
*
|
18
|
+
*/
|
19
|
+
(function( $ ) {
|
20
|
+
|
21
|
+
/*
|
22
|
+
* Feature tests and global variables
|
23
|
+
*/
|
24
|
+
var div = document.createElement('div'),
|
25
|
+
divStyle = div.style,
|
26
|
+
propertyName = 'transform',
|
27
|
+
suffix = 'Transform',
|
28
|
+
testProperties = [
|
29
|
+
'O' + suffix,
|
30
|
+
'ms' + suffix,
|
31
|
+
'Webkit' + suffix,
|
32
|
+
'Moz' + suffix,
|
33
|
+
// prefix-less property
|
34
|
+
propertyName
|
35
|
+
],
|
36
|
+
i = testProperties.length,
|
37
|
+
supportProperty,
|
38
|
+
supportMatrixFilter,
|
39
|
+
propertyHook,
|
40
|
+
propertyGet,
|
41
|
+
rMatrix = /Matrix([^)]*)/;
|
42
|
+
|
43
|
+
// test different vendor prefixes of this property
|
44
|
+
while ( i-- ) {
|
45
|
+
if ( testProperties[i] in divStyle ) {
|
46
|
+
$.support[propertyName] = supportProperty = testProperties[i];
|
47
|
+
continue;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
// IE678 alternative
|
51
|
+
if ( !supportProperty ) {
|
52
|
+
$.support.matrixFilter = supportMatrixFilter = divStyle.filter === '';
|
53
|
+
}
|
54
|
+
// prevent IE memory leak
|
55
|
+
div = divStyle = null;
|
56
|
+
|
57
|
+
// px isn't the default unit of this property
|
58
|
+
$.cssNumber[propertyName] = true;
|
59
|
+
|
60
|
+
/*
|
61
|
+
* fn.css() hooks
|
62
|
+
*/
|
63
|
+
if ( supportProperty && supportProperty != propertyName ) {
|
64
|
+
// Modern browsers can use jQuery.cssProps as a basic hook
|
65
|
+
$.cssProps[propertyName] = supportProperty;
|
66
|
+
|
67
|
+
// Firefox needs a complete hook because it stuffs matrix with 'px'
|
68
|
+
if ( supportProperty == 'Moz' + suffix ) {
|
69
|
+
propertyHook = {
|
70
|
+
get: function( elem, computed ) {
|
71
|
+
return (computed ?
|
72
|
+
// remove 'px' from the computed matrix
|
73
|
+
$.css( elem, supportProperty ).split('px').join(''):
|
74
|
+
elem.style[supportProperty]
|
75
|
+
)
|
76
|
+
},
|
77
|
+
set: function( elem, value ) {
|
78
|
+
// remove 'px' from matrices
|
79
|
+
elem.style[supportProperty] = /matrix[^)p]*\)/.test(value) ?
|
80
|
+
value.replace(/matrix((?:[^,]*,){4})([^,]*),([^)]*)/, 'matrix$1$2px,$3px'):
|
81
|
+
value;
|
82
|
+
}
|
83
|
+
}
|
84
|
+
/* Fix two jQuery bugs still present in 1.5.1
|
85
|
+
* - rupper is incompatible with IE9, see http://jqbug.com/8346
|
86
|
+
* - jQuery.css is not really jQuery.cssProps aware, see http://jqbug.com/8402
|
87
|
+
*/
|
88
|
+
} else if ( /^1\.[0-5](?:\.|$)/.test($.fn.jquery) ) {
|
89
|
+
propertyHook = {
|
90
|
+
get: function( elem, computed ) {
|
91
|
+
return (computed ?
|
92
|
+
$.css( elem, supportProperty.replace(/^ms/, 'Ms') ):
|
93
|
+
elem.style[supportProperty]
|
94
|
+
)
|
95
|
+
}
|
96
|
+
}
|
97
|
+
}
|
98
|
+
/* TODO: leverage hardware acceleration of 3d transform in Webkit only
|
99
|
+
else if ( supportProperty == 'Webkit' + suffix && support3dTransform ) {
|
100
|
+
propertyHook = {
|
101
|
+
set: function( elem, value ) {
|
102
|
+
elem.style[supportProperty] =
|
103
|
+
value.replace();
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}*/
|
107
|
+
|
108
|
+
} else if ( supportMatrixFilter ) {
|
109
|
+
propertyHook = {
|
110
|
+
get: function( elem, computed ) {
|
111
|
+
var elemStyle = ( computed && elem.currentStyle ? elem.currentStyle : elem.style ),
|
112
|
+
matrix;
|
113
|
+
|
114
|
+
if ( elemStyle && rMatrix.test( elemStyle.filter ) ) {
|
115
|
+
matrix = RegExp.$1.split(',');
|
116
|
+
matrix = [
|
117
|
+
matrix[0].split('=')[1],
|
118
|
+
matrix[2].split('=')[1],
|
119
|
+
matrix[1].split('=')[1],
|
120
|
+
matrix[3].split('=')[1]
|
121
|
+
];
|
122
|
+
} else {
|
123
|
+
matrix = [1,0,0,1];
|
124
|
+
}
|
125
|
+
matrix[4] = elemStyle ? elemStyle.left : 0;
|
126
|
+
matrix[5] = elemStyle ? elemStyle.top : 0;
|
127
|
+
return "matrix(" + matrix + ")";
|
128
|
+
},
|
129
|
+
set: function( elem, value, animate ) {
|
130
|
+
var elemStyle = elem.style,
|
131
|
+
currentStyle,
|
132
|
+
Matrix,
|
133
|
+
filter;
|
134
|
+
|
135
|
+
if ( !animate ) {
|
136
|
+
elemStyle.zoom = 1;
|
137
|
+
}
|
138
|
+
|
139
|
+
value = matrix(value);
|
140
|
+
|
141
|
+
// rotate, scale and skew
|
142
|
+
if ( !animate || animate.M ) {
|
143
|
+
Matrix = [
|
144
|
+
"Matrix("+
|
145
|
+
"M11="+value[0],
|
146
|
+
"M12="+value[2],
|
147
|
+
"M21="+value[1],
|
148
|
+
"M22="+value[3],
|
149
|
+
"SizingMethod='auto expand'"
|
150
|
+
].join();
|
151
|
+
filter = ( currentStyle = elem.currentStyle ) && currentStyle.filter || elemStyle.filter || "";
|
152
|
+
|
153
|
+
elemStyle.filter = rMatrix.test(filter) ?
|
154
|
+
filter.replace(rMatrix, Matrix) :
|
155
|
+
filter + " progid:DXImageTransform.Microsoft." + Matrix + ")";
|
156
|
+
|
157
|
+
// center the transform origin, from pbakaus's Transformie http://github.com/pbakaus/transformie
|
158
|
+
if ( (centerOrigin = $.transform.centerOrigin) ) {
|
159
|
+
elemStyle[centerOrigin == 'margin' ? 'marginLeft' : 'left'] = -(elem.offsetWidth/2) + (elem.clientWidth/2) + 'px';
|
160
|
+
elemStyle[centerOrigin == 'margin' ? 'marginTop' : 'top'] = -(elem.offsetHeight/2) + (elem.clientHeight/2) + 'px';
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
// translate
|
165
|
+
if ( !animate || animate.T ) {
|
166
|
+
// We assume that the elements are absolute positionned inside a relative positionned wrapper
|
167
|
+
elemStyle.left = value[4] + 'px';
|
168
|
+
elemStyle.top = value[5] + 'px';
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
173
|
+
// populate jQuery.cssHooks with the appropriate hook if necessary
|
174
|
+
if ( propertyHook ) {
|
175
|
+
$.cssHooks[propertyName] = propertyHook;
|
176
|
+
}
|
177
|
+
// we need a unique setter for the animation logic
|
178
|
+
propertyGet = propertyHook && propertyHook.get || $.css;
|
179
|
+
|
180
|
+
/*
|
181
|
+
* fn.animate() hooks
|
182
|
+
*/
|
183
|
+
$.fx.step.transform = function( fx ) {
|
184
|
+
var elem = fx.elem,
|
185
|
+
start = fx.start,
|
186
|
+
end = fx.end,
|
187
|
+
split,
|
188
|
+
pos = fx.pos,
|
189
|
+
transform,
|
190
|
+
translate,
|
191
|
+
rotate,
|
192
|
+
scale,
|
193
|
+
skew,
|
194
|
+
T = false,
|
195
|
+
M = false,
|
196
|
+
prop;
|
197
|
+
translate = rotate = scale = skew = '';
|
198
|
+
|
199
|
+
// fx.end and fx.start need to be converted to their translate/rotate/scale/skew components
|
200
|
+
// so that we can interpolate them
|
201
|
+
if ( !start || typeof start === "string" ) {
|
202
|
+
// the following block can be commented out with jQuery 1.5.1+, see #7912
|
203
|
+
if (!start) {
|
204
|
+
start = propertyGet( elem, supportProperty );
|
205
|
+
}
|
206
|
+
|
207
|
+
// force layout only once per animation
|
208
|
+
if ( supportMatrixFilter ) {
|
209
|
+
elem.style.zoom = 1;
|
210
|
+
}
|
211
|
+
|
212
|
+
// if the start computed matrix is in end, we are doing a relative animation
|
213
|
+
split = end.split(start);
|
214
|
+
if ( split.length == 2 ) {
|
215
|
+
// remove the start computed matrix to make animations more accurate
|
216
|
+
end = split.join('');
|
217
|
+
fx.origin = start;
|
218
|
+
start = 'none';
|
219
|
+
}
|
220
|
+
|
221
|
+
// start is either 'none' or a matrix(...) that has to be parsed
|
222
|
+
fx.start = start = start == 'none'?
|
223
|
+
{
|
224
|
+
translate: [0,0],
|
225
|
+
rotate: 0,
|
226
|
+
scale: [1,1],
|
227
|
+
skew: [0,0]
|
228
|
+
}:
|
229
|
+
unmatrix( toArray(start) );
|
230
|
+
|
231
|
+
// fx.end has to be parsed and decomposed
|
232
|
+
fx.end = end = ~end.indexOf('matrix')?
|
233
|
+
// bullet-proof parser
|
234
|
+
unmatrix(matrix(end)):
|
235
|
+
// faster and more precise parser
|
236
|
+
components(end);
|
237
|
+
|
238
|
+
// get rid of properties that do not change
|
239
|
+
for ( prop in start) {
|
240
|
+
if ( prop == 'rotate' ?
|
241
|
+
start[prop] == end[prop]:
|
242
|
+
start[prop][0] == end[prop][0] && start[prop][1] == end[prop][1]
|
243
|
+
) {
|
244
|
+
delete start[prop];
|
245
|
+
}
|
246
|
+
}
|
247
|
+
}
|
248
|
+
|
249
|
+
/*
|
250
|
+
* We want a fast interpolation algorithm.
|
251
|
+
* This implies avoiding function calls and sacrifying DRY principle:
|
252
|
+
* - avoid $.each(function(){})
|
253
|
+
* - round values using bitewise hacks, see http://jsperf.com/math-round-vs-hack/3
|
254
|
+
*/
|
255
|
+
if ( start.translate ) {
|
256
|
+
// round translate to the closest pixel
|
257
|
+
translate = ' translate('+
|
258
|
+
((start.translate[0] + (end.translate[0] - start.translate[0]) * pos + .5) | 0) +'px,'+
|
259
|
+
((start.translate[1] + (end.translate[1] - start.translate[1]) * pos + .5) | 0) +'px'+
|
260
|
+
')';
|
261
|
+
T = true;
|
262
|
+
}
|
263
|
+
if ( start.rotate != undefined ) {
|
264
|
+
rotate = ' rotate('+ (start.rotate + (end.rotate - start.rotate) * pos) +'rad)';
|
265
|
+
M = true;
|
266
|
+
}
|
267
|
+
if ( start.scale ) {
|
268
|
+
scale = ' scale('+
|
269
|
+
(start.scale[0] + (end.scale[0] - start.scale[0]) * pos) +','+
|
270
|
+
(start.scale[1] + (end.scale[1] - start.scale[1]) * pos) +
|
271
|
+
')';
|
272
|
+
M = true;
|
273
|
+
}
|
274
|
+
if ( start.skew ) {
|
275
|
+
skew = ' skew('+
|
276
|
+
(start.skew[0] + (end.skew[0] - start.skew[0]) * pos) +'rad,'+
|
277
|
+
(start.skew[1] + (end.skew[1] - start.skew[1]) * pos) +'rad'+
|
278
|
+
')';
|
279
|
+
M = true;
|
280
|
+
}
|
281
|
+
|
282
|
+
// In case of relative animation, restore the origin computed matrix here.
|
283
|
+
transform = fx.origin ?
|
284
|
+
fx.origin + translate + skew + scale + rotate:
|
285
|
+
translate + rotate + scale + skew;
|
286
|
+
|
287
|
+
propertyHook && propertyHook.set ?
|
288
|
+
propertyHook.set( elem, transform, {M: M, T: T} ):
|
289
|
+
elem.style[supportProperty] = transform;
|
290
|
+
};
|
291
|
+
|
292
|
+
/*
|
293
|
+
* Utility functions
|
294
|
+
*/
|
295
|
+
|
296
|
+
// turns a transform string into its 'matrix(A,B,C,D,X,Y)' form (as an array, though)
|
297
|
+
function matrix( transform ) {
|
298
|
+
transform = transform.split(')');
|
299
|
+
var
|
300
|
+
trim = $.trim
|
301
|
+
// last element of the array is an empty string, get rid of it
|
302
|
+
, i = transform.length -1
|
303
|
+
, split, prop, val
|
304
|
+
, A = 1
|
305
|
+
, B = 0
|
306
|
+
, C = 0
|
307
|
+
, D = 1
|
308
|
+
, A_, B_, C_, D_
|
309
|
+
, tmp1, tmp2
|
310
|
+
, X = 0
|
311
|
+
, Y = 0
|
312
|
+
;
|
313
|
+
// Loop through the transform properties, parse and multiply them
|
314
|
+
while (i--) {
|
315
|
+
split = transform[i].split('(');
|
316
|
+
prop = trim(split[0]);
|
317
|
+
val = split[1];
|
318
|
+
A_ = B_ = C_ = D_ = 0;
|
319
|
+
|
320
|
+
switch (prop) {
|
321
|
+
case 'translateX':
|
322
|
+
X += parseInt(val, 10);
|
323
|
+
continue;
|
324
|
+
|
325
|
+
case 'translateY':
|
326
|
+
Y += parseInt(val, 10);
|
327
|
+
continue;
|
328
|
+
|
329
|
+
case 'translate':
|
330
|
+
val = val.split(',');
|
331
|
+
X += parseInt(val[0], 10);
|
332
|
+
Y += parseInt(val[1] || 0, 10);
|
333
|
+
continue;
|
334
|
+
|
335
|
+
case 'rotate':
|
336
|
+
val = toRadian(val);
|
337
|
+
A_ = Math.cos(val);
|
338
|
+
B_ = Math.sin(val);
|
339
|
+
C_ = -Math.sin(val);
|
340
|
+
D_ = Math.cos(val);
|
341
|
+
break;
|
342
|
+
|
343
|
+
case 'scaleX':
|
344
|
+
A_ = val;
|
345
|
+
D_ = 1;
|
346
|
+
break;
|
347
|
+
|
348
|
+
case 'scaleY':
|
349
|
+
A_ = 1;
|
350
|
+
D_ = val;
|
351
|
+
break;
|
352
|
+
|
353
|
+
case 'scale':
|
354
|
+
val = val.split(',');
|
355
|
+
A_ = val[0];
|
356
|
+
D_ = val.length>1 ? val[1] : val[0];
|
357
|
+
break;
|
358
|
+
|
359
|
+
case 'skewX':
|
360
|
+
A_ = D_ = 1;
|
361
|
+
C_ = Math.tan(toRadian(val));
|
362
|
+
break;
|
363
|
+
|
364
|
+
case 'skewY':
|
365
|
+
A_ = D_ = 1;
|
366
|
+
B_ = Math.tan(toRadian(val));
|
367
|
+
break;
|
368
|
+
|
369
|
+
case 'skew':
|
370
|
+
A_ = D_ = 1;
|
371
|
+
val = val.split(',');
|
372
|
+
C_ = Math.tan(toRadian(val[0]));
|
373
|
+
B_ = Math.tan(toRadian(val[1] || 0));
|
374
|
+
break;
|
375
|
+
|
376
|
+
case 'matrix':
|
377
|
+
val = val.split(',');
|
378
|
+
A_ = +val[0];
|
379
|
+
B_ = +val[1];
|
380
|
+
C_ = +val[2];
|
381
|
+
D_ = +val[3];
|
382
|
+
X += parseInt(val[4], 10);
|
383
|
+
Y += parseInt(val[5], 10);
|
384
|
+
}
|
385
|
+
// Matrix product
|
386
|
+
tmp1 = A * A_ + B * C_;
|
387
|
+
B = A * B_ + B * D_;
|
388
|
+
tmp2 = C * A_ + D * C_;
|
389
|
+
D = C * B_ + D * D_;
|
390
|
+
A = tmp1;
|
391
|
+
C = tmp2;
|
392
|
+
}
|
393
|
+
return [A,B,C,D,X,Y];
|
394
|
+
}
|
395
|
+
|
396
|
+
// turns a matrix into its rotate, scale and skew components
|
397
|
+
// algorithm from http://hg.mozilla.org/mozilla-central/file/7cb3e9795d04/layout/style/nsStyleAnimation.cpp
|
398
|
+
function unmatrix(matrix) {
|
399
|
+
var
|
400
|
+
scaleX
|
401
|
+
, scaleY
|
402
|
+
, skew
|
403
|
+
, A = matrix[0]
|
404
|
+
, B = matrix[1]
|
405
|
+
, C = matrix[2]
|
406
|
+
, D = matrix[3]
|
407
|
+
;
|
408
|
+
|
409
|
+
// Make sure matrix is not singular
|
410
|
+
if ( A * D - B * C ) {
|
411
|
+
// step (3)
|
412
|
+
scaleX = Math.sqrt( A * A + B * B );
|
413
|
+
A /= scaleX;
|
414
|
+
B /= scaleX;
|
415
|
+
// step (4)
|
416
|
+
skew = A * C + B * D;
|
417
|
+
C -= A * skew;
|
418
|
+
D -= B * skew;
|
419
|
+
// step (5)
|
420
|
+
scaleY = Math.sqrt( C * C + D * D );
|
421
|
+
C /= scaleY;
|
422
|
+
D /= scaleY;
|
423
|
+
skew /= scaleY;
|
424
|
+
// step (6)
|
425
|
+
if ( A * D < B * C ) {
|
426
|
+
//scaleY = -scaleY;
|
427
|
+
//skew = -skew;
|
428
|
+
A = -A;
|
429
|
+
B = -B;
|
430
|
+
skew = -skew;
|
431
|
+
scaleX = -scaleX;
|
432
|
+
}
|
433
|
+
|
434
|
+
// matrix is singular and cannot be interpolated
|
435
|
+
} else {
|
436
|
+
rotate = scaleX = scaleY = skew = 0;
|
437
|
+
}
|
438
|
+
|
439
|
+
return {
|
440
|
+
translate: [+matrix[4], +matrix[5]],
|
441
|
+
rotate: Math.atan2(B, A),
|
442
|
+
scale: [scaleX, scaleY],
|
443
|
+
skew: [skew, 0]
|
444
|
+
}
|
445
|
+
}
|
446
|
+
|
447
|
+
// parse tranform components of a transform string not containing 'matrix(...)'
|
448
|
+
function components( transform ) {
|
449
|
+
// split the != transforms
|
450
|
+
transform = transform.split(')');
|
451
|
+
|
452
|
+
var translate = [0,0],
|
453
|
+
rotate = 0,
|
454
|
+
scale = [1,1],
|
455
|
+
skew = [0,0],
|
456
|
+
i = transform.length -1,
|
457
|
+
trim = $.trim,
|
458
|
+
split, name, value;
|
459
|
+
|
460
|
+
// add components
|
461
|
+
while ( i-- ) {
|
462
|
+
split = transform[i].split('(');
|
463
|
+
name = trim(split[0]);
|
464
|
+
value = split[1];
|
465
|
+
|
466
|
+
if (name == 'translateX') {
|
467
|
+
translate[0] += parseInt(value, 10);
|
468
|
+
|
469
|
+
} else if (name == 'translateY') {
|
470
|
+
translate[1] += parseInt(value, 10);
|
471
|
+
|
472
|
+
} else if (name == 'translate') {
|
473
|
+
value = value.split(',');
|
474
|
+
translate[0] += parseInt(value[0], 10);
|
475
|
+
translate[1] += parseInt(value[1] || 0, 10);
|
476
|
+
|
477
|
+
} else if (name == 'rotate') {
|
478
|
+
rotate += toRadian(value);
|
479
|
+
|
480
|
+
} else if (name == 'scaleX') {
|
481
|
+
scale[0] *= value;
|
482
|
+
|
483
|
+
} else if (name == 'scaleY') {
|
484
|
+
scale[1] *= value;
|
485
|
+
|
486
|
+
} else if (name == 'scale') {
|
487
|
+
value = value.split(',');
|
488
|
+
scale[0] *= value[0];
|
489
|
+
scale[1] *= (value.length>1? value[1] : value[0]);
|
490
|
+
|
491
|
+
} else if (name == 'skewX') {
|
492
|
+
skew[0] += toRadian(value);
|
493
|
+
|
494
|
+
} else if (name == 'skewY') {
|
495
|
+
skew[1] += toRadian(value);
|
496
|
+
|
497
|
+
} else if (name == 'skew') {
|
498
|
+
value = value.split(',');
|
499
|
+
skew[0] += toRadian(value[0]);
|
500
|
+
skew[1] += toRadian(value[1] || '0');
|
501
|
+
}
|
502
|
+
}
|
503
|
+
|
504
|
+
return {
|
505
|
+
translate: translate,
|
506
|
+
rotate: rotate,
|
507
|
+
scale: scale,
|
508
|
+
skew: skew
|
509
|
+
};
|
510
|
+
}
|
511
|
+
|
512
|
+
// converts an angle string in any unit to a radian Float
|
513
|
+
function toRadian(value) {
|
514
|
+
return ~value.indexOf('deg') ?
|
515
|
+
parseInt(value,10) * (Math.PI * 2 / 360):
|
516
|
+
~value.indexOf('grad') ?
|
517
|
+
parseInt(value,10) * (Math.PI/200):
|
518
|
+
parseFloat(value);
|
519
|
+
}
|
520
|
+
|
521
|
+
// Converts 'matrix(A,B,C,D,X,Y)' to [A,B,C,D,X,Y]
|
522
|
+
function toArray(matrix) {
|
523
|
+
// Fremove the unit of X and Y for Firefox
|
524
|
+
matrix = /\(([^,]*),([^,]*),([^,]*),([^,]*),([^,p]*)(?:px)?,([^)p]*)(?:px)?/.exec(matrix);
|
525
|
+
return [matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], matrix[6]];
|
526
|
+
}
|
527
|
+
|
528
|
+
$.transform = {
|
529
|
+
centerOrigin: 'margin'
|
530
|
+
};
|
531
|
+
|
532
|
+
})( jQuery );
|
@@ -0,0 +1,51 @@
|
|
1
|
+
/*----------------------------
|
2
|
+
knobKnob Styles
|
3
|
+
-----------------------------*/
|
4
|
+
|
5
|
+
.knob{
|
6
|
+
width:83px;
|
7
|
+
height:83px;
|
8
|
+
position:relative;
|
9
|
+
}
|
10
|
+
|
11
|
+
.knob .top{
|
12
|
+
position:absolute;
|
13
|
+
top:0;
|
14
|
+
left:0;
|
15
|
+
width:83px;
|
16
|
+
height:83px;
|
17
|
+
background:url('knob.png') no-repeat;
|
18
|
+
z-index:10;
|
19
|
+
cursor:default !important;
|
20
|
+
}
|
21
|
+
|
22
|
+
.knob .base{
|
23
|
+
width:83px;
|
24
|
+
height:83px;
|
25
|
+
border-radius:50%;
|
26
|
+
box-shadow:0 5px 0 #4a5056,5px 5px 5px #000;
|
27
|
+
position:absolute;
|
28
|
+
top:0;
|
29
|
+
left:0;
|
30
|
+
z-index:1;
|
31
|
+
}
|
32
|
+
|
33
|
+
.knob .top:after{
|
34
|
+
content:'';
|
35
|
+
width:10px;
|
36
|
+
height:10px;
|
37
|
+
background-color:#666;
|
38
|
+
position:absolute;
|
39
|
+
top:50%;
|
40
|
+
left:10px;
|
41
|
+
margin-top:-5px;
|
42
|
+
border-radius: 50%;
|
43
|
+
cursor:default !important;
|
44
|
+
box-shadow: 0 0 1px #5a5a5a inset;
|
45
|
+
}
|
46
|
+
|
47
|
+
.knob [draggable] {
|
48
|
+
-moz-user-select: none;
|
49
|
+
-webkit-user-select: none;
|
50
|
+
user-select: none;
|
51
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jqtools-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -101,6 +101,7 @@ extra_rdoc_files:
|
|
101
101
|
files:
|
102
102
|
- .document
|
103
103
|
- .rspec
|
104
|
+
- CHANGELOG.md
|
104
105
|
- Gemfile
|
105
106
|
- Gemfile.lock
|
106
107
|
- LICENSE.txt
|
@@ -112,7 +113,10 @@ files:
|
|
112
113
|
- spec/jqtools-rails_spec.rb
|
113
114
|
- spec/spec_helper.rb
|
114
115
|
- vendor/assets/javascripts/dateinput/dateinput.js
|
116
|
+
- vendor/assets/javascripts/effect/fullscreen.jquery.js
|
115
117
|
- vendor/assets/javascripts/jquery.tools.min.js
|
118
|
+
- vendor/assets/javascripts/knobs/knobs.jquery.js
|
119
|
+
- vendor/assets/javascripts/knobs/transform.js
|
116
120
|
- vendor/assets/javascripts/overlay/overlay.apple.js
|
117
121
|
- vendor/assets/javascripts/overlay/overlay.js
|
118
122
|
- vendor/assets/javascripts/rangeinput/rangeinput.js
|
@@ -129,6 +133,7 @@ files:
|
|
129
133
|
- vendor/assets/javascripts/tooltip/tooltip.js
|
130
134
|
- vendor/assets/javascripts/tooltip/tooltip.slide.js
|
131
135
|
- vendor/assets/javascripts/validator/validator.js
|
136
|
+
- vendor/assets/stylesheets/knobs.css
|
132
137
|
homepage: http://github.com/kristianmandrup/jqtools-rails
|
133
138
|
licenses:
|
134
139
|
- MIT
|
@@ -144,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
149
|
version: '0'
|
145
150
|
segments:
|
146
151
|
- 0
|
147
|
-
hash:
|
152
|
+
hash: 2209119423417733693
|
148
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
154
|
none: false
|
150
155
|
requirements:
|