upjs-rails 0.2.2 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bfd395defeb823375907c8c74a3e2d739928ca82
4
- data.tar.gz: 149d22961c624278e228d63f87f5a21ac447c4ee
3
+ metadata.gz: 58b9bda1086a0ac50783289b009de30dd0ffa228
4
+ data.tar.gz: 83901a4346b18ede730a146b6409e0b50fc7d4d5
5
5
  SHA512:
6
- metadata.gz: 8e9dc65fba23982223a3f8281e6e9799757aea4f0e0c14e1a50670f58dd414a529b4d2fbc48c21a77430d098c1cd06121102187db3783e608e0d5bc94bf3631b
7
- data.tar.gz: ff942b938f7a97d600733fdcacad7c71c5f53617c3db06c01d92e1275de1ce36bd6844d648c9bac6c8cd5a918a81bf6a737b2e5b54613e5b61b01ab1ef664117
6
+ metadata.gz: 948fc5f12e782d99b428761a381cb8ea61ea5158d47fb1c6ac3820863bd57614a8cd6a89afe89bc408ea71307656824ac65966350247d834869adb1c74c98d99
7
+ data.tar.gz: 364e9d0048c8d594f2de7786ee7d4f559179683e71fe4de6dafe7e084cc263e814f8cadf3bcae9911e34073be32c916bebe015375390c016115729b15bf69b78
data/README.md CHANGED
@@ -3,3 +3,47 @@
3
3
  Up.js gives your traditional web application fast-responding views with minimal changes to your code and development style. If you require modern UX but don't want to pay the Javascript MVC complexity tax, Up.js can be a solution for you.
4
4
 
