unpoly-rails 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of unpoly-rails might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0855a74f16d2c467f82f420c95189c404f8ff58b
4
- data.tar.gz: ef3b75b21bbb11b30346098c7cf3c69b345975a2
3
+ metadata.gz: 073e4830deaf5d1a5bcb5c021f12574b0667225b
4
+ data.tar.gz: ca7cefb937a6a874a1978991e7412dd125199ca4
5
5
  SHA512:
6
- metadata.gz: 483bd7b9c60f3a857404a80702246a9a9ce706b0c962147c295b84c8c2e92a0a9c4c335337d44d3c38a3ac239c02ac2e49ebe0575e9c5e9024313e8c14d0bc6f
7
- data.tar.gz: 15ac80da0478f761ea4bfdcb6d9a08f4d087829ef551d2fa825b0bf4be2cb724ea539c69706fc08a55f352a47483c66f14b87868ec852d9e3e2eb1c874a50818
6
+ metadata.gz: c7af376508ef0086147a8ea8227ac2b5d77fb7f86d40396237d9889942725c27984da000dc83317d831e1a931e6eeb328f05dfd88364bb4c370d923214cd46fe
7
+ data.tar.gz: f026aa47769d84312e78e50dae936c5cd1eb5e332942ab71dd8a1e0962446be16a5a4285f57b565394be9094e8b6bb9057ba713df151319946bef214d87846d9
data/CHANGELOG.md CHANGED
@@ -10,15 +10,43 @@ Unreleased
10
10
 
11
11
  ### Compatible changes
12
12
 
13
+
14
+ ### Breaking changes
15
+
16
+
17
+ 0.21.0
18
+ ------
19
+
20
+ ### Compatible changes
21
+
22
+ - New function `up.macro`. This registers a [compiler](/up.compiler) that is run before all other compilers.
23
+ - [`up.compiler`](/up.compiler) has a new options `{ priority }`. Compilers with higher priorities are run first.
24
+ - Fix a bug where trying to apply another transition on an element could throw a *Maximum call stack exceeded*
25
+ error if the element was already transitioning.
26
+
13
27
  ### Breaking changes
14
28
 
29
+ - `up-toggle` has been renamed to `up-switch`
30
+
15
31
 
16
32
  0.20.0
17
33
  ------
18
34
 
19
35
  - The project has been renamed to *Unpoly*.
36
+ - All functions remain in the `up` namespace, so e.g. `up.replace` is still called `up.replace`.
37
+ - All UJS functionality remains unchanged, so e.g. `up-target` is still called `up-target`.
20
38
  - The Bower package has been renamed to `unpoly`.
21
39
  - The Ruby gem for the Rails bindings has been renamed to `unpoly-rails`.
40
+ - The new Javascript and stylesheet assets are:
41
+ - [`unpoly.js`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly.js)
42
+ - [`unpoly.min.js`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly.min.js)
43
+ - [`unpoly.css`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly.css)
44
+ - [`unpoly.min.css`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly.min.css)
45
+ - If you're using the Bootstrap integration the new assets are:
46
+ - [`unpoly-bootstrap3.js`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly-bootstrap3.js)
47
+ - [`unpoly-bootstrap3.min.js`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly-bootstrap3.min.js)
48
+ - [`unpoly-bootstrap3.css`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly-bootstrap3.css)
49
+ - [`unpoly-bootstrap3.min.css`](https://raw.githubusercontent.com/unpoly/unpoly/master/dist/unpoly-bootstrap3.min.css)
22
50
 
23
51
 
24
52
  0.19.0
data/README.md CHANGED
@@ -71,5 +71,5 @@ Always run `rake assets:compile` before `rake release` so the git tag points to
71
71
  Credits
72
72
  -------
73
73
 
74
- - [Henning Koch](mailto:henning.koch@makandra.de) from ([makandra](http://www.makandra.com) ([@triskweline](https://twitter.com/triskweline) on Twitter)
74
+ - [Henning Koch](mailto:henning.koch@makandra.de) from [makandra](http://www.makandra.com) ([@triskweline](https://twitter.com/triskweline) on Twitter)
75
75
 
data/dist/unpoly.js CHANGED
@@ -27,7 +27,7 @@ that might save you from loading something like [Underscore.js](http://underscor
27
27
  @function up.util.memoize
28
28
  @internal
29
29
  */
30
- var $createElementFromSelector, $createPlaceholder, ANIMATION_PROMISE_KEY, all, any, cache, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElement, createElementFromHtml, cssAnimate, detect, each, error, escapePressed, except, extend, findWithSelf, finishCssAnimate, fixedToAbsolute, forceCompositing, intersect, isArray, isBlank, isDeferred, isDefined, isElement, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isNumber, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, locationFromXhr, map, measure, memoize, merge, methodFromXhr, multiSelector, nextFrame, nonUpClasses, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, option, options, parseUrl, presence, presentAttr, reject, remove, requestDataAsArray, requestDataAsQuery, resolvableWhen, resolvedDeferred, resolvedPromise, scrollbarWidth, select, selectorForElement, setMissingAttrs, temporaryCss, times, titleFromXhr, toArray, trim, unJQuery, uniq, unresolvableDeferred, unresolvablePromise, unwrapElement;
30
+ var $createElementFromSelector, $createPlaceholder, ANIMATION_DEFERRED_KEY, all, any, cache, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElement, createElementFromHtml, cssAnimate, detect, each, error, escapePressed, except, extend, findWithSelf, finishCssAnimate, fixedToAbsolute, forceCompositing, intersect, isArray, isBlank, isDeferred, isDefined, isElement, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isNumber, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, locationFromXhr, map, measure, memoize, merge, methodFromXhr, multiSelector, nextFrame, nonUpClasses, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, option, options, parseUrl, pluckData, presence, presentAttr, reject, remove, requestDataAsArray, requestDataAsQuery, resolvableWhen, resolvedDeferred, resolvedPromise, scrollbarWidth, select, selectorForElement, setMissingAttrs, temporaryCss, times, titleFromXhr, toArray, trim, unJQuery, uniq, unresolvableDeferred, unresolvablePromise, unwrapElement;
31
31
  memoize = function(func) {
32
32
  var cache, cached;
33
33
  cache = void 0;
@@ -1067,9 +1067,9 @@ that might save you from loading something like [Underscore.js](http://underscor
1067
1067
  $element.css(lastFrame);
1068
1068
  deferred.then(withoutCompositing);
1069
1069
  deferred.then(withoutTransition);
1070
- $element.data(ANIMATION_PROMISE_KEY, deferred);
1070
+ $element.data(ANIMATION_DEFERRED_KEY, deferred);
1071
1071
  deferred.then(function() {
1072
- return $element.removeData(ANIMATION_PROMISE_KEY);
1072
+ return $element.removeData(ANIMATION_DEFERRED_KEY);
1073
1073
  });
1074
1074
  endTimeout = setTimeout((function() {
1075
1075
  return deferred.resolve();
@@ -1079,7 +1079,7 @@ that might save you from loading something like [Underscore.js](http://underscor
1079
1079
  });
1080
1080
  return deferred;
1081
1081
  };
1082
- ANIMATION_PROMISE_KEY = 'up-animation-promise';
1082
+ ANIMATION_DEFERRED_KEY = 'up-animation-deferred';
1083
1083
 
1084
1084
  /**
1085
1085
  Completes the animation for the given element by jumping
@@ -1097,7 +1097,7 @@ that might save you from loading something like [Underscore.js](http://underscor
1097
1097
  finishCssAnimate = function(elementOrSelector) {
1098
1098
  return $(elementOrSelector).each(function() {
1099
1099
  var existingAnimation;
1100
- if (existingAnimation = $(this).data(ANIMATION_PROMISE_KEY)) {
1100
+ if (existingAnimation = pluckData(this, ANIMATION_DEFERRED_KEY)) {
1101
1101
  return existingAnimation.resolve();
1102
1102
  }
1103
1103
  });
@@ -1380,12 +1380,12 @@ that might save you from loading something like [Underscore.js](http://underscor
1380
1380
  resolvableWhen = function() {
1381
1381
  var deferreds, joined;
1382
1382
  deferreds = 1 <= arguments.length ? slice.call(arguments, 0) : [];
1383
- joined = $.when.apply($, deferreds);
1384
- joined.resolve = function() {
1383
+ joined = $.when.apply($, [resolvedDeferred()].concat(slice.call(deferreds)));
1384
+ joined.resolve = memoize(function() {
1385
1385
  return each(deferreds, function(deferred) {
1386
- return typeof deferred.resolve === "function" ? deferred.resolve() : void 0;
1386
+ return deferred.resolve();
1387
1387
  });
1388
- };
1388
+ });
1389
1389
  return joined;
1390
1390
  };
1391
1391
 
@@ -1790,6 +1790,13 @@ that might save you from loading something like [Underscore.js](http://underscor
1790
1790
  $error.text(asString);
1791
1791
  throw new Error(asString);
1792
1792
  };
1793
+ pluckData = function(elementOrSelector, key) {
1794
+ var $element, value;
1795
+ $element = $(elementOrSelector);
1796
+ value = $element.data(key);
1797
+ $element.removeData(key);
1798
+ return value;
1799
+ };
1793
1800
  return {
1794
1801
  requestDataAsArray: requestDataAsArray,
1795
1802
  requestDataAsQuery: requestDataAsQuery,
@@ -1875,7 +1882,8 @@ that might save you from loading something like [Underscore.js](http://underscor
1875
1882
  cache: cache,
1876
1883
  unwrapElement: unwrapElement,
1877
1884
  multiSelector: multiSelector,
1878
- error: error
1885
+ error: error,
1886
+ pluckData: pluckData
1879
1887
  };
1880
1888
  })($);
1881
1889
 
@@ -2750,10 +2758,12 @@ later.
2750
2758
  var slice = [].slice;
2751
2759
 
2752
2760
  up.syntax = (function($) {
2753
- var DESTROYABLE_CLASS, DESTROYER_KEY, applyCompiler, clean, compile, compiler, compilers, data, reset, snapshot, u;
2761
+ var DESTROYABLE_CLASS, DESTROYER_KEY, applyCompiler, buildCompiler, clean, compile, compiler, compilers, data, insertCompiler, macro, macros, reset, snapshot, u;
2754
2762
  u = up.util;
2755
2763
  DESTROYABLE_CLASS = 'up-destroyable';
2756
2764
  DESTROYER_KEY = 'up-destroyer';
2765
+ compilers = [];
2766
+ macros = [];
2757
2767
 
2758
2768
  /**
2759
2769
  Registers a function to be called whenever an element with
@@ -2892,6 +2902,10 @@ later.
2892
2902
  @function up.compiler
2893
2903
  @param {String} selector
2894
2904
  The selector to match.
2905
+ @param {Number} [options.priority=0]
2906
+ The priority of this compilers.
2907
+ Compilers with a higher priority are run first.
2908
+ Two compilers with the same priority are run in the order they were registered.
2895
2909
  @param {Boolean} [options.batch=false]
2896
2910
  If set to `true` and a fragment insertion contains multiple
2897
2911
  elements matching the selector, `compiler` is only called once
@@ -2914,21 +2928,84 @@ later.
2914
2928
  is already handled by [`up.destroy`](/up.destroy).
2915
2929
  @stable
2916
2930
  */
2917
- compilers = [];
2918
2931
  compiler = function() {
2919
- var args, options, selector;
2932
+ var args;
2933
+ args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
2934
+ return insertCompiler.apply(null, [compilers].concat(slice.call(args)));
2935
+ };
2936
+
2937
+ /**
2938
+ Registers a [compiler](/up.compiler) that is run before all other compilers.
2939
+
2940
+ You can use `up.macro` to register a compiler that sets other UJS attributes.
2941
+
2942
+ \#\#\#\# Example
2943
+
2944
+ You will sometimes find yourself setting the same combination of UJS attributes again and again:
2945
+
2946
+ <a href="/page1" up-target=".content" up-transition="cross-fade" up-duration="300">Page 1</a>
2947
+ <a href="/page2" up-target=".content" up-transition="cross-fade" up-duration="300">Page 2</a>
2948
+ <a href="/page3" up-target=".content" up-transition="cross-fade" up-duration="300">Page 3</a>
2949
+
2950
+ We would much rather define a new `content-link` attribute that let's us
2951
+ write the same links like this:
2952
+
2953
+ <a href="/page1" content-link>Page 1</a>
2954
+ <a href="/page2" content-link>Page 2</a>
2955
+ <a href="/page3" content-link>Page 3</a>
2956
+
2957
+ We can define the `content-link` attribute by registering a macro that
2958
+ sets the `up-target`, `up-transition` and `up-duration` attributes for us:
2959
+
2960
+ up.macro('[content-link]', function($link) {
2961
+ $link.attr('up-target', '.content');
2962
+ $link.attr('up-transition', 'cross-fade');
2963
+ $link.attr('up-duration', '300');
2964
+ });
2965
+
2966
+ Examples for built-in macros are [`up-dash`](/up-dash) and [`up-expand`](/up-expand).
2967
+
2968
+ @param {String} selector
2969
+ The selector to match.
2970
+ @param {Object} options
2971
+ See options for [`up.compiler`](/up.compiler).
2972
+ @param {Function($element, data)} compiler
2973
+ The function to call when a matching element is inserted.
2974
+ See [`up.compiler`](/up.compiler) for details.
2975
+ @stable
2976
+ */
2977
+ macro = function() {
2978
+ var args;
2979
+ args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
2980
+ return insertCompiler.apply(null, [macros].concat(slice.call(args)));
2981
+ };
2982
+ buildCompiler = function() {
2983
+ var args, callback, options, selector;
2920
2984
  selector = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
2921
- if (!up.browser.isSupported()) {
2922
- return;
2923
- }
2924
- compiler = args.pop();
2925
- options = u.options(args[0]);
2926
- return compilers.push({
2985
+ callback = args.pop();
2986
+ options = u.options(args[0], {
2987
+ priority: 0
2988
+ });
2989
+ return {
2927
2990
  selector: selector,
2928
- callback: compiler,
2991
+ callback: callback,
2992
+ priority: options.priority,
2929
2993
  batch: options.batch,
2930
2994
  keep: options.keep
2931
- });
2995
+ };
2996
+ };
2997
+ insertCompiler = function() {
2998
+ var args, index, newCompiler, oldCompiler, queue;
2999
+ queue = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
3000
+ if (!up.browser.isSupported()) {
3001
+ return;
3002
+ }
3003
+ newCompiler = buildCompiler.apply(null, args);
3004
+ index = 0;
3005
+ while ((oldCompiler = queue[index]) && (oldCompiler.priority <= newCompiler.priority)) {
3006
+ index += 1;
3007
+ }
3008
+ return queue.splice(index, 0, newCompiler);
2932
3009
  };
2933
3010
  applyCompiler = function(compiler, $jqueryElement, nativeElement) {
2934
3011
  var destroyer, value;
@@ -2958,31 +3035,40 @@ later.
2958
3035
  options = u.options(options);
2959
3036
  $skipSubtrees = $(options.skip);
2960
3037
  return up.log.group("Compiling fragment %o", $fragment.get(0), function() {
2961
- var $matches, i, len, results;
3038
+ var $matches, i, len, queue, ref, results;
3039
+ ref = [macros, compilers];
2962
3040
  results = [];
2963
- for (i = 0, len = compilers.length; i < len; i++) {
2964
- compiler = compilers[i];
2965
- $matches = u.findWithSelf($fragment, compiler.selector);
2966
- $matches = $matches.filter(function() {
2967
- var $match;
2968
- $match = $(this);
2969
- return u.all($skipSubtrees, function(element) {
2970
- return $match.closest(element).length === 0;
2971
- });
2972
- });
2973
- if ($matches.length) {
2974
- results.push(up.log.group((!compiler.isDefault ? "Compiling '%s' on %d element(s)" : void 0), compiler.selector, $matches.length, function() {
2975
- if (compiler.batch) {
2976
- return applyCompiler(compiler, $matches, $matches.get());
2977
- } else {
2978
- return $matches.each(function() {
2979
- return applyCompiler(compiler, $(this), this);
3041
+ for (i = 0, len = ref.length; i < len; i++) {
3042
+ queue = ref[i];
3043
+ results.push((function() {
3044
+ var j, len1, results1;
3045
+ results1 = [];
3046
+ for (j = 0, len1 = queue.length; j < len1; j++) {
3047
+ compiler = queue[j];
3048
+ $matches = u.findWithSelf($fragment, compiler.selector);
3049
+ $matches = $matches.filter(function() {
3050
+ var $match;
3051
+ $match = $(this);
3052
+ return u.all($skipSubtrees, function(element) {
3053
+ return $match.closest(element).length === 0;
2980
3054
  });
3055
+ });
3056
+ if ($matches.length) {
3057
+ results1.push(up.log.group((!compiler.isDefault ? "Compiling '%s' on %d element(s)" : void 0), compiler.selector, $matches.length, function() {
3058
+ if (compiler.batch) {
3059
+ return applyCompiler(compiler, $matches, $matches.get());
3060
+ } else {
3061
+ return $matches.each(function() {
3062
+ return applyCompiler(compiler, $(this), this);
3063
+ });
3064
+ }
3065
+ }));
3066
+ } else {
3067
+ results1.push(void 0);
2981
3068
  }
2982
- }));
2983
- } else {
2984
- results.push(void 0);
2985
- }
3069
+ }
3070
+ return results1;
3071
+ })());
2986
3072
  }
2987
3073
  return results;
2988
3074
  });
@@ -3076,6 +3162,7 @@ later.
3076
3162
  up.on('up:framework:reset', reset);
3077
3163
  return {
3078
3164
  compiler: compiler,
3165
+ macro: macro,
3079
3166
  compile: compile,
3080
3167
  clean: clean,
3081
3168
  data: data
@@ -3084,6 +3171,8 @@ later.
3084
3171
 
3085
3172
  up.compiler = up.syntax.compiler;
3086
3173
 
3174
+ up.macro = up.syntax.macro;
3175
+
3087
3176
  up.ready = function() {
3088
3177
  return up.util.error('up.ready no longer exists. Please use up.hello instead.');
3089
3178
  };
@@ -3894,6 +3983,21 @@ This modules contains functions to scroll the viewport and reveal contained elem
3894
3983
  <div class="bottom-nav" up-fixed="bottom">...</div>
3895
3984
 
3896
3985
  @selector [up-fixed=bottom]
3986
+ @stable
3987
+ */
3988
+
3989
+ /**
3990
+ Marks this element as a navigation anchored to the right edge of the screen
3991
+ using `position: fixed` or `position:absolute`.
3992
+
3993
+ [`up.modal`](/up.modal) will move anchored elements to the left so they
3994
+ don't appear to move when a modal dialog is opened or closed.
3995
+
3996
+ \#\#\#\# Example
3997
+
3998
+ <div class="bottom-nav" up-fixed="bottom">...</div>
3999
+
4000
+ @selector [up-anchored=right]
3897
4001
  @stable
3898
4002
  */
3899
4003
  up.on('up:framework:reset', reset);
@@ -4851,7 +4955,7 @@ or [transitions](/up.transition) using Javascript or CSS.
4851
4955
 
4852
4956
  (function() {
4853
4957
  up.motion = (function($) {
4854
- var GHOSTING_PROMISE_KEY, animate, animateOptions, animation, animations, assertIsDeferred, config, defaultAnimations, defaultTransitions, ensureMorphable, findAnimation, finish, finishGhosting, isEnabled, morph, none, prependCopy, reset, resolvableWhen, skipMorph, snapshot, transition, transitions, u, withGhosts;
4958
+ var GHOSTING_DEFERRED_KEY, animate, animateOptions, animation, animations, assertIsDeferred, config, defaultAnimations, defaultTransitions, ensureMorphable, findAnimation, finish, finishGhosting, isEnabled, morph, none, prependCopy, reset, resolvableWhen, skipMorph, snapshot, transition, transitions, u, withGhosts;
4855
4959
  u = up.util;
4856
4960
  animations = {};
4857
4961
  defaultAnimations = {};
@@ -5019,9 +5123,9 @@ or [transitions](/up.transition) using Javascript or CSS.
5019
5123
  findAnimation = function(name) {
5020
5124
  return animations[name] || u.error("Unknown animation %o", name);
5021
5125
  };
5022
- GHOSTING_PROMISE_KEY = 'up-ghosting-promise';
5126
+ GHOSTING_DEFERRED_KEY = 'up-ghosting-deferred';
5023
5127
  withGhosts = function($old, $new, options, block) {
5024
- var $viewport, newCopy, newScrollTop, oldCopy, oldScrollTop, promise, showNew;
5128
+ var $viewport, deferred, newCopy, newScrollTop, oldCopy, oldScrollTop, showNew;
5025
5129
  oldCopy = void 0;
5026
5130
  newCopy = void 0;
5027
5131
  oldScrollTop = void 0;
@@ -5031,8 +5135,6 @@ or [transitions](/up.transition) using Javascript or CSS.
5031
5135
  display: 'none'
5032
5136
  }, function() {
5033
5137
  oldCopy = prependCopy($old, $viewport);
5034
- oldCopy.$ghost.addClass('up-destroying');
5035
- oldCopy.$bounds.addClass('up-destroying');
5036
5138
  return oldScrollTop = $viewport.scrollTop();
5037
5139
  });
5038
5140
  u.temporaryCss($old, {
@@ -5047,17 +5149,17 @@ or [transitions](/up.transition) using Javascript or CSS.
5047
5149
  showNew = u.temporaryCss($new, {
5048
5150
  opacity: '0'
5049
5151
  });
5050
- promise = block(oldCopy.$ghost, newCopy.$ghost);
5051
- $old.data(GHOSTING_PROMISE_KEY, promise);
5052
- $new.data(GHOSTING_PROMISE_KEY, promise);
5053
- promise.then(function() {
5054
- $old.removeData(GHOSTING_PROMISE_KEY);
5055
- $new.removeData(GHOSTING_PROMISE_KEY);
5152
+ deferred = block(oldCopy.$ghost, newCopy.$ghost);
5153
+ $old.data(GHOSTING_DEFERRED_KEY, deferred);
5154
+ $new.data(GHOSTING_DEFERRED_KEY, deferred);
5155
+ deferred.then(function() {
5156
+ $old.removeData(GHOSTING_DEFERRED_KEY);
5157
+ $new.removeData(GHOSTING_DEFERRED_KEY);
5056
5158
  showNew();
5057
5159
  oldCopy.$bounds.remove();
5058
5160
  return newCopy.$bounds.remove();
5059
5161
  });
5060
- return promise;
5162
+ return deferred;
5061
5163
  };
5062
5164
 
5063
5165
  /**
@@ -5073,20 +5175,20 @@ or [transitions](/up.transition) using Javascript or CSS.
5073
5175
  @stable
5074
5176
  */
5075
5177
  finish = function(elementOrSelector) {
5076
- return $(elementOrSelector).each(function() {
5077
- var $element;
5178
+ var $element;
5179
+ $element = $(elementOrSelector);
5180
+ u.finishCssAnimate($element);
5181
+ return finishGhosting($element);
5182
+ };
5183
+ finishGhosting = function($collection) {
5184
+ return $collection.each(function() {
5185
+ var $element, existingGhosting;
5078
5186
  $element = $(this);
5079
- u.finishCssAnimate($element);
5080
- return finishGhosting($element);
5187
+ if (existingGhosting = u.pluckData($element, GHOSTING_DEFERRED_KEY)) {
5188
+ return existingGhosting.resolve();
5189
+ }
5081
5190
  });
5082
5191
  };
5083
- finishGhosting = function($element) {
5084
- var existingGhosting;
5085
- if (existingGhosting = $element.data(GHOSTING_PROMISE_KEY)) {
5086
- up.puts('Canceling existing ghosting on %o', $element);
5087
- return typeof existingGhosting.resolve === "function" ? existingGhosting.resolve() : void 0;
5088
- }
5089
- };
5090
5192
  assertIsDeferred = function(object, source) {
5091
5193
  if (u.isDeferred(object)) {
5092
5194
  return object;
@@ -5167,7 +5269,7 @@ or [transitions](/up.transition) using Javascript or CSS.
5167
5269
  $new = $(target);
5168
5270
  ensureMorphable($old, transitionOrName);
5169
5271
  ensureMorphable($new, transitionOrName);
5170
- return up.log.group((transitionOrName ? 'Morphing %o to %o (using %o)' : void 0), source, target, transitionOrName, function() {
5272
+ return up.log.group((transitionOrName ? 'Morphing %o to %o (using %s)' : void 0), $old.get(0), $new.get(0), transitionOrName, function() {
5171
5273
  var animation, parsedOptions, parts, transition;
5172
5274
  parsedOptions = u.only(options, 'reveal', 'restoreScroll', 'source');
5173
5275
  parsedOptions = u.extend(parsedOptions, animateOptions(options));
@@ -6533,7 +6635,7 @@ Read on
6533
6635
  If omitted, the first contained link will be expanded.
6534
6636
  @stable
6535
6637
  */
6536
- up.compiler('[up-expand]', function($area) {
6638
+ up.macro('[up-expand]', function($area) {
6537
6639
  var $childLinks, attribute, i, len, link, name, newAttrs, ref, selector, upAttributePattern;
6538
6640
  $childLinks = $area.find('a, [up-href]');
6539
6641
  if (selector = $area.attr('up-expand')) {
@@ -6576,7 +6678,7 @@ Read on
6576
6678
  @selector [up-dash]
6577
6679
  @stable
6578
6680
  */
6579
- up.compiler('[up-dash]', function($element) {
6681
+ up.macro('[up-dash]', function($element) {
6580
6682
  var newAttrs, target;
6581
6683
  target = u.castedAttr($element, 'up-dash');
6582
6684
  newAttrs = {
@@ -6624,7 +6726,7 @@ open dialogs with sub-forms, etc. all without losing form state.
6624
6726
  var slice = [].slice;
6625
6727
 
6626
6728
  up.form = (function($) {
6627
- var autosubmit, config, currentValuesForToggle, observe, observeForm, reset, resolveValidateTarget, submit, toggleTargets, u, validate;
6729
+ var autosubmit, config, currentValuesForSwitch, observe, observeForm, reset, resolveValidateTarget, submit, switchTargets, u, validate;
6628
6730
  u = up.util;
6629
6731
 
6630
6732
  /**
@@ -7005,7 +7107,7 @@ open dialogs with sub-forms, etc. all without losing form state.
7005
7107
  promise = up.submit($form, options);
7006
7108
  return promise;
7007
7109
  };
7008
- currentValuesForToggle = function($field) {
7110
+ currentValuesForSwitch = function($field) {
7009
7111
  var $checkedButton, value, values;
7010
7112
  values = void 0;
7011
7113
  if ($field.is('input[type=checkbox]')) {
@@ -7031,7 +7133,7 @@ open dialogs with sub-forms, etc. all without losing form state.
7031
7133
  }
7032
7134
  return values;
7033
7135
  };
7034
- currentValuesForToggle = function($field) {
7136
+ currentValuesForSwitch = function($field) {
7035
7137
  var $checkedButton, meta, value, values;
7036
7138
  if ($field.is('input[type=checkbox]')) {
7037
7139
  if ($field.is(':checked')) {
@@ -7067,26 +7169,26 @@ open dialogs with sub-forms, etc. all without losing form state.
7067
7169
  /**
7068
7170
  Shows or hides a target selector depending on the value.
7069
7171
 
7070
- See [`[up-toggle]`](/up-toggle) for more documentation and examples.
7172
+ See [`[up-switch]`](/up-switch) for more documentation and examples.
7071
7173
 
7072
7174
  This function does not currently have a very useful API outside
7073
- of our use for `up-toggle`'s UJS behavior, that's why it's currently
7175
+ of our use for `up-switch`'s UJS behavior, that's why it's currently
7074
7176
  still marked `@internal`.
7075
7177
 
7076
- @function up.form.toggle
7178
+ @function up.form.switchTargets
7077
7179
  @param {String|Element|jQuery} fieldOrSelector
7078
7180
  @param {String} [options.target]
7079
- The target selectors to toggle.
7080
- Defaults to an `up-toggle` attribute on the given field.
7181
+ The target selectors to switch.
7182
+ Defaults to an `up-switch` attribute on the given field.
7081
7183
  @internal
7082
7184
  */
7083
- toggleTargets = function(fieldOrSelector, options) {
7185
+ switchTargets = function(fieldOrSelector, options) {
7084
7186
  var $field, fieldValues, targets;
7085
7187
  $field = $(fieldOrSelector);
7086
7188
  options = u.options(options);
7087
- targets = u.option(options.target, $field.attr('up-toggle'));
7088
- u.isPresent(targets) || u.error("No toggle target given for %o", $field.get(0));
7089
- fieldValues = currentValuesForToggle($field);
7189
+ targets = u.option(options.target, $field.attr('up-switch'));
7190
+ u.isPresent(targets) || u.error("No switch target given for %o", $field.get(0));
7191
+ fieldValues = currentValuesForSwitch($field);
7090
7192
  return $(targets).each(function() {
7091
7193
  var $target, hideValues, show, showValues;
7092
7194
  $target = $(this);
@@ -7359,9 +7461,9 @@ open dialogs with sub-forms, etc. all without losing form state.
7359
7461
 
7360
7462
  \#\#\#\# Example
7361
7463
 
7362
- The triggering input gets an `up-toggle` attribute with a selector for the elements to show or hide:
7464
+ The triggering input gets an `up-switch` attribute with a selector for the elements to show or hide:
7363
7465
 
7364
- <select name="advancedness" up-toggle=".target">
7466
+ <select name="advancedness" up-switch=".target">
7365
7467
  <option value="basic">Basic parts</option>
7366
7468
  <option value="advanced">Advanced parts</option>
7367
7469
  <option value="very-advanced">Very advanced parts</option>
@@ -7383,7 +7485,7 @@ open dialogs with sub-forms, etc. all without losing form state.
7383
7485
 
7384
7486
  For checkboxes you can also use the pseudo-values `:checked` or `:unchecked` like so:
7385
7487
 
7386
- <input type="checkbox" name="flag" up-toggle=".target">
7488
+ <input type="checkbox" name="flag" up-switch=".target">
7387
7489
 
7388
7490
  <div class="target" up-show-for=":checked">
7389
7491
  only shown when checkbox is checked
@@ -7392,20 +7494,20 @@ open dialogs with sub-forms, etc. all without losing form state.
7392
7494
  You can also use the pseudo-values `:blank` to match an empty input value,
7393
7495
  or `:present` to match a non-empty input value:
7394
7496
 
7395
- <input type="text" name="email" up-toggle=".target">
7497
+ <input type="text" name="email" up-switch=".target">
7396
7498
 
7397
7499
  <div class="target" up-show-for=":blank">
7398
7500
  please enter an email address
7399
7501
  </div>
7400
7502
 
7401
- @selector [up-toggle]
7503
+ @selector [up-switch]
7402
7504
  @stable
7403
7505
  */
7404
7506
 
7405
7507
  /**
7406
7508
  Show this element only if a form field has a given value.
7407
7509
 
7408
- See [`[up-toggle]`](/up-toggle) for more documentation and examples.
7510
+ See [`[up-switch]`](/up-switch) for more documentation and examples.
7409
7511
 
7410
7512
  @selector [up-show-for]
7411
7513
  @param up-show-for
@@ -7416,19 +7518,18 @@ open dialogs with sub-forms, etc. all without losing form state.
7416
7518
  /**
7417
7519
  Hide this element if a form field has a given value.
7418
7520
 
7419
- See [`[up-toggle]`](/up-toggle) for more documentation and examples.
7521
+ See [`[up-switch]`](/up-switch) for more documentation and examples.
7420
7522
 
7421
7523
  @selector [up-hide-for]
7422
7524
  @param up-hide-for
7423
7525
  A space-separated list of values for which to hide this element.
7424
7526
  @stable
7425
7527
  */
7426
- up.on('change', '[up-toggle]', function(event, $field) {
7427
- console.log("CHANGE EVENT");
7428
- return toggleTargets($field);
7528
+ up.on('change', '[up-switch]', function(event, $field) {
7529
+ return switchTargets($field);
7429
7530
  });
7430
- up.compiler('[up-toggle]', function($field) {
7431
- return toggleTargets($field);
7531
+ up.compiler('[up-switch]', function($field) {
7532
+ return switchTargets($field);
7432
7533
  });
7433
7534
 
7434
7535
  /**
@@ -7500,7 +7601,7 @@ open dialogs with sub-forms, etc. all without losing form state.
7500
7601
  submit: submit,
7501
7602
  observe: observe,
7502
7603
  validate: validate,
7503
- toggleTargets: toggleTargets
7604
+ switchTargets: switchTargets
7504
7605
  };
7505
7606
  })(jQuery);
7506
7607