5
5
  See [upjs.io](http://upjs.io) for more information and API documentation.
6
+
7
+
8
+ ## Running tests
9
+
10
+ Overview:
11
+
12
+ - This currently requires Ruby
13
+ - There's a Rails app in `spec_app`
14
+ - Jasmine tests live in `spec_app/spec/javascripts`
15
+ - There are also some Cucumber integration tests left in `spec_app/features`, but this is legacy code.
16
+ Testing with Jasmine works so well that we want the entire test suite to become pure-JS Jasmine specs.
17
+
18
+ To run Jasmine tests:
19
+
20
+ - Install Ruby 2.1.2
21
+ - `cd` into `spec_app`
22
+ - Install dependencies by running `bundle install`
23
+ - Start the Rails server
24
+ - Access `http://localhost:3000/specs`
25
+
26
+
27
+ ## Making a new release
28
+
29
+ We are currently feeding three release channels:
30
+
31
+ - Manual download from Github
32
+ - Bower
33
+ - Rubygems (as the `upjs-rails` gem)
34
+
35
+ To make a new Release, start with the gem:
36
+
37
+ - Edit `lib/upjs/rails/version.rb` and bump the version number. Use [semantic versioning](http://semver.org/).
38
+ - Commit and push the version bump
39
+ - From the project root, type `rake release`. This will publish a new gem version to Rubygems.org.
40
+ It will also push a tag for this version, which Bower requires for its own versioning scheme.
41
+
42
+ Now make the release for manual download and bower:
43
+
44
+ - From the project root, type `rake assets:compile`
45
+ - This will output minified JS and CSS files to the `dist` folder
46
+ - Commit and push the generated files
47
+
48
+
49
+
data/dist/up.js CHANGED
@@ -25,7 +25,7 @@ If you use them in your own code, you will get hurt.
25
25
  var __slice = [].slice;
26
26
 
27
27
  up.util = (function() {
28
- var $createElementFromSelector, ajax, castsToFalse, castsToTrue, clientSize, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, detect, each, error, escapePressed, extend, findWithSelf, get, ifGiven, isArray, isBlank, isDefined, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, last, locationFromXhr, measure, merge, nextFrame, normalizeUrl, option, options, prependGhost, presence, presentAttr, select, temporaryCss, unwrap;
28
+ var $createElementFromSelector, ajax, castsToFalse, castsToTrue, clientSize, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, detect, each, error, escapePressed, extend, findWithSelf, forceCompositing, get, ifGiven, isArray, isBlank, isDefined, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, last, locationFromXhr, measure, merge, nextFrame, normalizeUrl, option, options, prependGhost, presence, presentAttr, select, temporaryCss, unwrap;
29
29
  get = function(url, options) {
30
30
  options = options || {};
31
31
  options.url = url;
@@ -189,7 +189,7 @@ If you use them in your own code, you will get hurt.
189
189
  return !isMissing(object);
190
190
  };
191
191
  isBlank = function(object) {
192
- return isMissing(object) || (object.length === 0);
192
+ return isMissing(object) || (isObject(object) && Object.keys(object).length === 0) || (object.length === 0);
193
193
  };
194
194
  presence = function(object, checker) {
195
195
  if (checker == null) {
@@ -357,6 +357,22 @@ If you use them in your own code, you will get hurt.
357
357
  return memo;
358
358
  }
359
359
  };
360
+ forceCompositing = function($element) {
361
+ var memo, oldTransforms;
362
+ oldTransforms = $element.css(['transform', '-webkit-transform']);
363
+ if (isBlank(oldTransforms)) {
364
+ memo = function() {
365
+ return $element.css(oldTransforms);
366
+ };
367
+ $element.css({
368
+ 'transform': 'translateZ(0)',
369
+ '-webkit-transform': 'translateZ(0)'
370
+ });
371
+ } else {
372
+ memo = function() {};
373
+ }
374
+ return memo;
375
+ };
360
376
 
361
377
  /**
362
378
  Animates the given element's CSS properties using CSS transitions.
@@ -378,7 +394,7 @@ If you use them in your own code, you will get hurt.
378
394
  A promise for the animation's end.
379
395
  */
380
396
  cssAnimate = function(elementOrSelector, lastFrame, opts) {
381
- var $element, deferred, transition, withoutTransition;
397
+ var $element, deferred, transition, withoutCompositing, withoutTransition;
382
398
  opts = options(opts, {
383
399
  duration: 300,
384
400
  delay: 0,
@@ -392,8 +408,10 @@ If you use them in your own code, you will get hurt.
392
408
  'transition-delay': opts.delay + "ms",
393
409
  'transition-timing-function': opts.easing
394
410
  };
411
+ withoutCompositing = forceCompositing($element);
395
412
  withoutTransition = temporaryCss($element, transition);
396
413
  $element.css(lastFrame);
414
+ deferred.then(withoutCompositing);
397
415
  deferred.then(withoutTransition);
398
416
  setTimeout((function() {
399
417
  return deferred.resolve();
@@ -405,10 +423,15 @@ If you use them in your own code, you will get hurt.
405
423
  coordinates = (options != null ? options.relative : void 0) ? $element.position() : $element.offset();
406
424
  box = {
407
425
  left: coordinates.left,
408
- top: coordinates.top,
409
- width: $element.outerWidth(),
410
- height: $element.outerHeight()
426
+ top: coordinates.top
411
427
  };
428
+ if (options != null ? options.inner : void 0) {
429
+ box.width = $element.width();
430
+ box.height = $element.height();
431
+ } else {
432
+ box.width = $element.outerWidth();
433
+ box.height = $element.outerHeight();
434
+ }
412
435
  if (options != null ? options.full : void 0) {
413
436
  viewport = clientSize();
414
437
  box.right = viewport.width - (box.left + box.width);
@@ -432,18 +455,20 @@ If you use them in your own code, you will get hurt.
432
455
  };
433
456
  prependGhost = function($element) {
434
457
  var $ghost, dimensions;
435
- dimensions = measure($element);
458
+ dimensions = measure($element, {
459
+ relative: true,
460
+ inner: true
461
+ });
436
462
  $ghost = $element.clone();
437
463
  $ghost.find('script').remove();
438
464
  $ghost.css({
439
465
  right: '',
440
466
  bottom: '',
441
- margin: 0,
442
467
  position: 'absolute'
443
468
  });
444
469
  $ghost.css(dimensions);
445
470
  $ghost.addClass('up-ghost');
446
- return $ghost.prependTo(document.body);
471
+ return $ghost.insertBefore($element);
447
472
  };
448
473
  findWithSelf = function($element, selector) {
449
474
  return $element.find(selector).addBack(selector);
@@ -502,6 +527,7 @@ If you use them in your own code, you will get hurt.
502
527
  measure: measure,
503
528
  temporaryCss: temporaryCss,
504
529
  cssAnimate: cssAnimate,
530
+ forceCompositing: forceCompositing,
505
531
  prependGhost: prependGhost,
506
532
  escapePressed: escapePressed,
507
533
  copyAttributes: copyAttributes,
@@ -510,7 +536,8 @@ If you use them in your own code, you will get hurt.
510
536
  isArray: isArray,
511
537
  castsToTrue: castsToTrue,
512
538
  castsToFalse: castsToFalse,
513
- locationFromXhr: locationFromXhr
539
+ locationFromXhr: locationFromXhr,
540
+ clientSize: clientSize
514
541
  };
515
542
  })();
516
543
 
@@ -741,6 +768,10 @@ We need to work on this page:
741
768
  options = u.options(options, {
742
769
  historyMethod: 'push'
743
770
  });
771
+ if (options.history === 'false') {
772
+ options.history = null;
773
+ }
774
+ options.source = u.option(options.source, options.history);
744
775
  htmlElement = u.createElementFromHtml(html);
745
776
  options.title || (options.title = (_ref = htmlElement.querySelector("title")) != null ? _ref.textContent : void 0);
746
777
  _ref1 = implantSteps(selector, options);
@@ -758,22 +789,18 @@ We need to work on this page:
758
789
  return _results;
759
790
  };
760
791
  elementsInserted = function($new, options) {
761
- return $new.each(function() {
762
- var $element;
763
- $element = $(this);
764
- if (typeof options.insert === "function") {
765
- options.insert($element);
766
- }
767
- if (options.history) {
768
- if (options.title) {
769
- document.title = options.title;
770
- }
771
- up.history[options.historyMethod](options.history);
792
+ if (typeof options.insert === "function") {
793
+ options.insert($new);
794
+ }
795
+ if (options.history) {
796
+ if (options.title) {
797
+ document.title = options.title;
772
798
  }
773
- setSource($element, u.presence(options.source) || options.history);
774
- autofocus($element);
775
- return up.ready($element);
776
- });
799
+ up.history[options.historyMethod](options.history);
800
+ }
801
+ setSource($new, options.source);
802
+ autofocus($new);
803
+ return up.ready($new);
777
804
  };
778
805
  swapElements = function($old, $new, pseudoClass, transition, options) {
779
806
  var $addedChildren, insertionMethod;
@@ -929,9 +956,11 @@ We need to work on this page:
929
956
  */
930
957
 
931
958
  (function() {
959
+ var __slice = [].slice;
960
+
932
961
  up.magic = (function() {
933
- var DESTROYABLE_CLASS, DESTROYER_KEY, awaken, awakeners, compile, defaultAwakeners, defaultLiveDescriptions, destroy, live, liveDescriptions, onEscape, ready, reset, snapshot, util;
934
- util = up.util;
962
+ var DESTROYABLE_CLASS, DESTROYER_KEY, applyAwakener, awaken, awakeners, compile, defaultAwakeners, defaultLiveDescriptions, destroy, live, liveDescriptions, onEscape, ready, reset, snapshot, u;
963
+ u = up.util;
935
964
  DESTROYABLE_CLASS = 'up-destroyable';
936
965
  DESTROYER_KEY = 'up-destroyer';
937
966
 
@@ -968,6 +997,10 @@ We need to work on this page:
968
997
  @method up.awaken
969
998
  @param {String} selector
970
999
  The selector to match.
1000
+ @param {Boolean} [options.batch=false]
1001
+ If set to `true` and a fragment insertion contains multiple
1002
+ elements matching the selector, `awakener` is only called once
1003
+ with a jQuery collection containing all matching elements.
971
1004
  @param {Function($element)} awakener
972
1005
  The function to call when a matching element is inserted.
973
1006
  The function takes the new element as the first argument (as a jQuery object).
@@ -978,31 +1011,50 @@ We need to work on this page:
978
1011
  */
979
1012
  awakeners = [];
980
1013
  defaultAwakeners = null;
981
- awaken = function(selector, awakener) {
1014
+ awaken = function() {
1015
+ var args, awakener, options, selector;
1016
+ selector = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
1017
+ awakener = args.pop();
1018
+ options = u.options(args[0], {
1019
+ batch: false
1020
+ });
982
1021
  return awakeners.push({
983
1022
  selector: selector,
984
- callback: awakener
1023
+ callback: awakener,
1024
+ batch: options.batch
985
1025
  });
986
1026
  };
1027
+ applyAwakener = function(awakener, $jqueryElement, nativeElement) {
1028
+ var destroyer;
1029
+ destroyer = awakener.callback.apply(nativeElement, [$jqueryElement]);
1030
+ if (u.isFunction(destroyer)) {
1031
+ $jqueryElement.addClass(DESTROYABLE_CLASS);
1032
+ return $jqueryElement.data(DESTROYER_KEY, destroyer);
1033
+ }
1034
+ };
987
1035
  compile = function($fragment) {
988
- var awakener, _i, _len, _results;
1036
+ var $matches, awakener, _i, _len, _results;
1037
+ console.log("Compiling fragment", $fragment);
989
1038
  _results = [];
990
1039
  for (_i = 0, _len = awakeners.length; _i < _len; _i++) {
991
1040
  awakener = awakeners[_i];
992
- _results.push(util.findWithSelf($fragment, awakener.selector).each(function() {
993
- var $element, destroyer;
994
- $element = $(this);
995
- destroyer = awakener.callback.apply(this, [$element]);
996
- if (util.isFunction(destroyer)) {
997
- $element.addClass(DESTROYABLE_CLASS);
998
- return $element.data(DESTROYER_KEY, destroyer);
1041
+ $matches = u.findWithSelf($fragment, awakener.selector);
1042
+ if ($matches.length) {
1043
+ if (awakener.batch) {
1044
+ _results.push(applyAwakener(awakener, $matches, $matches.get()));
1045
+ } else {
1046
+ _results.push($matches.each(function() {
1047
+ return applyAwakener(awakener, $(this), this);
1048
+ }));
999
1049
  }
1000
- }));
1050
+ } else {
1051
+ _results.push(void 0);
1052
+ }
1001
1053
  }
1002
1054
  return _results;
1003
1055
  };
1004
1056
  destroy = function($fragment) {
1005
- return util.findWithSelf($fragment, "." + DESTROYABLE_CLASS).each(function() {
1057
+ return u.findWithSelf($fragment, "." + DESTROYABLE_CLASS).each(function() {
1006
1058
  var $element, destroyer;
1007
1059
  $element = $(this);
1008
1060
  destroyer = $element.data(DESTROYER_KEY);
@@ -1018,8 +1070,8 @@ We need to work on this page:
1018
1070
  @method up.magic.snapshot
1019
1071
  */
1020
1072
  snapshot = function() {
1021
- defaultLiveDescriptions = util.copy(liveDescriptions);
1022
- return defaultAwakeners = util.copy(awakeners);
1073
+ defaultLiveDescriptions = u.copy(liveDescriptions);
1074
+ return defaultAwakeners = u.copy(awakeners);
1023
1075
  };
1024
1076
 
1025
1077
  /**
@@ -1033,12 +1085,12 @@ We need to work on this page:
1033
1085
  var description, _i, _len, _ref;
1034
1086
  for (_i = 0, _len = liveDescriptions.length; _i < _len; _i++) {
1035
1087
  description = liveDescriptions[_i];
1036
- if (!util.contains(defaultLiveDescriptions, description)) {
1088
+ if (!u.contains(defaultLiveDescriptions, description)) {
1037
1089
  (_ref = $(document)).off.apply(_ref, description);
1038
1090
  }
1039
1091
  }
1040
- liveDescriptions = util.copy(defaultLiveDescriptions);
1041
- return awakeners = util.copy(defaultAwakeners);
1092
+ liveDescriptions = u.copy(defaultLiveDescriptions);
1093
+ return awakeners = u.copy(defaultAwakeners);
1042
1094
  };
1043
1095
 
1044
1096
  /**
@@ -1061,7 +1113,7 @@ We need to work on this page:
1061
1113
  };
1062
1114
  onEscape = function(handler) {
1063
1115
  return live('keydown', 'body', function(event) {
1064
- if (util.escapePressed(event)) {
1116
+ if (u.escapePressed(event)) {
1065
1117
  return handler(event);
1066
1118
  }
1067
1119
  });
@@ -1122,8 +1174,11 @@ We need to work on this page:
1122
1174
  @param {String} url
1123
1175
  @protected
1124
1176
  */
1125
- replace = function(url) {
1126
- if (!isCurrentUrl(url)) {
1177
+ replace = function(url, options) {
1178
+ options = u.options(options, {
1179
+ force: false
1180
+ });
1181
+ if (options.force || !isCurrentUrl(url)) {
1127
1182
  return manipulate("replace", url);
1128
1183
  }
1129
1184
  };
@@ -1154,12 +1209,14 @@ We need to work on this page:
1154
1209
  historyMethod: 'replace'
1155
1210
  });
1156
1211
  } else {
1157
- return console.log("null state");
1212
+ return console.log("strange state", state);
1158
1213
  }
1159
1214
  };
1160
1215
  setTimeout((function() {
1161
1216
  $(window).on("popstate", pop);
1162
- return replace(up.browser.url());
1217
+ return replace(up.browser.url(), {
1218
+ force: true
1219
+ });
1163
1220
  }), 200);
1164
1221
  return {
1165
1222
  push: push,
@@ -1193,9 +1250,9 @@ We need to work on this page:
1193
1250
 
1194
1251
  (function() {
1195
1252
  up.motion = (function() {
1196
- var animate, animation, animations, assertIsPromise, defaultAnimations, defaultOptions, defaultTransitions, findAnimation, morph, none, reset, snapshot, transition, transitions, u, withGhosts;
1253
+ var animate, animation, animations, assertIsPromise, config, defaultAnimations, defaultTransitions, defaults, findAnimation, morph, none, reset, snapshot, transition, transitions, u, withGhosts;
1197
1254
  u = up.util;
1198
- defaultOptions = {
1255
+ config = {
1199
1256
  duration: 300,
1200
1257
  delay: 0,
1201
1258
  easing: 'ease'
@@ -1205,6 +1262,16 @@ We need to work on this page:
1205
1262
  transitions = {};
1206
1263
  defaultTransitions = {};
1207
1264
 
1265
+ /**
1266
+ @method up.modal.defaults
1267
+ @param {Number} options.duration
1268
+ @param {Number} options.delay
1269
+ @param {String} options.easing
1270
+ */
1271
+ defaults = function(options) {
1272
+ return u.extend(config, options);
1273
+ };
1274
+
1208
1275
  /**
1209
1276
  Animates an element.
1210
1277
 
@@ -1234,7 +1301,7 @@ We need to work on this page:
1234
1301
  animate = function(elementOrSelector, animation, options) {
1235
1302
  var $element;
1236
1303
  $element = $(elementOrSelector);
1237
- options = u.options(options, defaultOptions);
1304
+ options = u.options(options, config);
1238
1305
  if (u.isFunction(animation)) {
1239
1306
  return assertIsPromise(animation($element, options), ["Animation did not return a Promise", animation]);
1240
1307
  } else if (u.isString(animation)) {
@@ -1289,8 +1356,8 @@ We need to work on this page:
1289
1356
  The following transitions are pre-registered:
1290
1357
 
1291
1358
  - `cross-fade`
1292
- - `move-top`
1293
- - `move-bottom`
1359
+ - `move-up`
1360
+ - `move-down`
1294
1361
  - `move-left`
1295
1362
  - `move-right`
1296
1363
  - `none`
@@ -1313,7 +1380,7 @@ We need to work on this page:
1313
1380
  */
1314
1381
  morph = function(source, target, transitionOrName, options) {
1315
1382
  var $new, $old, animation, parts, transition;
1316
- options = u.options(defaultOptions);
1383
+ options = u.options(config);
1317
1384
  $old = $(source);
1318
1385
  $new = $(target);
1319
1386
  transition = u.presence(transitionOrName, u.isFunction) || transitions[transitionOrName];
@@ -1397,67 +1464,91 @@ We need to work on this page:
1397
1464
  }, options);
1398
1465
  });
1399
1466
  animation('move-to-top', function($ghost, options) {
1467
+ var box, travelDistance;
1468
+ box = u.measure($ghost);
1469
+ travelDistance = box.top + box.height;
1400
1470
  $ghost.css({
1401
- 'margin-top': '0%'
1471
+ 'margin-top': '0px'
1402
1472
  });
1403
1473
  return animate($ghost, {
1404
- 'margin-top': '-100%'
1474
+ 'margin-top': "-" + travelDistance + "px"
1405
1475
  }, options);
1406
1476
  });
1407
1477
  animation('move-from-top', function($ghost, options) {
1478
+ var box, travelDistance;
1479
+ box = u.measure($ghost);
1480
+ travelDistance = box.top + box.height;
1408
1481
  $ghost.css({
1409
- 'margin-top': '-100%'
1482
+ 'margin-top': "-" + travelDistance + "px"
1410
1483
  });
1411
1484
  return animate($ghost, {
1412
- 'margin-top': '0%'
1485
+ 'margin-top': '0px'
1413
1486
  }, options);
1414
1487
  });
1415
1488
  animation('move-to-bottom', function($ghost, options) {
1489
+ var box, travelDistance;
1490
+ box = u.measure($ghost);
1491
+ travelDistance = u.clientSize().height - box.top;
1416
1492
  $ghost.css({
1417
- 'margin-top': '0%'
1493
+ 'margin-top': '0px'
1418
1494
  });
1419
1495
  return animate($ghost, {
1420
- 'margin-top': '100%'
1496
+ 'margin-top': travelDistance + "px"
1421
1497
  }, options);
1422
1498
  });
1423
1499
  animation('move-from-bottom', function($ghost, options) {
1500
+ var box, travelDistance;
1501
+ box = u.measure($ghost);
1502
+ travelDistance = u.clientSize().height - box.top;
1424
1503
  $ghost.css({
1425
- 'margin-top': '100%'
1504
+ 'margin-top': travelDistance + "px"
1426
1505
  });
1427
1506
  return animate($ghost, {
1428
- 'margin-top': '0%'
1507
+ 'margin-top': '0px'
1429
1508
  }, options);
1430
1509
  });
1431
1510
  animation('move-to-left', function($ghost, options) {
1511
+ var box, travelDistance;
1512
+ box = u.measure($ghost);
1513
+ travelDistance = box.left + box.width;
1432
1514
  $ghost.css({
1433
- 'margin-left': '0%'
1515
+ 'margin-left': '0px'
1434
1516
  });
1435
1517
  return animate($ghost, {
1436
- 'margin-left': '-100%'
1518
+ 'margin-left': "-" + travelDistance + "px"
1437
1519
  }, options);
1438
1520
  });
1439
1521
  animation('move-from-left', function($ghost, options) {
1522
+ var box, travelDistance;
1523
+ box = u.measure($ghost);
1524
+ travelDistance = box.left + box.width;
1440
1525
  $ghost.css({
1441
- 'margin-left': '-100%'
1526
+ 'margin-left': "-" + travelDistance + "px"
1442
1527
  });
1443
1528
  return animate($ghost, {
1444
- 'margin-left': '0%'
1529
+ 'margin-left': '0px'
1445
1530
  }, options);
1446
1531
  });
1447
1532
  animation('move-to-right', function($ghost, options) {
1533
+ var box, travelDistance;
1534
+ box = u.measure($ghost);
1535
+ travelDistance = u.clientSize().width - box.left;
1448
1536
  $ghost.css({
1449
- 'margin-left': '0%'
1537
+ 'margin-left': '0px'
1450
1538
  });
1451
1539
  return animate($ghost, {
1452
- 'margin-left': '100%'
1540
+ 'margin-left': travelDistance + "px"
1453
1541
  }, options);
1454
1542
  });
1455
1543
  animation('move-from-right', function($ghost, options) {
1544
+ var box, travelDistance;
1545
+ box = u.measure($ghost);
1546
+ travelDistance = u.clientSize().width - box.left;
1456
1547
  $ghost.css({
1457
- 'margin-left': '100%'
1548
+ 'margin-left': travelDistance + "px"
1458
1549
  });
1459
1550
  return animate($ghost, {
1460
- 'margin-left': '0%'
1551
+ 'margin-left': '0px'
1461
1552
  }, options);
1462
1553
  });
1463
1554
  animation('roll-down', function($ghost, options) {
@@ -1494,6 +1585,7 @@ We need to work on this page:
1494
1585
  animate: animate,
1495
1586
  transition: transition,
1496
1587
  animation: animation,
1588
+ defaults: defaults,
1497
1589
  none: none
1498
1590
  };
1499
1591
  })();
@@ -2391,12 +2483,13 @@ We need to work on this page:
2391
2483
  up.on('click', 'body', function(event, $body) {
2392
2484
  var $target;
2393
2485
  $target = $(event.target);
2394
- if (!($target.closest('.up-dialog').length || $target.closest('[up-modal]').length)) {
2486
+ if (!($target.closest('.up-modal-dialog').length || $target.closest('[up-modal]').length)) {
2395
2487
  return close();
2396
2488
  }
2397
2489
  });
2398
2490
  up.bus.on('fragment:ready', function($fragment) {
2399
2491
  if (!$fragment.closest('.up-modal').length) {
2492
+ console.log('fragment inserted', $fragment, $fragment.closest('.up-modal'));
2400
2493
  return autoclose();
2401
2494
  }
2402
2495
  });
data/dist/up.min.js CHANGED
@@ -1 +1 @@
1
- (function(){window.up={}}).call(this),function(){var t=[].slice;up.util=function(){var n,r,e,o,u,i,a,s,c,p,l,f,m,d,h,v,g,y,b,w,k,T,S,C,E,A,F,U,x,P,j,O,D,H,z,M,W,G,I,X,L,N,V,q,B,J,Q,_,R;return b=function(t,n){return n=n||{},n.url=t,r(n)},r=function(t){return t.selector&&(t.headers={"X-Up-Selector":t.selector}),$.ajax(t)},D=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},L=function(t,n){var r,e,o;return r=H(t)?$("<a>").attr({href:t}).get(0):R(t),e=r.protocol+"//"+r.hostname,D(r.protocol,r.port)||(e+=":"+r.port),o=r.pathname,(null!=n?n.stripTrailingSlash:void 0)===!0&&(o=o.replace(/\/$/,"")),e+=o,(null!=n?n.hash:void 0)===!0&&(e+=r.hash),(null!=n?n.search:void 0)!==!1&&(e+=r.search),e},n=function(t){var n,r,e,o,u,i,a,s,c,p,l,f,m,d,h,v;for(l=t.split(/[ >]/),e=null,p=m=0,h=l.length;h>m;p=++m){for(i=l[p],u=i.match(/(^|\.|\#)[A-Za-z0-9\-_]+/g),f="div",o=[],c=null,d=0,v=u.length;v>d;d++)switch(a=u[d],a[0]){case".":o.push(a.substr(1));break;case"#":c=a.substr(1);break;default:f=a}s="<"+f,o.length&&(s+=' class="'+o.join(" ")+'"'),c&&(s+=' id="'+c+'"'),s+=">",n=$(s),r&&n.appendTo(r),0===p&&(e=n),r=n}return e},c=function(t,n){var r;return r=document.createElement(t),r.innerHTML=n,r},h=function(){var n,r;throw n=1<=arguments.length?t.call(arguments,0):[],r=1===n.length&&up.util.isString(n[0])?n[0]:JSON.stringify(n),console.log.apply(console,["[UP] Error: "+r].concat(t.call(n))),alert(r),r},l=function(t){var n,r,e,o,u,i,a;for(console.log("Creating selector from element",t),r=(n=t.attr("class"))?n.split(" "):[],e=t.attr("id"),u=t.prop("tagName").toLowerCase(),e&&(u+="#"+e),i=0,a=r.length;a>i;i++)o=r[i],u+="."+o;return u},p=function(t){var n,r,e;return n=/<html>((?:.|\n)*)<\/html>/i,r=void 0,r=(e=t.match(n))?e[1]:"<html><body>"+t+"</body></html>",c("html",r)},g=$.extend,d=function(t,n){var r,e,o,u,i;for(i=[],r=o=0,u=t.length;u>o;r=++o)e=t[r],i.push(n(e,r));return i},x=function(t){return null===t},z=function(t){return void 0===t},S=function(t){return!z(t)},U=function(t){return z(t)||x(t)},E=function(t){return!U(t)},T=function(t){return U(t)||0===t.length},B=function(t,n){return null==n&&(n=j),n(t)?t:null},j=function(t){return!T(t)},C=function(t){return"function"==typeof t},H=function(t){return"string"==typeof t},A=function(t){return"object"==typeof t&&!!t},P=function(t){return A(t)||"function"==typeof t},F=function(t){return t instanceof jQuery},O=function(t){return C(t.then)},w=function(t){return E(t)?t:void 0},k=Array.isArray,a=function(t){return k(t)?t.slice():g({},t)},R=function(t){return F(t)?t.get(0):t},I=function(t,n){return g(a(t),n)},V=function(t,n){var r,e,o,u;if(o=t?a(t):{},n)for(e in n)r=n[e],u=o[e],E(u)?P(r)&&P(u)&&(o[e]=V(u,r)):o[e]=r;return o},N=function(){var n,r;return n=1<=arguments.length?t.call(arguments,0):[],r=null,n.every(function(t){var n;return n=t,C(n)&&(n=n()),j(n)?(r=n,!1):!0}),r},m=function(t,n){var r;return r=null,t.every(function(t){return n(t)?(r=t,!1):!0}),r},Q=function(t,n){var r;return r=[],d(t,function(t){return n(t)?r.push(t):void 0}),r},J=function(){var n,r,e,o;return n=arguments[0],e=2<=arguments.length?t.call(arguments,1):[],o=function(){var t,o,u;for(u=[],t=0,o=e.length;o>t;t++)r=e[t],u.push(n.attr(r));return u}(),m(o,j)},X=function(t){return setTimeout(t,0)},M=function(t){return t[t.length-1]},u=function(){var t;return t=document.documentElement,{width:t.clientWidth,height:t.clientHeight}},_=function(t,n,r){var e,o;return o=t.css(Object.keys(n)),t.css(n),e=function(){return t.css(o)},r?(r(),e()):e},f=function(t,n,r){var e,o,u,i;return r=V(r,{duration:300,delay:0,easing:"ease"}),e=$(t),o=$.Deferred(),u={"transition-property":Object.keys(n).join(", "),"transition-duration":r.duration+"ms","transition-delay":r.delay+"ms","transition-timing-function":r.easing},i=_(e,u),e.css(n),o.then(i),setTimeout(function(){return o.resolve()},r.duration+r.delay),o.promise()},G=function(t,n){var r,e,o;return e=(null!=n?n.relative:void 0)?t.position():t.offset(),r={left:e.left,top:e.top,width:t.outerWidth(),height:t.outerHeight()},(null!=n?n.full:void 0)&&(o=u(),r.right=o.width-(r.left+r.width),r.bottom=o.height-(r.top+r.height)),r},s=function(t,n){var r,e,o,u,i;for(u=t.get(0).attributes,i=[],e=0,o=u.length;o>e;e++)r=u[e],i.push(r.specified?n.attr(r.name,r.value):void 0);return i},q=function(t){var n,r;return r=G(t),n=t.clone(),n.find("script").remove(),n.css({right:"",bottom:"",margin:0,position:"absolute"}),n.css(r),n.addClass("up-ghost"),n.prependTo(document.body)},y=function(t,n){return t.find(n).addBack(n)},v=function(t){return 27===t.keyCode},i=function(t,n){return t.indexOf(n)>=0},o=function(t){return"true"===String(t)},e=function(t){return"false"===String(t)},W=function(t){return t.getResponseHeader("X-Up-Current-Location")},{presentAttr:J,createElement:c,normalizeUrl:L,createElementFromHtml:p,$createElementFromSelector:n,createSelectorFromElement:l,get:b,ajax:r,extend:g,copy:a,merge:I,options:V,option:N,error:h,each:d,detect:m,select:Q,last:M,isNull:x,isDefined:S,isUndefined:z,isGiven:E,isMissing:U,isPresent:j,isBlank:T,presence:B,isObject:P,isFunction:C,isString:H,isJQuery:F,isPromise:O,isHash:A,ifGiven:w,unwrap:R,nextFrame:X,measure:G,temporaryCss:_,cssAnimate:f,prependGhost:q,escapePressed:v,copyAttributes:s,findWithSelf:y,contains:i,isArray:k,castsToTrue:o,castsToFalse:e,locationFromXhr:W}}()}.call(this),function(){up.browser=function(){var t;return t=function(){return location.href},{url:t}}()}.call(this),function(){var t=[].slice;up.bus=function(){var n,r,e,o,u,i,a;return n={},e={},r=function(t){return n[t]||(n[t]=[])},a=function(){var t,r,o;e={},o=[];for(r in n)t=n[r],o.push(e[r]=up.util.copy(t));return o},i=function(){return n=up.util.copy(e)},u=function(t,n){return r(t).push(n)},o=function(){var n,e,o;return o=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],console.log("bus emitting",o,n),e=r(o),up.util.each(e,function(t){return t.apply(null,n)})},u("framework:ready",a),u("framework:reset",i),{on:u,emit:o}}()}.call(this),function(){up.flow=function(){var t,n,r,e,o,u,i,a,s,c,p,l;return l=up.util,s=function(t,n){var r;return r=$(t),l.isPresent(n)&&(n=l.normalizeUrl(n)),r.attr("up-source",n)},c=function(t){var n;return n=$(t).closest("[up-source]"),l.presence(n.attr("up-source"))||up.browser.url()},i=function(t,n,r){var o;return r=l.options(r),o=l.presence(t)?t:l.createSelectorFromElement($(t)),l.ajax({url:n,selector:o}).done(function(t,u,i){var a;return(a=l.locationFromXhr(i))&&(n=a),(l.isMissing(r.history)||l.castsToTrue(r.history))&&(r.history=n),(l.isMissing(r.source)||l.castsToTrue(r.source))&&(r.source=n),e(o,t,r)}).fail(l.error)},e=function(t,n,r){var e,u,i,a,s,c,f,m,d,h;for(r=l.options(r,{historyMethod:"push"}),a=l.createElementFromHtml(n),r.title||(r.title=null!=(m=a.querySelector("title"))?m.textContent:void 0),d=o(t,r),h=[],c=0,f=d.length;f>c;c++)s=d[c],u=l.presence($(".up-popup "+s.selector))||l.presence($(".up-modal "+s.selector))||l.presence($(s.selector)),(i=a.querySelector(s.selector))?(e=$(i),h.push(p(u,e,s.pseudoClass,s.transition,r))):h.push(l.error("Could not find selector ("+s.selector+") in response ("+n+")"));return h},r=function(n,r){return n.each(function(){var n;return n=$(this),"function"==typeof r.insert&&r.insert(n),r.history&&(r.title&&(document.title=r.title),up.history[r.historyMethod](r.history)),s(n,l.presence(r.source)||r.history),t(n),up.ready(n)})},p=function(t,e,o,u,i){var a,s;return u||(u="none"),o?(s="before"===o?"prepend":"append",a=e.children(),t[s](e.contents()),l.copyAttributes(e,t),r(a,i),up.animate(e,u)):n(t,{animation:function(){return e.insertAfter(t),r(e,i),t.is("body")&&"none"!==u&&l.error("Cannot apply transitions to body-elements",u),up.morph(t,e,u)}})},o=function(t,n){var r,e,o,u,i,a,s,c,p,f,m;for(s=n.transition||n.animation||"none",r=/\ *,\ */,e=t.split(r),l.isPresent(s)&&(c=s.split(r)),m=[],o=p=0,f=e.length;f>p;o=++p)u=e[o],i=u.match(/^(.+?)(?:\:(before|after))?$/),a=c[o]||l.last(c),m.push({selector:i[1],pseudoClass:i[2],transition:a});return m},t=function(t){var n,r;return r="[autofocus]:last",n=l.findWithSelf(t,r),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},n=function(t,n){var r,e;return r=$(t),n=l.options(n,{animation:"none"}),r.addClass("up-destroying"),l.isPresent(n.url)&&up.history.push(n.url),l.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",r),e=l.presence(n.animation,l.isPromise)||up.motion.animate(r,n.animation),e.then(function(){return r.remove()})},u=function(t){var n;return n=c(t),i(t,n)},a=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return s(document.body,up.browser.url())}),{replace:i,reload:u,destroy:n,implant:e,reset:a}}(),up.replace=up.flow.replace,up.reload=up.flow.reload,up.destroy=up.flow.destroy,up.reset=up.flow.reset}.call(this),function(){up.magic=function(){var t,n,r,e,o,u,i,a,s,c,p,l,f,m,d;return d=up.util,t="up-destroyable",n="up-destroyer",c=[],i=null,s=function(t,n,r){var e,o;return e=[t,n,function(t){return r.apply(this,[t,$(this)])}],c.push(e),(o=$(document)).on.apply(o,e)},e=[],u=null,r=function(t,n){return e.push({selector:t,callback:n})},o=function(r){var o,u,i,a;for(a=[],u=0,i=e.length;i>u;u++)o=e[u],a.push(d.findWithSelf(r,o.selector).each(function(){var r,e;return r=$(this),e=o.callback.apply(this,[r]),d.isFunction(e)?(r.addClass(t),r.data(n,e)):void 0}));return a},a=function(r){return d.findWithSelf(r,"."+t).each(function(){var t,r;return t=$(this),(r=t.data(n))()})},m=function(){return i=d.copy(c),u=d.copy(e)},f=function(){var t,n,r,o;for(n=0,r=c.length;r>n;n++)t=c[n],d.contains(i,t)||(o=$(document)).off.apply(o,t);return c=d.copy(i),e=d.copy(u)},l=function(t){var n;return n=$(t),up.bus.emit("fragment:ready",n),n},p=function(t){return s("keydown","body",function(n){return d.escapePressed(n)?t(n):void 0})},up.bus.on("app:ready",function(){return l(document.body)}),up.bus.on("fragment:ready",o),up.bus.on("fragment:destroy",a),up.bus.on("framework:ready",m),up.bus.on("framework:reset",f),{awaken:r,on:s,ready:l,onEscape:p}}(),up.awaken=up.magic.awaken,up.on=up.magic.on,up.ready=up.magic.ready}.call(this),function(){up.history=function(){var t,n,r,e,o,u;return u=up.util,t=function(t){return u.normalizeUrl(t,{hash:!0})===u.normalizeUrl(up.browser.url(),{hash:!0})},o=function(r){return t(r)?void 0:n("replace",r)},e=function(r){return t(r)?void 0:n("push",r)},n=function(t,n){return t+="State",window.history[t]({fromUp:!0},"",n)},r=function(t){var n;return n=t.originalEvent.state,console.log("popping state",n),console.log("current href",up.browser.url()),(null!=n?n.fromUp:void 0)?up.visit(up.browser.url(),{historyMethod:"replace"}):console.log("null state")},setTimeout(function(){return $(window).on("popstate",r),o(up.browser.url())},200),{push:e,replace:o}}()}.call(this),function(){up.motion=function(){var t,n,r,e,o,u,i,a,s,c,p,l,f,m,d,h;return d=up.util,u={duration:300,delay:0,easing:"ease"},r={},o={},m={},i={},t=function(n,r,o){var i;return i=$(n),o=d.options(o,u),d.isFunction(r)?e(r(i,o),["Animation did not return a Promise",r]):d.isString(r)?t(i,a(r),o):d.isHash(r)?d.cssAnimate(i,r,o):d.error("Unknown animation type",r)},a=function(t){return r[t]||d.error("Unknown animation",n)},h=function(t,n,r){var e,o,u,i;return o=null,e=null,d.temporaryCss(n,{display:"none"},function(){return o=d.prependGhost(t).addClass("up-destroying")}),d.temporaryCss(t,{display:"none"},function(){return e=d.prependGhost(n)}),t.css({visibility:"hidden"}),u=d.temporaryCss(n,{display:"none"}),i=r(o,e),i.then(function(){return o.remove(),e.remove(),t.css({display:"none"}),u()})},e=function(t,n){return d.isPromise(t)||d.error.apply(d,n),t},s=function(n,o,i,a){var c,p,l,f,v;return a=d.options(u),p=$(n),c=$(o),v=d.presence(i,d.isFunction)||m[i],v?h(p,c,function(t,n){return e(v(t,n,a),["Transition did not return a promise",i])}):(l=r[i])?(p.hide(),t(c,l,a)):d.isString(i)&&i.indexOf("/")>=0?(f=i.split("/"),v=function(n,r,e){return $.when(t(n,f[0],e),t(r,f[1],e))},s(p,c,v,a)):d.error("Unknown transition: "+i)},f=function(t,n){return m[t]=n},n=function(t,n){return r[t]=n},l=function(){return o=d.copy(r),i=d.copy(m)},p=function(){return r=d.copy(o),m=d.copy(i)},c=function(){var t;return t=$.Deferred(),t.resolve(),t.promise()},n("none",c),n("fade-in",function(n,r){return n.css({opacity:0}),t(n,{opacity:1},r)}),n("fade-out",function(n,r){return n.css({opacity:1}),t(n,{opacity:0},r)}),n("move-to-top",function(n,r){return n.css({"margin-top":"0%"}),t(n,{"margin-top":"-100%"},r)}),n("move-from-top",function(n,r){return n.css({"margin-top":"-100%"}),t(n,{"margin-top":"0%"},r)}),n("move-to-bottom",function(n,r){return n.css({"margin-top":"0%"}),t(n,{"margin-top":"100%"},r)}),n("move-from-bottom",function(n,r){return n.css({"margin-top":"100%"}),t(n,{"margin-top":"0%"},r)}),n("move-to-left",function(n,r){return n.css({"margin-left":"0%"}),t(n,{"margin-left":"-100%"},r)}),n("move-from-left",function(n,r){return n.css({"margin-left":"-100%"}),t(n,{"margin-left":"0%"},r)}),n("move-to-right",function(n,r){return n.css({"margin-left":"0%"}),t(n,{"margin-left":"100%"},r)}),n("move-from-right",function(n,r){return n.css({"margin-left":"100%"}),t(n,{"margin-left":"0%"},r)}),n("roll-down",function(n,r){var e,o;return e=n.height(),o=d.temporaryCss(n,{height:"0px",overflow:"hidden"}),t(n,{height:e+"px"},r).then(o)}),f("none",c),f("move-left",function(n,r,e){return $.when(t(n,"move-to-left",e),t(r,"move-from-right",e))}),f("move-right",function(n,r,e){return $.when(t(n,"move-to-right",e),t(r,"move-from-left",e))}),f("move-up",function(n,r,e){return $.when(t(n,"move-to-top",e),t(r,"move-from-bottom",e))}),f("move-down",function(n,r,e){return $.when(t(n,"move-to-bottom",e),t(r,"move-from-top",e))}),f("cross-fade",function(n,r,e){return $.when(t(n,"fade-out",e),t(r,"fade-in",e))}),up.bus.on("framework:ready",l),up.bus.on("framework:reset",p),{morph:s,animate:t,transition:f,animation:n,none:c}}(),up.transition=up.motion.transition,up.animation=up.motion.animation,up.morph=up.motion.morph,up.animate=up.motion.animate}.call(this),function(){up.link=function(){var t,n,r,e,o;return e=up.util,o=function(t,n){return console.log("up.visit",t),up.replace("body",t,n)},t=function(t,n){var r,o,u;return r=$(t),n=e.options(n),u=e.option(r.attr("href"),r.attr("up-follow")),o=e.option(n.target,r.attr("up-target"),"body"),n.transition=e.option(n.transition,r.attr("up-transition"),r.attr("up-animation")),n.history=e.option(n.history,r.attr("up-history")),up.replace(o,u,n)},n=function(t){var n;return n=$(t),n.is("a")||e.presentAttr(n,"up-follow")?n:n.find("a:first")},r=function(t){var r;return(r=n(t))?e.option(r.attr("href"),r.attr("up-follow")):void 0},up.on("click","a[up-target]",function(n,r){return n.preventDefault(),t(r)}),up.on("click","[up-follow]",function(r,e){var o;return o=function(){var t,n;return t=$(r.target),n=t.closest("a, [up-follow]"),n.length&&e.find(n).length},o()?void 0:(r.preventDefault(),t(n(e)))}),{visit:o,follow:t,resolve:n,resolveUrl:r}}(),up.visit=up.link.visit,up.follow=up.link.follow}.call(this),function(){up.form=function(){var observe,submit,u;return u=up.util,submit=function(t,n){var r,e,o,i,a,s,c,p,l,f;return r=$(t).closest("form"),n=u.options(n),c=u.option(n.target,r.attr("up-target"),"body"),e=u.option(n.failTarget,r.attr("up-fail-target"),function(){return u.createSelectorFromElement(r)}),i=u.option(n.history,r.attr("up-history"),!0),p=u.option(n.transition,r.attr("up-transition")),o=u.option(n.failTransition,r.attr("up-fail-transition")),a=u.option(n.method,r.attr("up-method"),r.attr("data-method"),r.attr("method"),"post").toUpperCase(),f=u.option(n.url,r.attr("action"),up.browser.url()),r.addClass("up-active"),s={url:f,type:a,data:r.serialize(),selector:c},l=function(t){var n;return f=i?"false"===i?!1:u.isString(i)?i:(n=u.locationFromXhr(t))?n:"GET"===s.type?s.url+"?"+s.data:void 0:void 0,u.option(f,!1)},u.ajax(s).always(function(){return r.removeClass("up-active")}).done(function(t,n,r){return up.flow.implant(c,t,{history:l(r),transition:p})}).fail(function(t){var n;return n=t.responseText,up.flow.implant(e,n,{transition:o})})},observe=function(fieldOrSelector,options){var $field,callback,check,clearTimer,codeOnChange,knownValue,resetTimer,startTimer,timer;return $field=$(fieldOrSelector),options=u.options(options,{frequency:500}),knownValue=null,timer=null,callback=null,(codeOnChange=$field.attr("up-observe"))?callback=function(value,$field){return eval(codeOnChange)}:options.change?callback=options.change:u.error("observe: No change callback given"),check=function(){var t,n;return n=$field.val(),t=_.isNull(knownValue),knownValue===n||(knownValue=n,t)?void 0:callback.apply($field.get(0),[n,$field])},resetTimer=function(){return timer?(clearTimer(),startTimer()):void 0},clearTimer=function(){return clearInterval(timer),timer=null},startTimer=function(){return timer=setInterval(check,options.frequency)},$field.bind("keyup click mousemove",resetTimer),check(),startTimer(),clearTimer},up.on("submit","form[up-target]",function(t,n){return t.preventDefault(),submit(n)}),up.awaken("[up-observe]",function(t){return observe(t)}),{submit:submit,observe:observe}}(),up.submit=up.form.submit,up.observe=up.form.observe}.call(this),function(){up.popup=function(){var t,n,r,e,o,u,i,a,s,c,p;return c=up.util,r={openAnimation:"fade-in",closeAnimation:"fade-out",origin:"bottom-right"},o=function(t){return c.extend(r,t)},a=function(t,n,r){var e,o;return o=c.measure(t,{full:!0}),e=function(){switch(r){case"bottom-right":return{right:o.right,top:o.top+o.height};case"bottom-left":return{left:o.left,top:o.bottom+o.height};case"top-right":return{right:o.right,bottom:o.top};case"top-left":return{left:o.left,bottom:o.top};default:return c.error("Unknown origin",r)}}(),n.attr("up-origin",r),n.css(e),u(n)},u=function(t){var n,r,e,o,u,i,a;if(r=c.measure(t,{full:!0}),e=null,o=null,r.right<0&&(e=-r.right),r.bottom<0&&(o=-r.bottom),r.left<0&&(e=r.left),r.top<0&&(o=r.top),e&&((u=parseInt(t.css("left")))?t.css("left",u-e):(i=parseInt(t.css("right")))&&t.css("right",i+e)),o){if(a=parseInt(t.css("top")))return t.css("top",a-o);if(n=parseInt(t.css("bottom")))return t.css("bottom",n+o)}},e=function(t,n,r){var e,o;return o=c.$createElementFromSelector(".up-popup"),r&&o.attr("up-sticky",""),o.attr("up-previous-url",up.browser.url()),o.attr("up-previous-title",document.title),e=c.$createElementFromSelector(n),e.appendTo(o),o.appendTo(document.body),o.hide(),o},p=function(t,n,r,e){return n.show(),a(t,n,r),up.animate(n,e)},i=function(t,o){var u,i,a,s,l,f,m,d;return u=$(t),o=c.options(o),d=c.option(u.attr("href")),f=c.option(o.target,u.attr("up-popup"),"body"),l=c.option(o.origin,u.attr("up-origin"),r.origin),a=c.option(o.animation,u.attr("up-animation"),r.openAnimation),m=c.option(o.sticky,u.is("[up-sticky]")),s=c.option(o.history,u.attr("up-history"),!1),n(),i=e(u,f,m),up.replace(f,d,{history:s,insert:function(){return p(u,i,l,a)}})},s=function(){var t;return t=$(".up-popup"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-popup"),n.length?(t=c.options(t,{animation:r.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),up.destroy(n,t)):void 0},t=function(){return $(".up-popup").is("[up-sticky]")?void 0:n()},up.on("click","a[up-popup]",function(t,r){return t.preventDefault(),r.is(".up-current")?n():i(r)}),up.on("click","body",function(t){var r;return r=$(t.target),r.closest(".up-popup").length||r.closest("[up-popup]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-popup").length?void 0:t()}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,r){return r.closest(".up-popup")?n():void 0}),up.bus.on("framework:reset",n),{open:i,close:n,source:s,defaults:o}}()}.call(this),function(){up.modal=function(){var t,n,r,e,o,u,i,a,s,c;return s=up.util,r={width:"auto",height:"auto",openAnimation:"fade-in",closeAnimation:"fade-out",closeLabel:"X",template:function(t){return'<div class="up-modal">\n <div class="up-modal-dialog">\n <div class="up-modal-close" up-close>'+t.closeLabel+'</div>\n <div class="up-modal-content"></div>\n </div>\n</div>'}},o=function(t){return s.extend(r,t)},a=function(){var t;return t=r.template,s.isFunction(t)?t(r):t},e=function(t,n,r,e){var o,u,i,c;return i=$(a()),e&&i.attr("up-sticky",""),i.attr("up-previous-url",up.browser.url()),i.attr("up-previous-title",document.title),u=i.find(".up-modal-dialog"),s.isPresent(n)&&u.css("width",n),s.isPresent(r)&&u.css("height",r),o=u.find(".up-modal-content"),c=s.$createElementFromSelector(t),c.appendTo(o),i.appendTo(document.body),i.hide(),i},c=function(t,n){return t.show(),up.animate(t,n)},u=function(t,o){var u,i,a,p,l,f,m,d,h;return u=$(t),o=s.options(o),d=s.option(u.attr("href")),f=s.option(o.target,u.attr("up-modal"),"body"),h=s.option(o.width,u.attr("up-width"),r.width),p=s.option(o.height,u.attr("up-height"),r.height),a=s.option(o.animation,u.attr("up-animation"),r.openAnimation),m=s.option(o.sticky,u.is("[up-sticky]")),l=s.option(o.history,u.attr("up-history"),!0),n(),i=e(f,h,p,m),up.replace(f,d,{history:l,insert:function(){return c(i,a)}})},i=function(){var t;return t=$(".up-modal"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-modal"),n.length?(t=s.options(t,{animation:r.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),up.destroy(n,t)):void 0},t=function(){return $(".up-modal").is("[up-sticky]")?void 0:n()},up.on("click","a[up-modal]",function(t,r){return t.preventDefault(),r.is(".up-current")?n():u(r)}),up.on("click","body",function(t){var r;return r=$(t.target),r.closest(".up-dialog").length||r.closest("[up-modal]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-modal").length?void 0:t()}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,r){return r.closest(".up-modal")?n():void 0}),up.bus.on("framework:reset",n),{open:u,close:n,source:i,defaults:o}}()}.call(this),function(){up.tooltip=function(){var t,n,r,e,o;return o=up.util,e=function(t,n,r){var e,u,i;return u=o.measure(t),i=o.measure(n),e=function(){switch(r){case"top":return{left:u.left+.5*(u.width-i.width),top:u.top-i.height};case"bottom":return{left:u.left+.5*(u.width-i.width),top:u.top+u.height};default:return o.error("Unknown origin",r)}}(),n.attr("up-origin",r),n.css(e)},n=function(t){return o.$createElementFromSelector(".up-tooltip").html(t).appendTo(document.body)},r=function(r,u){var i,a,s,c,p;return null==u&&(u={}),i=$(r),c=o.option(u.html,i.attr("up-tooltip")),p=o.option(u.origin,i.attr("up-origin"),"top"),s=o.option(u.animation,i.attr("up-animation"),"fade-in"),t(),a=n(c),e(i,a,p),up.animate(a,s,u)},t=function(t){var n;return n=$(".up-tooltip"),n.length?(t=o.options(t,{animation:"fade-out"}),up.destroy(n,t)):void 0},up.awaken("[up-tooltip]",function(n){return n.on("mouseover",function(){return r(n)}),n.on("mouseout",function(){return t()})}),up.on("click","body",function(){return t()}),up.bus.on("framework:reset",t),up.magic.onEscape(function(){return t()}),{open:r,close:t}}()}.call(this),function(){up.navigation=function(){var t,n,r,e,o,u,i,a,s,c;return s=up.util,t="up-active",n="up-current",e="a[href], a[up-target], [up-follow], [up-modal], [up-popup]",r="."+t,i=function(t){return s.isPresent(t)?s.normalizeUrl(t,{search:!1,stripTrailingSlash:!0}):void 0},u=function(){var t,r,o;return o=i(up.browser.url()),t=i(up.modal.source()),r=i(up.popup.source()),s.each($(e),function(e){var u,a;return u=$(e),a=up.link.resolveUrl(u),a=i(a),a===o||a===t||a===r?u.addClass(n):u.removeClass(n)})},a=function(n){return c(),n=o(n),n.addClass(t)},o=function(t){return s.presence(t.parents(e))||t},c=function(){return $(r).removeClass(t)},up.on("click",e,function(t,n){return a(n)}),up.bus.on("fragment:ready",function(){return c(),u()}),up.bus.on("fragment:destroy",function(t){return t.is(".up-modal, .up-popup")?u():void 0})}()}.call(this),function(){up.marker=function(){var t,n;return n=function(t){return""!==t.html().trim()},t=function(t){return up.util.findWithSelf(t,"[up-marker]").each(function(){var t;return t=$(this),n(t)?void 0:t.hide()})},up.bus.on("fragment:ready",t)}()}.call(this),function(){up.bus.emit("framework:ready"),$(document).on("ready",function(){return up.bus.emit("app:ready")})}.call(this);
1
+ (function(){window.up={}}).call(this),function(){var t=[].slice;up.util=function(){var n,r,e,o,i,u,a,s,c,p,l,f,m,d,h,v,g,y,b,w,k,T,S,x,C,E,A,F,U,P,j,z,O,D,H,M,W,G,I,X,L,N,V,q,B,Z,J,Q,_,R;return w=function(t,n){return n=n||{},n.url=t,r(n)},r=function(t){return t.selector&&(t.headers={"X-Up-Selector":t.selector}),$.ajax(t)},D=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},N=function(t,n){var r,e,o;return r=H(t)?$("<a>").attr({href:t}).get(0):R(t),e=r.protocol+"//"+r.hostname,D(r.protocol,r.port)||(e+=":"+r.port),o=r.pathname,(null!=n?n.stripTrailingSlash:void 0)===!0&&(o=o.replace(/\/$/,"")),e+=o,(null!=n?n.hash:void 0)===!0&&(e+=r.hash),(null!=n?n.search:void 0)!==!1&&(e+=r.search),e},n=function(t){var n,r,e,o,i,u,a,s,c,p,l,f,m,d,h,v;for(l=t.split(/[ >]/),e=null,p=m=0,h=l.length;h>m;p=++m){for(u=l[p],i=u.match(/(^|\.|\#)[A-Za-z0-9\-_]+/g),f="div",o=[],c=null,d=0,v=i.length;v>d;d++)switch(a=i[d],a[0]){case".":o.push(a.substr(1));break;case"#":c=a.substr(1);break;default:f=a}s="<"+f,o.length&&(s+=' class="'+o.join(" ")+'"'),c&&(s+=' id="'+c+'"'),s+=">",n=$(s),r&&n.appendTo(r),0===p&&(e=n),r=n}return e},c=function(t,n){var r;return r=document.createElement(t),r.innerHTML=n,r},h=function(){var n,r;throw n=1<=arguments.length?t.call(arguments,0):[],r=1===n.length&&up.util.isString(n[0])?n[0]:JSON.stringify(n),console.log.apply(console,["[UP] Error: "+r].concat(t.call(n))),alert(r),r},l=function(t){var n,r,e,o,i,u,a;for(console.log("Creating selector from element",t),r=(n=t.attr("class"))?n.split(" "):[],e=t.attr("id"),i=t.prop("tagName").toLowerCase(),e&&(i+="#"+e),u=0,a=r.length;a>u;u++)o=r[u],i+="."+o;return i},p=function(t){var n,r,e;return n=/<html>((?:.|\n)*)<\/html>/i,r=void 0,r=(e=t.match(n))?e[1]:"<html><body>"+t+"</body></html>",c("html",r)},g=$.extend,d=function(t,n){var r,e,o,i,u;for(u=[],r=o=0,i=t.length;i>o;r=++o)e=t[r],u.push(n(e,r));return u},P=function(t){return null===t},M=function(t){return void 0===t},x=function(t){return!M(t)},U=function(t){return M(t)||P(t)},E=function(t){return!U(t)},S=function(t){return U(t)||j(t)&&0===Object.keys(t).length||0===t.length},Z=function(t,n){return null==n&&(n=z),n(t)?t:null},z=function(t){return!S(t)},C=function(t){return"function"==typeof t},H=function(t){return"string"==typeof t},A=function(t){return"object"==typeof t&&!!t},j=function(t){return A(t)||"function"==typeof t},F=function(t){return t instanceof jQuery},O=function(t){return C(t.then)},k=function(t){return E(t)?t:void 0},T=Array.isArray,a=function(t){return T(t)?t.slice():g({},t)},R=function(t){return F(t)?t.get(0):t},X=function(t,n){return g(a(t),n)},q=function(t,n){var r,e,o,i;if(o=t?a(t):{},n)for(e in n)r=n[e],i=o[e],E(i)?j(r)&&j(i)&&(o[e]=q(i,r)):o[e]=r;return o},V=function(){var n,r;return n=1<=arguments.length?t.call(arguments,0):[],r=null,n.every(function(t){var n;return n=t,C(n)&&(n=n()),z(n)?(r=n,!1):!0}),r},m=function(t,n){var r;return r=null,t.every(function(t){return n(t)?(r=t,!1):!0}),r},Q=function(t,n){var r;return r=[],d(t,function(t){return n(t)?r.push(t):void 0}),r},J=function(){var n,r,e,o;return n=arguments[0],e=2<=arguments.length?t.call(arguments,1):[],o=function(){var t,o,i;for(i=[],t=0,o=e.length;o>t;t++)r=e[t],i.push(n.attr(r));return i}(),m(o,z)},L=function(t){return setTimeout(t,0)},W=function(t){return t[t.length-1]},i=function(){var t;return t=document.documentElement,{width:t.clientWidth,height:t.clientHeight}},_=function(t,n,r){var e,o;return o=t.css(Object.keys(n)),t.css(n),e=function(){return t.css(o)},r?(r(),e()):e},b=function(t){var n,r;return r=t.css(["transform","-webkit-transform"]),S(r)?(n=function(){return t.css(r)},t.css({transform:"translateZ(0)","-webkit-transform":"translateZ(0)"})):n=function(){},n},f=function(t,n,r){var e,o,i,u,a;return r=q(r,{duration:300,delay:0,easing:"ease"}),e=$(t),o=$.Deferred(),i={"transition-property":Object.keys(n).join(", "),"transition-duration":r.duration+"ms","transition-delay":r.delay+"ms","transition-timing-function":r.easing},u=b(e),a=_(e,i),e.css(n),o.then(u),o.then(a),setTimeout(function(){return o.resolve()},r.duration+r.delay),o.promise()},I=function(t,n){var r,e,o;return e=(null!=n?n.relative:void 0)?t.position():t.offset(),r={left:e.left,top:e.top},(null!=n?n.inner:void 0)?(r.width=t.width(),r.height=t.height()):(r.width=t.outerWidth(),r.height=t.outerHeight()),(null!=n?n.full:void 0)&&(o=i(),r.right=o.width-(r.left+r.width),r.bottom=o.height-(r.top+r.height)),r},s=function(t,n){var r,e,o,i,u;for(i=t.get(0).attributes,u=[],e=0,o=i.length;o>e;e++)r=i[e],u.push(r.specified?n.attr(r.name,r.value):void 0);return u},B=function(t){var n,r;return r=I(t,{relative:!0,inner:!0}),n=t.clone(),n.find("script").remove(),n.css({right:"",bottom:"",position:"absolute"}),n.css(r),n.addClass("up-ghost"),n.insertBefore(t)},y=function(t,n){return t.find(n).addBack(n)},v=function(t){return 27===t.keyCode},u=function(t,n){return t.indexOf(n)>=0},o=function(t){return"true"===String(t)},e=function(t){return"false"===String(t)},G=function(t){return t.getResponseHeader("X-Up-Current-Location")},{presentAttr:J,createElement:c,normalizeUrl:N,createElementFromHtml:p,$createElementFromSelector:n,createSelectorFromElement:l,get:w,ajax:r,extend:g,copy:a,merge:X,options:q,option:V,error:h,each:d,detect:m,select:Q,last:W,isNull:P,isDefined:x,isUndefined:M,isGiven:E,isMissing:U,isPresent:z,isBlank:S,presence:Z,isObject:j,isFunction:C,isString:H,isJQuery:F,isPromise:O,isHash:A,ifGiven:k,unwrap:R,nextFrame:L,measure:I,temporaryCss:_,cssAnimate:f,forceCompositing:b,prependGhost:B,escapePressed:v,copyAttributes:s,findWithSelf:y,contains:u,isArray:T,castsToTrue:o,castsToFalse:e,locationFromXhr:G,clientSize:i}}()}.call(this),function(){up.browser=function(){var t;return t=function(){return location.href},{url:t}}()}.call(this),function(){var t=[].slice;up.bus=function(){var n,r,e,o,i,u,a;return n={},e={},r=function(t){return n[t]||(n[t]=[])},a=function(){var t,r,o;e={},o=[];for(r in n)t=n[r],o.push(e[r]=up.util.copy(t));return o},u=function(){return n=up.util.copy(e)},i=function(t,n){return r(t).push(n)},o=function(){var n,e,o;return o=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],console.log("bus emitting",o,n),e=r(o),up.util.each(e,function(t){return t.apply(null,n)})},i("framework:ready",a),i("framework:reset",u),{on:i,emit:o}}()}.call(this),function(){up.flow=function(){var t,n,r,e,o,i,u,a,s,c,p,l;return l=up.util,s=function(t,n){var r;return r=$(t),l.isPresent(n)&&(n=l.normalizeUrl(n)),r.attr("up-source",n)},c=function(t){var n;return n=$(t).closest("[up-source]"),l.presence(n.attr("up-source"))||up.browser.url()},u=function(t,n,r){var o;return r=l.options(r),o=l.presence(t)?t:l.createSelectorFromElement($(t)),l.ajax({url:n,selector:o}).done(function(t,i,u){var a;return(a=l.locationFromXhr(u))&&(n=a),(l.isMissing(r.history)||l.castsToTrue(r.history))&&(r.history=n),(l.isMissing(r.source)||l.castsToTrue(r.source))&&(r.source=n),e(o,t,r)}).fail(l.error)},e=function(t,n,r){var e,i,u,a,s,c,f,m,d,h;for(r=l.options(r,{historyMethod:"push"}),"false"===r.history&&(r.history=null),r.source=l.option(r.source,r.history),a=l.createElementFromHtml(n),r.title||(r.title=null!=(m=a.querySelector("title"))?m.textContent:void 0),d=o(t,r),h=[],c=0,f=d.length;f>c;c++)s=d[c],i=l.presence($(".up-popup "+s.selector))||l.presence($(".up-modal "+s.selector))||l.presence($(s.selector)),(u=a.querySelector(s.selector))?(e=$(u),h.push(p(i,e,s.pseudoClass,s.transition,r))):h.push(l.error("Could not find selector ("+s.selector+") in response ("+n+")"));return h},r=function(n,r){return"function"==typeof r.insert&&r.insert(n),r.history&&(r.title&&(document.title=r.title),up.history[r.historyMethod](r.history)),s(n,r.source),t(n),up.ready(n)},p=function(t,e,o,i,u){var a,s;return i||(i="none"),o?(s="before"===o?"prepend":"append",a=e.children(),t[s](e.contents()),l.copyAttributes(e,t),r(a,u),up.animate(e,i)):n(t,{animation:function(){return e.insertAfter(t),r(e,u),t.is("body")&&"none"!==i&&l.error("Cannot apply transitions to body-elements",i),up.morph(t,e,i)}})},o=function(t,n){var r,e,o,i,u,a,s,c,p,f,m;for(s=n.transition||n.animation||"none",r=/\ *,\ */,e=t.split(r),l.isPresent(s)&&(c=s.split(r)),m=[],o=p=0,f=e.length;f>p;o=++p)i=e[o],u=i.match(/^(.+?)(?:\:(before|after))?$/),a=c[o]||l.last(c),m.push({selector:u[1],pseudoClass:u[2],transition:a});return m},t=function(t){var n,r;return r="[autofocus]:last",n=l.findWithSelf(t,r),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},n=function(t,n){var r,e;return r=$(t),n=l.options(n,{animation:"none"}),r.addClass("up-destroying"),l.isPresent(n.url)&&up.history.push(n.url),l.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",r),e=l.presence(n.animation,l.isPromise)||up.motion.animate(r,n.animation),e.then(function(){return r.remove()})},i=function(t){var n;return n=c(t),u(t,n)},a=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return s(document.body,up.browser.url())}),{replace:u,reload:i,destroy:n,implant:e,reset:a}}(),up.replace=up.flow.replace,up.reload=up.flow.reload,up.destroy=up.flow.destroy,up.reset=up.flow.reset}.call(this),function(){var t=[].slice;up.magic=function(){var n,r,e,o,i,u,a,s,c,p,l,f,m,d,h,v;return v=up.util,n="up-destroyable",r="up-destroyer",l=[],s=null,p=function(t,n,r){var e,o;return e=[t,n,function(t){return r.apply(this,[t,$(this)])}],l.push(e),(o=$(document)).on.apply(o,e)},i=[],a=null,o=function(){var n,r,e,o;return o=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],r=n.pop(),e=v.options(n[0],{batch:!1}),i.push({selector:o,callback:r,batch:e.batch})},e=function(t,e,o){var i;return i=t.callback.apply(o,[e]),v.isFunction(i)?(e.addClass(n),e.data(r,i)):void 0},u=function(t){var n,r,o,u,a;for(console.log("Compiling fragment",t),a=[],o=0,u=i.length;u>o;o++)r=i[o],n=v.findWithSelf(t,r.selector),a.push(n.length?r.batch?e(r,n,n.get()):n.each(function(){return e(r,$(this),this)}):void 0);return a},c=function(t){return v.findWithSelf(t,"."+n).each(function(){var t,n;return t=$(this),(n=t.data(r))()})},h=function(){return s=v.copy(l),a=v.copy(i)},d=function(){var t,n,r,e;for(n=0,r=l.length;r>n;n++)t=l[n],v.contains(s,t)||(e=$(document)).off.apply(e,t);return l=v.copy(s),i=v.copy(a)},m=function(t){var n;return n=$(t),up.bus.emit("fragment:ready",n),n},f=function(t){return p("keydown","body",function(n){return v.escapePressed(n)?t(n):void 0})},up.bus.on("app:ready",function(){return m(document.body)}),up.bus.on("fragment:ready",u),up.bus.on("fragment:destroy",c),up.bus.on("framework:ready",h),up.bus.on("framework:reset",d),{awaken:o,on:p,ready:m,onEscape:f}}(),up.awaken=up.magic.awaken,up.on=up.magic.on,up.ready=up.magic.ready}.call(this),function(){up.history=function(){var t,n,r,e,o,i;return i=up.util,t=function(t){return i.normalizeUrl(t,{hash:!0})===i.normalizeUrl(up.browser.url(),{hash:!0})},o=function(r,e){return e=i.options(e,{force:!1}),e.force||!t(r)?n("replace",r):void 0},e=function(r){return t(r)?void 0:n("push",r)},n=function(t,n){return t+="State",window.history[t]({fromUp:!0},"",n)},r=function(t){var n;return n=t.originalEvent.state,console.log("popping state",n),console.log("current href",up.browser.url()),(null!=n?n.fromUp:void 0)?up.visit(up.browser.url(),{historyMethod:"replace"}):console.log("strange state",n)},setTimeout(function(){return $(window).on("popstate",r),o(up.browser.url(),{force:!0})},200),{push:e,replace:o}}()}.call(this),function(){up.motion=function(){var t,n,r,e,o,i,u,a,s,c,p,l,f,m,d,h,v;return h=up.util,o={duration:300,delay:0,easing:"ease"},r={},i={},d={},u={},a=function(t){return h.extend(o,t)},t=function(n,r,i){var u;return u=$(n),i=h.options(i,o),h.isFunction(r)?e(r(u,i),["Animation did not return a Promise",r]):h.isString(r)?t(u,s(r),i):h.isHash(r)?h.cssAnimate(u,r,i):h.error("Unknown animation type",r)},s=function(t){return r[t]||h.error("Unknown animation",n)},v=function(t,n,r){var e,o,i,u;return o=null,e=null,h.temporaryCss(n,{display:"none"},function(){return o=h.prependGhost(t).addClass("up-destroying")}),h.temporaryCss(t,{display:"none"},function(){return e=h.prependGhost(n)}),t.css({visibility:"hidden"}),i=h.temporaryCss(n,{display:"none"}),u=r(o,e),u.then(function(){return o.remove(),e.remove(),t.css({display:"none"}),i()})},e=function(t,n){return h.isPromise(t)||h.error.apply(h,n),t},c=function(n,i,u,a){var s,p,l,f,m;return a=h.options(o),p=$(n),s=$(i),m=h.presence(u,h.isFunction)||d[u],m?v(p,s,function(t,n){return e(m(t,n,a),["Transition did not return a promise",u])}):(l=r[u])?(p.hide(),t(s,l,a)):h.isString(u)&&u.indexOf("/")>=0?(f=u.split("/"),m=function(n,r,e){return $.when(t(n,f[0],e),t(r,f[1],e))},c(p,s,m,a)):h.error("Unknown transition: "+u)},m=function(t,n){return d[t]=n},n=function(t,n){return r[t]=n},f=function(){return i=h.copy(r),u=h.copy(d)},l=function(){return r=h.copy(i),d=h.copy(u)},p=function(){var t;return t=$.Deferred(),t.resolve(),t.promise()},n("none",p),n("fade-in",function(n,r){return n.css({opacity:0}),t(n,{opacity:1},r)}),n("fade-out",function(n,r){return n.css({opacity:1}),t(n,{opacity:0},r)}),n("move-to-top",function(n,r){var e,o;return e=h.measure(n),o=e.top+e.height,n.css({"margin-top":"0px"}),t(n,{"margin-top":"-"+o+"px"},r)}),n("move-from-top",function(n,r){var e,o;return e=h.measure(n),o=e.top+e.height,n.css({"margin-top":"-"+o+"px"}),t(n,{"margin-top":"0px"},r)}),n("move-to-bottom",function(n,r){var e,o;return e=h.measure(n),o=h.clientSize().height-e.top,n.css({"margin-top":"0px"}),t(n,{"margin-top":o+"px"},r)}),n("move-from-bottom",function(n,r){var e,o;return e=h.measure(n),o=h.clientSize().height-e.top,n.css({"margin-top":o+"px"}),t(n,{"margin-top":"0px"},r)}),n("move-to-left",function(n,r){var e,o;return e=h.measure(n),o=e.left+e.width,n.css({"margin-left":"0px"}),t(n,{"margin-left":"-"+o+"px"},r)}),n("move-from-left",function(n,r){var e,o;return e=h.measure(n),o=e.left+e.width,n.css({"margin-left":"-"+o+"px"}),t(n,{"margin-left":"0px"},r)}),n("move-to-right",function(n,r){var e,o;return e=h.measure(n),o=h.clientSize().width-e.left,n.css({"margin-left":"0px"}),t(n,{"margin-left":o+"px"},r)}),n("move-from-right",function(n,r){var e,o;return e=h.measure(n),o=h.clientSize().width-e.left,n.css({"margin-left":o+"px"}),t(n,{"margin-left":"0px"},r)}),n("roll-down",function(n,r){var e,o;return e=n.height(),o=h.temporaryCss(n,{height:"0px",overflow:"hidden"}),t(n,{height:e+"px"},r).then(o)}),m("none",p),m("move-left",function(n,r,e){return $.when(t(n,"move-to-left",e),t(r,"move-from-right",e))}),m("move-right",function(n,r,e){return $.when(t(n,"move-to-right",e),t(r,"move-from-left",e))}),m("move-up",function(n,r,e){return $.when(t(n,"move-to-top",e),t(r,"move-from-bottom",e))}),m("move-down",function(n,r,e){return $.when(t(n,"move-to-bottom",e),t(r,"move-from-top",e))}),m("cross-fade",function(n,r,e){return $.when(t(n,"fade-out",e),t(r,"fade-in",e))}),up.bus.on("framework:ready",f),up.bus.on("framework:reset",l),{morph:c,animate:t,transition:m,animation:n,defaults:a,none:p}}(),up.transition=up.motion.transition,up.animation=up.motion.animation,up.morph=up.motion.morph,up.animate=up.motion.animate}.call(this),function(){up.link=function(){var t,n,r,e,o;return e=up.util,o=function(t,n){return console.log("up.visit",t),up.replace("body",t,n)},t=function(t,n){var r,o,i;return r=$(t),n=e.options(n),i=e.option(r.attr("href"),r.attr("up-follow")),o=e.option(n.target,r.attr("up-target"),"body"),n.transition=e.option(n.transition,r.attr("up-transition"),r.attr("up-animation")),n.history=e.option(n.history,r.attr("up-history")),up.replace(o,i,n)},n=function(t){var n;return n=$(t),n.is("a")||e.presentAttr(n,"up-follow")?n:n.find("a:first")},r=function(t){var r;return(r=n(t))?e.option(r.attr("href"),r.attr("up-follow")):void 0},up.on("click","a[up-target]",function(n,r){return n.preventDefault(),t(r)}),up.on("click","[up-follow]",function(r,e){var o;return o=function(){var t,n;return t=$(r.target),n=t.closest("a, [up-follow]"),n.length&&e.find(n).length},o()?void 0:(r.preventDefault(),t(n(e)))}),{visit:o,follow:t,resolve:n,resolveUrl:r}}(),up.visit=up.link.visit,up.follow=up.link.follow}.call(this),function(){up.form=function(){var observe,submit,u;return u=up.util,submit=function(t,n){var r,e,o,i,a,s,c,p,l,f;return r=$(t).closest("form"),n=u.options(n),c=u.option(n.target,r.attr("up-target"),"body"),e=u.option(n.failTarget,r.attr("up-fail-target"),function(){return u.createSelectorFromElement(r)}),i=u.option(n.history,r.attr("up-history"),!0),p=u.option(n.transition,r.attr("up-transition")),o=u.option(n.failTransition,r.attr("up-fail-transition")),a=u.option(n.method,r.attr("up-method"),r.attr("data-method"),r.attr("method"),"post").toUpperCase(),f=u.option(n.url,r.attr("action"),up.browser.url()),r.addClass("up-active"),s={url:f,type:a,data:r.serialize(),selector:c},l=function(t){var n;return f=i?"false"===i?!1:u.isString(i)?i:(n=u.locationFromXhr(t))?n:"GET"===s.type?s.url+"?"+s.data:void 0:void 0,u.option(f,!1)},u.ajax(s).always(function(){return r.removeClass("up-active")}).done(function(t,n,r){return up.flow.implant(c,t,{history:l(r),transition:p})}).fail(function(t){var n;return n=t.responseText,up.flow.implant(e,n,{transition:o})})},observe=function(fieldOrSelector,options){var $field,callback,check,clearTimer,codeOnChange,knownValue,resetTimer,startTimer,timer;return $field=$(fieldOrSelector),options=u.options(options,{frequency:500}),knownValue=null,timer=null,callback=null,(codeOnChange=$field.attr("up-observe"))?callback=function(value,$field){return eval(codeOnChange)}:options.change?callback=options.change:u.error("observe: No change callback given"),check=function(){var t,n;return n=$field.val(),t=_.isNull(knownValue),knownValue===n||(knownValue=n,t)?void 0:callback.apply($field.get(0),[n,$field])},resetTimer=function(){return timer?(clearTimer(),startTimer()):void 0},clearTimer=function(){return clearInterval(timer),timer=null},startTimer=function(){return timer=setInterval(check,options.frequency)},$field.bind("keyup click mousemove",resetTimer),check(),startTimer(),clearTimer},up.on("submit","form[up-target]",function(t,n){return t.preventDefault(),submit(n)}),up.awaken("[up-observe]",function(t){return observe(t)}),{submit:submit,observe:observe}}(),up.submit=up.form.submit,up.observe=up.form.observe}.call(this),function(){up.popup=function(){var t,n,r,e,o,i,u,a,s,c,p;return c=up.util,r={openAnimation:"fade-in",closeAnimation:"fade-out",origin:"bottom-right"},o=function(t){return c.extend(r,t)},a=function(t,n,r){var e,o;return o=c.measure(t,{full:!0}),e=function(){switch(r){case"bottom-right":return{right:o.right,top:o.top+o.height};case"bottom-left":return{left:o.left,top:o.bottom+o.height};case"top-right":return{right:o.right,bottom:o.top};case"top-left":return{left:o.left,bottom:o.top};default:return c.error("Unknown origin",r)}}(),n.attr("up-origin",r),n.css(e),i(n)},i=function(t){var n,r,e,o,i,u,a;if(r=c.measure(t,{full:!0}),e=null,o=null,r.right<0&&(e=-r.right),r.bottom<0&&(o=-r.bottom),r.left<0&&(e=r.left),r.top<0&&(o=r.top),e&&((i=parseInt(t.css("left")))?t.css("left",i-e):(u=parseInt(t.css("right")))&&t.css("right",u+e)),o){if(a=parseInt(t.css("top")))return t.css("top",a-o);if(n=parseInt(t.css("bottom")))return t.css("bottom",n+o)}},e=function(t,n,r){var e,o;return o=c.$createElementFromSelector(".up-popup"),r&&o.attr("up-sticky",""),o.attr("up-previous-url",up.browser.url()),o.attr("up-previous-title",document.title),e=c.$createElementFromSelector(n),e.appendTo(o),o.appendTo(document.body),o.hide(),o},p=function(t,n,r,e){return n.show(),a(t,n,r),up.animate(n,e)},u=function(t,o){var i,u,a,s,l,f,m,d;return i=$(t),o=c.options(o),d=c.option(i.attr("href")),f=c.option(o.target,i.attr("up-popup"),"body"),l=c.option(o.origin,i.attr("up-origin"),r.origin),a=c.option(o.animation,i.attr("up-animation"),r.openAnimation),m=c.option(o.sticky,i.is("[up-sticky]")),s=c.option(o.history,i.attr("up-history"),!1),n(),u=e(i,f,m),up.replace(f,d,{history:s,insert:function(){return p(i,u,l,a)}})},s=function(){var t;return t=$(".up-popup"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-popup"),n.length?(t=c.options(t,{animation:r.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),up.destroy(n,t)):void 0},t=function(){return $(".up-popup").is("[up-sticky]")?void 0:n()},up.on("click","a[up-popup]",function(t,r){return t.preventDefault(),r.is(".up-current")?n():u(r)}),up.on("click","body",function(t){var r;return r=$(t.target),r.closest(".up-popup").length||r.closest("[up-popup]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-popup").length?void 0:t()}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,r){return r.closest(".up-popup")?n():void 0}),up.bus.on("framework:reset",n),{open:u,close:n,source:s,defaults:o}}()}.call(this),function(){up.modal=function(){var t,n,r,e,o,i,u,a,s,c;return s=up.util,r={width:"auto",height:"auto",openAnimation:"fade-in",closeAnimation:"fade-out",closeLabel:"X",template:function(t){return'<div class="up-modal">\n <div class="up-modal-dialog">\n <div class="up-modal-close" up-close>'+t.closeLabel+'</div>\n <div class="up-modal-content"></div>\n </div>\n</div>'}},o=function(t){return s.extend(r,t)},a=function(){var t;return t=r.template,s.isFunction(t)?t(r):t},e=function(t,n,r,e){var o,i,u,c;return u=$(a()),e&&u.attr("up-sticky",""),u.attr("up-previous-url",up.browser.url()),u.attr("up-previous-title",document.title),i=u.find(".up-modal-dialog"),s.isPresent(n)&&i.css("width",n),s.isPresent(r)&&i.css("height",r),o=i.find(".up-modal-content"),c=s.$createElementFromSelector(t),c.appendTo(o),u.appendTo(document.body),u.hide(),u},c=function(t,n){return t.show(),up.animate(t,n)},i=function(t,o){var i,u,a,p,l,f,m,d,h;return i=$(t),o=s.options(o),d=s.option(i.attr("href")),f=s.option(o.target,i.attr("up-modal"),"body"),h=s.option(o.width,i.attr("up-width"),r.width),p=s.option(o.height,i.attr("up-height"),r.height),a=s.option(o.animation,i.attr("up-animation"),r.openAnimation),m=s.option(o.sticky,i.is("[up-sticky]")),l=s.option(o.history,i.attr("up-history"),!0),n(),u=e(f,h,p,m),up.replace(f,d,{history:l,insert:function(){return c(u,a)}})},u=function(){var t;return t=$(".up-modal"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-modal"),n.length?(t=s.options(t,{animation:r.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),up.destroy(n,t)):void 0},t=function(){return $(".up-modal").is("[up-sticky]")?void 0:n()},up.on("click","a[up-modal]",function(t,r){return t.preventDefault(),r.is(".up-current")?n():i(r)}),up.on("click","body",function(t){var r;return r=$(t.target),r.closest(".up-modal-dialog").length||r.closest("[up-modal]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-modal").length?void 0:(console.log("fragment inserted",n,n.closest(".up-modal")),t())}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,r){return r.closest(".up-modal")?n():void 0}),up.bus.on("framework:reset",n),{open:i,close:n,source:u,defaults:o}}()}.call(this),function(){up.tooltip=function(){var t,n,r,e,o;return o=up.util,e=function(t,n,r){var e,i,u;return i=o.measure(t),u=o.measure(n),e=function(){switch(r){case"top":return{left:i.left+.5*(i.width-u.width),top:i.top-u.height};case"bottom":return{left:i.left+.5*(i.width-u.width),top:i.top+i.height};default:return o.error("Unknown origin",r)}}(),n.attr("up-origin",r),n.css(e)},n=function(t){return o.$createElementFromSelector(".up-tooltip").html(t).appendTo(document.body)},r=function(r,i){var u,a,s,c,p;return null==i&&(i={}),u=$(r),c=o.option(i.html,u.attr("up-tooltip")),p=o.option(i.origin,u.attr("up-origin"),"top"),s=o.option(i.animation,u.attr("up-animation"),"fade-in"),t(),a=n(c),e(u,a,p),up.animate(a,s,i)},t=function(t){var n;return n=$(".up-tooltip"),n.length?(t=o.options(t,{animation:"fade-out"}),up.destroy(n,t)):void 0},up.awaken("[up-tooltip]",function(n){return n.on("mouseover",function(){return r(n)}),n.on("mouseout",function(){return t()})}),up.on("click","body",function(){return t()}),up.bus.on("framework:reset",t),up.magic.onEscape(function(){return t()}),{open:r,close:t}}()}.call(this),function(){up.navigation=function(){var t,n,r,e,o,i,u,a,s,c;return s=up.util,t="up-active",n="up-current",e="a[href], a[up-target], [up-follow], [up-modal], [up-popup]",r="."+t,u=function(t){return s.isPresent(t)?s.normalizeUrl(t,{search:!1,stripTrailingSlash:!0}):void 0},i=function(){var t,r,o;return o=u(up.browser.url()),t=u(up.modal.source()),r=u(up.popup.source()),s.each($(e),function(e){var i,a;return i=$(e),a=up.link.resolveUrl(i),a=u(a),a===o||a===t||a===r?i.addClass(n):i.removeClass(n)})},a=function(n){return c(),n=o(n),n.addClass(t)},o=function(t){return s.presence(t.parents(e))||t},c=function(){return $(r).removeClass(t)},up.on("click",e,function(t,n){return a(n)}),up.bus.on("fragment:ready",function(){return c(),i()}),up.bus.on("fragment:destroy",function(t){return t.is(".up-modal, .up-popup")?i():void 0})}()}.call(this),function(){up.marker=function(){var t,n;return n=function(t){return""!==t.html().trim()},t=function(t){return up.util.findWithSelf(t,"[up-marker]").each(function(){var t;return t=$(this),n(t)?void 0:t.hide()})},up.bus.on("fragment:ready",t)}()}.call(this),function(){up.bus.emit("framework:ready"),$(document).on("ready",function(){return up.bus.emit("app:ready")})}.call(this);
@@ -95,6 +95,12 @@ up.flow = (->
95
95
  options = u.options(options,
96
96
  historyMethod: 'push'
97
97
  )
98
+
99
+ if options.history == 'false'
100
+ options.history = null
101
+
102
+ options.source = u.option(options.source, options.history)
103
+
98
104
  # jQuery cannot construct transient elements that contain <html> or <body> tags,
99
105
  # so we're using the native browser API to grep through the HTML
100
106
  htmlElement = u.createElementFromHtml(html)
@@ -115,26 +121,26 @@ up.flow = (->
115
121
  u.error("Could not find selector (#{step.selector}) in response (#{html})")
116
122
 
117
123
  elementsInserted = ($new, options) ->
118
- $new.each ->
119
- $element = $(this)
120
- options.insert?($element)
121
- if options.history
122
- document.title = options.title if options.title
123
- up.history[options.historyMethod](options.history)
124
- # Remember where the element came from so we can
125
- # offer reload functionality.
126
- setSource($element, u.presence(options.source) || options.history)
127
- autofocus($element)
128
- # The fragment should be readiet before the transition,
129
- # so transitions see .up-current classes
130
- up.ready($element)
124
+ options.insert?($new)
125
+ if options.history
126
+ document.title = options.title if options.title
127
+ up.history[options.historyMethod](options.history)
128
+ # Remember where the element came from so we can
129
+ # offer reload functionality.
130
+ setSource($new, options.source)
131
+ autofocus($new)
132
+ # The fragment should be readiet before animating,
133
+ # so transitions see .up-current classes
134
+ up.ready($new)
131
135
 
132
136
  swapElements = ($old, $new, pseudoClass, transition, options) ->
133
137
  transition ||= 'none'
134
138
  if pseudoClass
135
139
  insertionMethod = if pseudoClass == 'before' then 'prepend' else 'append'
136
140
  # Keep a reference to the children append/prepend because
137
- # we need to compile them further down
141
+ # we need to compile them further down. Note that since we're
142
+ # prepending/appending instead of rpelacing, `$new` will not
143
+ # actually be inserted into the DOM, only its children.
138
144
  $addedChildren = $new.children()
139
145
  # Insert contents() instead of $children since contents()
140
146
  # also includes text nodes.
@@ -25,8 +25,10 @@ up.history = (->
25
25
  @param {String} url
26
26
  @protected
27
27
  ###
28
- replace = (url) ->
29
- manipulate("replace", url) unless isCurrentUrl(url)
28
+ replace = (url, options) ->
29
+ options = u.options(options, force: false)
30
+ if options.force || !isCurrentUrl(url)
31
+ manipulate("replace", url)
30
32
 
31
33
  ###*
32
34
  @method up.history.push
@@ -47,13 +49,13 @@ up.history = (->
47
49
  if state?.fromUp
48
50
  up.visit up.browser.url(), historyMethod: 'replace'
49
51
  else
50
- console.log "null state"
52
+ console.log "strange state", state
51
53
 
52
54
  # Defeat an unnecessary popstate that some browsers trigger on pageload (Chrome?).
53
55
  # We should check in 2016 if we can remove this.
54
56
  setTimeout (->
55
57
  $(window).on "popstate", pop
56
- replace(up.browser.url())
58
+ replace(up.browser.url(), force: true)
57
59
  ), 200
58
60
 
59
61
  push: push
@@ -20,7 +20,7 @@ We need to work on this page:
20
20
  ###
21
21
  up.magic = (->
22
22
 
23
- util = up.util
23
+ u = up.util
24
24
 
25
25
  DESTROYABLE_CLASS = 'up-destroyable'
26
26
  DESTROYER_KEY = 'up-destroyer'
@@ -57,6 +57,10 @@ up.magic = (->
57
57
  @method up.awaken
58
58
  @param {String} selector
59
59
  The selector to match.
60
+ @param {Boolean} [options.batch=false]
61
+ If set to `true` and a fragment insertion contains multiple
62
+ elements matching the selector, `awakener` is only called once
63
+ with a jQuery collection containing all matching elements.
60
64
  @param {Function($element)} awakener
61
65
  The function to call when a matching element is inserted.
62
66
  The function takes the new element as the first argument (as a jQuery object).
@@ -68,25 +72,33 @@ up.magic = (->
68
72
  awakeners = []
69
73
  defaultAwakeners = null
70
74
 
71
- awaken = (selector, awakener) ->
75
+ awaken = (selector, args...) ->
76
+ awakener = args.pop()
77
+ options = u.options(args[0], batch: false)
72
78
  awakeners.push
73
79
  selector: selector
74
80
  callback: awakener
81
+ batch: options.batch
82
+
83
+ applyAwakener = (awakener, $jqueryElement, nativeElement) ->
84
+ destroyer = awakener.callback.apply(nativeElement, [$jqueryElement])
85
+ if u.isFunction(destroyer)
86
+ $jqueryElement.addClass(DESTROYABLE_CLASS)
87
+ $jqueryElement.data(DESTROYER_KEY, destroyer)
75
88
 
76
89
  compile = ($fragment) ->
77
- # console.log("Compiling fragment", $fragment, "with", awakeners)
90
+ console.log("Compiling fragment", $fragment)
78
91
  for awakener in awakeners
79
- # console.log("running", awakener.selector, "on", $fragment)
80
- util.findWithSelf($fragment, awakener.selector).each ->
81
- $element = $(this)
82
- destroyer = awakener.callback.apply(this, [$element])
83
- # console.log("got destroyer", destroyer)
84
- if util.isFunction(destroyer)
85
- $element.addClass(DESTROYABLE_CLASS)
86
- $element.data(DESTROYER_KEY, destroyer)
92
+ # console.log("running", awakener.selector, "on", $fragment)
93
+ $matches = u.findWithSelf($fragment, awakener.selector)
94
+ if $matches.length
95
+ if awakener.batch
96
+ applyAwakener(awakener, $matches, $matches.get())
97
+ else
98
+ $matches.each -> applyAwakener(awakener, $(this), this)
87
99
 
88
100
  destroy = ($fragment) ->
89
- util.findWithSelf($fragment, ".#{DESTROYABLE_CLASS}").each ->
101
+ u.findWithSelf($fragment, ".#{DESTROYABLE_CLASS}").each ->
90
102
  $element = $(this)
91
103
  destroyer = $element.data(DESTROYER_KEY)
92
104
  destroyer()
@@ -99,8 +111,8 @@ up.magic = (->
99
111
  @method up.magic.snapshot
100
112
  ###
101
113
  snapshot = ->
102
- defaultLiveDescriptions = util.copy(liveDescriptions)
103
- defaultAwakeners = util.copy(awakeners)
114
+ defaultLiveDescriptions = u.copy(liveDescriptions)
115
+ defaultAwakeners = u.copy(awakeners)
104
116
 
105
117
  ###*
106
118
  Resets the list of registered event listeners to the
@@ -111,10 +123,10 @@ up.magic = (->
111
123
  ###
112
124
  reset = ->
113
125
  for description in liveDescriptions
114
- unless util.contains(defaultLiveDescriptions, description)
126
+ unless u.contains(defaultLiveDescriptions, description)
115
127
  $(document).off(description...)
116
- liveDescriptions = util.copy(defaultLiveDescriptions)
117
- awakeners = util.copy(defaultAwakeners)
128
+ liveDescriptions = u.copy(defaultLiveDescriptions)
129
+ awakeners = u.copy(defaultAwakeners)
118
130
 
119
131
  ###*
120
132
  Sends a notification that the given element has been inserted
@@ -135,7 +147,7 @@ up.magic = (->
135
147
 
136
148
  onEscape = (handler) ->
137
149
  live('keydown', 'body', (event) ->
138
- if util.escapePressed(event)
150
+ if u.escapePressed(event)
139
151
  handler(event)
140
152
  )
141
153
 
@@ -171,12 +171,14 @@ up.modal = (->
171
171
  # (but not on a modal opener).
172
172
  up.on('click', 'body', (event, $body) ->
173
173
  $target = $(event.target)
174
- unless $target.closest('.up-dialog').length || $target.closest('[up-modal]').length
174
+ unless $target.closest('.up-modal-dialog').length || $target.closest('[up-modal]').length
175
175
  close()
176
176
  )
177
177
 
178
178
  up.bus.on('fragment:ready', ($fragment) ->
179
179
  unless $fragment.closest('.up-modal').length
180
+ console.log('fragment inserted', $fragment, $fragment.closest('.up-modal'))
181
+ # alert("autoclosing due to inserted fragment")
180
182
  autoclose()
181
183
  )
182
184
 
@@ -23,7 +23,7 @@ up.motion = (->
23
23
 
24
24
  u = up.util
25
25
 
26
- defaultOptions =
26
+ config =
27
27
  duration: 300
28
28
  delay: 0
29
29
  easing: 'ease'
@@ -33,6 +33,15 @@ up.motion = (->
33
33
  transitions = {}
34
34
  defaultTransitions = {}
35
35
 
36
+ ###*
37
+ @method up.modal.defaults
38
+ @param {Number} options.duration
39
+ @param {Number} options.delay
40
+ @param {String} options.easing
41
+ ###
42
+ defaults = (options) ->
43
+ u.extend(config, options)
44
+
36
45
  ###*
37
46
  Animates an element.
38
47
 
@@ -61,7 +70,7 @@ up.motion = (->
61
70
  ###
62
71
  animate = (elementOrSelector, animation, options) ->
63
72
  $element = $(elementOrSelector)
64
- options = u.options(options, defaultOptions)
73
+ options = u.options(options, config)
65
74
  if u.isFunction(animation)
66
75
  assertIsPromise(
67
76
  animation($element, options),
@@ -108,8 +117,8 @@ up.motion = (->
108
117
  The following transitions are pre-registered:
109
118
 
110
119
  - `cross-fade`
111
- - `move-top`
112
- - `move-bottom`
120
+ - `move-up`
121
+ - `move-down`
113
122
  - `move-left`
114
123
  - `move-right`
115
124
  - `none`
@@ -131,7 +140,7 @@ up.motion = (->
131
140
  A promise for the transition's end.
132
141
  ###
133
142
  morph = (source, target, transitionOrName, options) ->
134
- options = u.options(defaultOptions)
143
+ options = u.options(config)
135
144
  $old = $(source)
136
145
  $new = $(target)
137
146
  transition = u.presence(transitionOrName, u.isFunction) || transitions[transitionOrName]
@@ -209,43 +218,59 @@ up.motion = (->
209
218
  )
210
219
 
211
220
  animation('move-to-top', ($ghost, options) ->
212
- $ghost.css('margin-top': '0%')
213
- animate($ghost, { 'margin-top': '-100%' }, options)
221
+ box = u.measure($ghost)
222
+ travelDistance = box.top + box.height
223
+ $ghost.css('margin-top': '0px')
224
+ animate($ghost, { 'margin-top': "-#{travelDistance}px" }, options)
214
225
  )
215
226
 
216
227
  animation('move-from-top', ($ghost, options) ->
217
- $ghost.css('margin-top': '-100%')
218
- animate($ghost, { 'margin-top': '0%' }, options)
228
+ box = u.measure($ghost)
229
+ travelDistance = box.top + box.height
230
+ $ghost.css('margin-top': "-#{travelDistance}px")
231
+ animate($ghost, { 'margin-top': '0px' }, options)
219
232
  )
220
233
 
221
234
  animation('move-to-bottom', ($ghost, options) ->
222
- $ghost.css('margin-top': '0%')
223
- animate($ghost, { 'margin-top': '100%' }, options)
235
+ box = u.measure($ghost)
236
+ travelDistance = u.clientSize().height - box.top
237
+ $ghost.css('margin-top': '0px')
238
+ animate($ghost, { 'margin-top': "#{travelDistance}px" }, options)
224
239
  )
225
240
 
226
241
  animation('move-from-bottom', ($ghost, options) ->
227
- $ghost.css('margin-top': '100%')
228
- animate($ghost, { 'margin-top': '0%' }, options)
242
+ box = u.measure($ghost)
243
+ travelDistance = u.clientSize().height - box.top
244
+ $ghost.css('margin-top': "#{travelDistance}px")
245
+ animate($ghost, { 'margin-top': '0px' }, options)
229
246
  )
230
247
 
231
248
  animation('move-to-left', ($ghost, options) ->
232
- $ghost.css('margin-left': '0%')
233
- animate($ghost, { 'margin-left': '-100%' }, options)
249
+ box = u.measure($ghost)
250
+ travelDistance = box.left + box.width
251
+ $ghost.css('margin-left': '0px')
252
+ animate($ghost, { 'margin-left': "-#{travelDistance}px" }, options)
234
253
  )
235
254
 
236
255
  animation('move-from-left', ($ghost, options) ->
237
- $ghost.css('margin-left': '-100%')
238
- animate($ghost, { 'margin-left': '0%' }, options)
256
+ box = u.measure($ghost)
257
+ travelDistance = box.left + box.width
258
+ $ghost.css('margin-left': "-#{travelDistance}px")
259
+ animate($ghost, { 'margin-left': '0px' }, options)
239
260
  )
240
261
 
241
262
  animation('move-to-right', ($ghost, options) ->
242
- $ghost.css('margin-left': '0%')
243
- animate($ghost, { 'margin-left': '100%' }, options)
263
+ box = u.measure($ghost)
264
+ travelDistance = u.clientSize().width - box.left
265
+ $ghost.css('margin-left': '0px')
266
+ animate($ghost, { 'margin-left': "#{travelDistance}px" }, options)
244
267
  )
245
268
 
246
269
  animation('move-from-right', ($ghost, options) ->
247
- $ghost.css('margin-left': '100%')
248
- animate($ghost, { 'margin-left': '0%' }, options)
270
+ box = u.measure($ghost)
271
+ travelDistance = u.clientSize().width - box.left
272
+ $ghost.css('margin-left': "#{travelDistance}px")
273
+ animate($ghost, { 'margin-left': '0px' }, options)
249
274
  )
250
275
 
251
276
  animation('roll-down', ($ghost, options) ->
@@ -293,7 +318,7 @@ up.motion = (->
293
318
  animate($new, 'fade-in', options)
294
319
  )
295
320
  )
296
-
321
+
297
322
  up.bus.on 'framework:ready', snapshot
298
323
  up.bus.on 'framework:reset', reset
299
324
 
@@ -301,6 +326,7 @@ up.motion = (->
301
326
  animate: animate
302
327
  transition: transition
303
328
  animation: animation
329
+ defaults: defaults
304
330
  none: none
305
331
 
306
332
  )()
@@ -136,8 +136,8 @@ up.util = (->
136
136
  !isMissing(object)
137
137
 
138
138
  isBlank = (object) ->
139
- isMissing(object) || # null or undefined
140
- # (isString(object) && object == "") || # String
139
+ isMissing(object) || # null or undefined
140
+ (isObject(object) && Object.keys(object).length == 0) ||
141
141
  (object.length == 0) # String, Array, jQuery
142
142
 
143
143
  presence = (object, checker = isPresent) ->
@@ -254,11 +254,7 @@ up.util = (->
254
254
  height: element.clientHeight
255
255
 
256
256
  temporaryCss = ($element, css, block) ->
257
-
258
257
  oldCss = $element.css(Object.keys(css))
259
- # oldCss = {}
260
- # for property of css
261
- # oldCss[property] = $element.css(property)
262
258
  $element.css(css)
263
259
  memo = -> $element.css(oldCss)
264
260
  if block
@@ -266,7 +262,19 @@ up.util = (->
266
262
  memo()
267
263
  else
268
264
  memo
269
-
265
+
266
+ forceCompositing = ($element) ->
267
+ oldTransforms = $element.css(['transform', '-webkit-transform'])
268
+ if isBlank(oldTransforms)
269
+ memo = -> $element.css(oldTransforms)
270
+ $element.css
271
+ 'transform': 'translateZ(0)'
272
+ '-webkit-transform': 'translateZ(0)' # Safari
273
+ else
274
+ memo = ->
275
+ memo
276
+
277
+
270
278
  ###*
271
279
  Animates the given element's CSS properties using CSS transitions.
272
280
 
@@ -300,8 +308,10 @@ up.util = (->
300
308
  'transition-duration': "#{opts.duration}ms"
301
309
  'transition-delay': "#{opts.delay}ms"
302
310
  'transition-timing-function': opts.easing
311
+ withoutCompositing = forceCompositing($element)
303
312
  withoutTransition = temporaryCss($element, transition)
304
313
  $element.css(lastFrame)
314
+ deferred.then(withoutCompositing)
305
315
  deferred.then(withoutTransition)
306
316
  setTimeout((-> deferred.resolve()), opts.duration + opts.delay)
307
317
  deferred.promise()
@@ -315,8 +325,14 @@ up.util = (->
315
325
  box =
316
326
  left: coordinates.left
317
327
  top: coordinates.top
318
- width: $element.outerWidth()
319
- height: $element.outerHeight()
328
+
329
+ if options?.inner
330
+ box.width = $element.width()
331
+ box.height = $element.height()
332
+ else
333
+ box.width = $element.outerWidth()
334
+ box.height = $element.outerHeight()
335
+
320
336
  if options?.full
321
337
  viewport = clientSize()
322
338
  box.right = viewport.width - (box.left + box.width)
@@ -329,17 +345,18 @@ up.util = (->
329
345
  $target.attr(attr.name, attr.value)
330
346
 
331
347
  prependGhost = ($element) ->
332
- dimensions = measure($element)
348
+ dimensions = measure($element, relative: true, inner: true)
333
349
  $ghost = $element.clone()
334
350
  $ghost.find('script').remove()
335
351
  $ghost.css
336
352
  right: ''
337
353
  bottom: ''
338
- margin: 0
354
+ # margin: 0
339
355
  position: 'absolute'
340
356
  $ghost.css(dimensions)
341
357
  $ghost.addClass('up-ghost')
342
- $ghost.prependTo(document.body)
358
+ $ghost.insertBefore($element)
359
+ # $ghost.prependTo(document.body)
343
360
 
344
361
  findWithSelf = ($element, selector) ->
345
362
  $element.find(selector).addBack(selector)
@@ -413,6 +430,7 @@ up.util = (->
413
430
  measure: measure
414
431
  temporaryCss: temporaryCss
415
432
  cssAnimate: cssAnimate
433
+ forceCompositing: forceCompositing
416
434
  prependGhost: prependGhost
417
435
  escapePressed: escapePressed
418
436
  copyAttributes: copyAttributes
@@ -422,6 +440,7 @@ up.util = (->
422
440
  castsToTrue: castsToTrue
423
441
  castsToFalse: castsToFalse
424
442
  locationFromXhr: locationFromXhr
443
+ clientSize: clientSize
425
444
  # memoArray: memoArray
426
445
  # replaceInPlace: replaceInPlace
427
446
 
@@ -1,5 +1,5 @@
1
1
  module Upjs
2
2
  module Rails
3
- VERSION = "0.2.2"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- upjs-rails (0.2.1)
4
+ upjs-rails (0.3.0)
5
5
  rails (>= 3)
6
6
 
7
7
  GEM
@@ -27,3 +27,10 @@ describe 'up.util', ->
27
27
 
28
28
  it 'returns false for an array with at least one element', ->
29
29
  expect(up.util.isBlank(['element'])).toBe(false)
30
+
31
+ it 'returns true for an empty object', ->
32
+ expect(up.util.isBlank({})).toBe(true)
33
+
34
+ it 'returns true for an object with at least one key', ->
35
+ expect(up.util.isBlank({key: 'value'})).toBe(false)
36
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upjs-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-22 00:00:00.000000000 Z
11
+ date: 2015-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails