upjs-rails 0.11.1 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/dist/up-bootstrap.js +9 -17
  4. data/dist/up-bootstrap.min.js +1 -1
  5. data/dist/up.js +384 -458
  6. data/dist/up.min.js +2 -2
  7. data/lib/assets/javascripts/up/boot.js.coffee +2 -2
  8. data/lib/assets/javascripts/up/browser.js.coffee +2 -2
  9. data/lib/assets/javascripts/up/bus.js.coffee +39 -88
  10. data/lib/assets/javascripts/up/flow.js.coffee +25 -33
  11. data/lib/assets/javascripts/up/form.js.coffee +2 -2
  12. data/lib/assets/javascripts/up/history.js.coffee +8 -7
  13. data/lib/assets/javascripts/up/layout.js.coffee +19 -18
  14. data/lib/assets/javascripts/up/link.js.coffee +2 -2
  15. data/lib/assets/javascripts/up/magic.js.coffee +41 -27
  16. data/lib/assets/javascripts/up/modal.js.coffee +74 -57
  17. data/lib/assets/javascripts/up/motion.js.coffee +11 -10
  18. data/lib/assets/javascripts/up/navigation.js.coffee +11 -10
  19. data/lib/assets/javascripts/up/popup.js.coffee +19 -16
  20. data/lib/assets/javascripts/up/proxy.js.coffee +17 -16
  21. data/lib/assets/javascripts/up/tooltip.js.coffee +28 -14
  22. data/lib/assets/javascripts/up/util.js.coffee +14 -22
  23. data/lib/assets/javascripts/up-bootstrap/layout-ext.js.coffee +5 -6
  24. data/lib/assets/javascripts/up-bootstrap/modal-ext.js.coffee +8 -8
  25. data/lib/assets/javascripts/up-bootstrap/navigation-ext.js.coffee +2 -5
  26. data/lib/assets/javascripts/up.js.coffee +0 -1
  27. data/lib/upjs/rails/version.rb +1 -1
  28. data/spec_app/Gemfile.lock +1 -1
  29. data/spec_app/spec/javascripts/up/bus_spec.js.coffee +43 -6
  30. data/spec_app/spec/javascripts/up/flow_spec.js.coffee +1 -1
  31. data/spec_app/spec/javascripts/up/history_spec.js.coffee +3 -3
  32. data/spec_app/spec/javascripts/up/layout_spec.js.coffee +9 -11
  33. data/spec_app/spec/javascripts/up/link_spec.js.coffee +7 -9
  34. data/spec_app/spec/javascripts/up/magic_spec.js.coffee +5 -5
  35. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +8 -10
  36. data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +13 -13
  37. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +1 -5
  38. data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +51 -52
  39. data/spec_app/spec/javascripts/up/tooltip_spec.js.coffee +19 -5
  40. data/spec_app/spec/javascripts/up/util_spec.js.coffee +14 -23
  41. metadata +1 -3
  42. data/lib/assets/javascripts/up/slot.js.coffee +0 -63
  43. data/spec_app/spec/javascripts/up/slot_spec.js.coffee +0 -16
data/dist/up.js CHANGED
@@ -24,8 +24,8 @@ If you use them in your own code, you will get hurt.
24
24
  (function() {
25
25
  var slice = [].slice;
26
26
 
27
- up.util = (function() {
28
- var $createElementFromSelector, ANIMATION_PROMISE_KEY, CONSOLE_PLACEHOLDERS, ajax, any, cache, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, debug, detect, each, emptyJQuery, endsWith, error, escapePressed, evalConsoleTemplate, extend, findWithSelf, finishCssAnimate, fixedToAbsolute, forceCompositing, identity, ifGiven, 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, normalizeMethod, normalizeUrl, nullJquery, offsetParent, once, only, option, options, presence, presentAttr, remove, resolvableWhen, resolvedDeferred, resolvedPromise, scrollbarWidth, select, setMissingAttrs, startsWith, temporaryCss, times, toArray, trim, unJquery, uniq, unwrapElement, warn;
27
+ up.util = (function($) {
28
+ var $createElementFromSelector, ANIMATION_PROMISE_KEY, CONSOLE_PLACEHOLDERS, ajax, any, argNames, cache, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, debug, detect, each, emptyJQuery, endsWith, error, escapePressed, evalConsoleTemplate, extend, findWithSelf, finishCssAnimate, fixedToAbsolute, forceCompositing, identity, ifGiven, 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, normalizeMethod, normalizeUrl, nullJquery, offsetParent, once, only, option, options, presence, presentAttr, remove, resolvableWhen, resolvedDeferred, resolvedPromise, scrollbarWidth, select, setMissingAttrs, startsWith, temporaryCss, times, toArray, trim, unJquery, uniq, unwrapElement, warn;
29
29
  memoize = function(func) {
30
30
  var cache, cached;
31
31
  cache = void 0;
@@ -1054,47 +1054,16 @@ If you use them in your own code, you will get hurt.
1054
1054
  };
1055
1055
  };
1056
1056
  config = function(factoryOptions) {
1057
- var apiKeys, hash;
1057
+ var hash;
1058
1058
  if (factoryOptions == null) {
1059
1059
  factoryOptions = {};
1060
1060
  }
1061
- hash = {
1062
- ensureKeyExists: function(key) {
1063
- return factoryOptions.hasOwnProperty(key) || error("Unknown setting %o", key);
1064
- },
1065
- reset: function() {
1066
- var j, key, len, ownKeys;
1067
- ownKeys = copy(Object.getOwnPropertyNames(hash));
1068
- for (j = 0, len = ownKeys.length; j < len; j++) {
1069
- key = ownKeys[j];
1070
- if (!contains(apiKeys, key)) {
1071
- delete hash[key];
1072
- }
1073
- }
1074
- return hash.update(copy(factoryOptions));
1075
- },
1076
- update: function(options) {
1077
- var key, results, value;
1078
- if (options) {
1079
- if (isString(options)) {
1080
- hash.ensureKeyExists(options);
1081
- return hash[options];
1082
- } else {
1083
- results = [];
1084
- for (key in options) {
1085
- value = options[key];
1086
- hash.ensureKeyExists(key);
1087
- results.push(hash[key] = value);
1088
- }
1089
- return results;
1090
- }
1091
- } else {
1092
- return hash;
1093
- }
1094
- }
1061
+ hash = {};
1062
+ hash.reset = function() {
1063
+ return extend(hash, factoryOptions);
1095
1064
  };
1096
- apiKeys = Object.getOwnPropertyNames(hash);
1097
1065
  hash.reset();
1066
+ Object.preventExtensions(hash);
1098
1067
  return hash;
1099
1068
  };
1100
1069
  unwrapElement = function(wrapper) {
@@ -1133,7 +1102,18 @@ If you use them in your own code, you will get hurt.
1133
1102
  bottom: ''
1134
1103
  });
1135
1104
  };
1105
+ argNames = function(fun) {
1106
+ var code, match, pattern;
1107
+ code = fun.toString();
1108
+ pattern = new RegExp('\\(([^\\)]*)\\)');
1109
+ if (match = code.match(pattern)) {
1110
+ return match[1].split(/\s*,\s*/);
1111
+ } else {
1112
+ return error('Could not parse argument names of %o', fun);
1113
+ }
1114
+ };
1136
1115
  return {
1116
+ argNames: argNames,
1137
1117
  offsetParent: offsetParent,
1138
1118
  fixedToAbsolute: fixedToAbsolute,
1139
1119
  presentAttr: presentAttr,
@@ -1217,7 +1197,7 @@ If you use them in your own code, you will get hurt.
1217
1197
  emptyJQuery: emptyJQuery,
1218
1198
  evalConsoleTemplate: evalConsoleTemplate
1219
1199
  };
1220
- })();
1200
+ })($);
1221
1201
 
1222
1202
  up.error = up.util.error;
1223
1203
 
@@ -1241,7 +1221,7 @@ we can't currently get rid off.
1241
1221
  (function() {
1242
1222
  var slice = [].slice;
1243
1223
 
1244
- up.browser = (function() {
1224
+ up.browser = (function($) {
1245
1225
  var canCssAnimation, canInputEvent, canLogSubstitution, canPushState, initialRequestMethod, isIE8OrWorse, isIE9OrWorse, isRecentJQuery, isSupported, loadPage, popCookie, puts, u, url;
1246
1226
  u = up.util;
1247
1227
  loadPage = function(url, options) {
@@ -1345,7 +1325,7 @@ we can't currently get rid off.
1345
1325
  isSupported: isSupported,
1346
1326
  puts: puts
1347
1327
  };
1348
- })();
1328
+ })(jQuery);
1349
1329
 
1350
1330
  }).call(this);
1351
1331
 
@@ -1357,11 +1337,11 @@ Up.js uses an internal event bus that you can use to hook into lifecycle events
1357
1337
 
1358
1338
  This internal event bus might eventually be rolled into regular events that we trigger on `document`.
1359
1339
 
1360
- \#\#\# `fragment:ready` event
1340
+ \#\#\# `fragment:inserted` event
1361
1341
 
1362
1342
  This event is triggered after Up.js has inserted an HTML fragment into the DOM through mechanisms like [`[up-target]`](/up.flow#up-target) or [`up.replace`](/up.flow#up.replace):
1363
1343
 
1364
- up.bus.on('fragment:ready', function($fragment) {
1344
+ up.on('up:fragment:inserted', function($fragment) {
1365
1345
  console.log("Looks like we have a new %o!", $fragment);
1366
1346
  });
1367
1347
 
@@ -1369,12 +1349,12 @@ The event is triggered *before* Up has compiled the fragment with your [custom b
1369
1349
  Upon receiving the event, Up.js will start compilation.
1370
1350
 
1371
1351
 
1372
- \#\#\# `fragment:destroy` event
1352
+ \#\#\# `fragment:destroyed` event
1373
1353
 
1374
1354
  This event is triggered when Up.js is destroying an HTML fragment, e.g. because it's being replaced
1375
1355
  with a new version or because someone explicitly called [`up.destroy`](/up.flow#up.destroy):
1376
1356
 
1377
- up.bus.on('fragment:destroy', function($fragment) {
1357
+ up.on('up:fragment:destroyed', function($fragment) {
1378
1358
  console.log("Looks like we lost %o!", $fragment);
1379
1359
  });
1380
1360
 
@@ -1397,127 +1377,66 @@ We need to work on this page:
1397
1377
  (function() {
1398
1378
  var slice = [].slice;
1399
1379
 
1400
- up.bus = (function() {
1401
- var callbacksByEvent, callbacksFor, defaultCallbacksByEvent, emit, listen, reset, snapshot, stopListen, u;
1380
+ up.bus = (function($) {
1381
+ var emit, nobodyPrevents, reset, u;
1402
1382
  u = up.util;
1403
- callbacksByEvent = {};
1404
- defaultCallbacksByEvent = {};
1405
1383
 
1406
1384
  /**
1407
- Resets the list of registered event listeners to the
1408
- moment when the framework was booted.
1409
-
1410
- @private
1411
- @method up.bus.reset
1412
- */
1413
- reset = function() {
1414
- return callbacksByEvent = u.copy(defaultCallbacksByEvent);
1415
- };
1416
- callbacksFor = function(event) {
1417
- return callbacksByEvent[event] || (callbacksByEvent[event] = []);
1418
- };
1419
-
1420
- /**
1421
- Makes a snapshot of the currently registered bus listeners,
1422
- to later be restored through [`up.bus.reset`](/up.bus#up.bus.reset)
1423
-
1424
- @private
1425
- @method up.bus.snapshot
1426
- */
1427
- snapshot = function() {
1428
- var callbacks, event, results;
1429
- defaultCallbacksByEvent = {};
1430
- results = [];
1431
- for (event in callbacksByEvent) {
1432
- callbacks = callbacksByEvent[event];
1433
- results.push(defaultCallbacksByEvent[event] = u.copy(callbacks));
1434
- }
1435
- return results;
1436
- };
1437
-
1438
- /**
1439
- Registers an event handler to be called when the given
1440
- event is triggered.
1441
-
1442
- @method up.bus.on
1443
- @param {String} eventNames
1444
- A space-separated list of event names to match.
1445
- @param {Function} handler
1446
- The event handler to be called with the event arguments.
1447
- @return {Function}
1448
- A function that unregisters the given handlers
1385
+ @method up.bus.emit
1386
+ @param {String} eventName
1387
+ The name of the event.
1388
+ @param args...
1389
+ The arguments that describe the event.
1390
+ @protected
1449
1391
  */
1450
- listen = function(eventNames, handler) {
1451
- var eventName, i, len, ref;
1452
- ref = eventNames.split(' ');
1453
- for (i = 0, len = ref.length; i < len; i++) {
1454
- eventName = ref[i];
1455
- callbacksFor(eventName).push(handler);
1392
+ emit = function(eventName, eventProps) {
1393
+ var $target, event;
1394
+ if (eventProps == null) {
1395
+ eventProps = {};
1456
1396
  }
1457
- return function() {
1458
- return stopListen(eventNames, handler);
1459
- };
1397
+ event = $.Event(eventName, eventProps);
1398
+ $target = eventProps.$element || $(document);
1399
+ u.debug("Emitting %o on %o with props %o", eventName, $target, eventProps);
1400
+ $target.trigger(event);
1401
+ return event;
1460
1402
  };
1461
1403
 
1462
1404
  /**
1463
- Unregisters the given handler from the given events.
1405
+ Emits an event with the given name and property.
1406
+ Returns whether any event listener has prevented the default action.
1464
1407
 
1465
- @method up.bus.off
1466
- @param {String} eventNames
1467
- A space-separated list of event names .
1468
- @param {Function} handler
1469
- The event handler that should stop listening.
1408
+ @method nobodyPrevents
1409
+ @protected
1470
1410
  */
1471
- stopListen = function(eventNames, handler) {
1472
- var eventName, i, len, ref, results;
1473
- ref = eventNames.split(' ');
1474
- results = [];
1475
- for (i = 0, len = ref.length; i < len; i++) {
1476
- eventName = ref[i];
1477
- results.push(u.remove(callbacksFor(eventName), handler));
1478
- }
1479
- return results;
1411
+ nobodyPrevents = function() {
1412
+ var args, event;
1413
+ args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
1414
+ event = emit.apply(null, args);
1415
+ return !event.isDefaultPrevented();
1480
1416
  };
1481
1417
 
1482
1418
  /**
1483
- Triggers an event over the framework bus.
1484
-
1485
- All arguments will be passed as arguments to event listeners:
1486
-
1487
- up.bus.on('foo:bar', function(x, y) {
1488
- console.log("Value of x is " + x);
1489
- console.log("Value of y is " + y);
1490
- });
1491
-
1492
- up.bus.emit('foo:bar', 'arg1', 'arg2')
1419
+ Resets Up.js to the state when it was booted.
1420
+ All custom event handlers, animations, etc. that have been registered
1421
+ will be discarded.
1493
1422
 
1494
- // This prints to the console:
1495
- //
1496
- // Value of x is arg1
1497
- // Value of y is arg2
1423
+ This is an internal method for to enable unit testing.
1424
+ Don't use this in production.
1498
1425
 
1499
- @method up.bus.emit
1500
- @param {String} eventName
1501
- The name of the event.
1502
- @param args...
1503
- The arguments that describe the event.
1426
+ @protected
1427
+ @method up.reset
1504
1428
  */
1505
- emit = function() {
1506
- var args, callbacks, eventName;
1507
- eventName = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
1508
- callbacks = callbacksFor(eventName);
1509
- return u.each(callbacks, function(callback) {
1510
- return callback.apply(null, args);
1511
- });
1429
+ reset = function() {
1430
+ return up.bus.emit('up:framework:reset');
1512
1431
  };
1513
- listen('framework:ready', snapshot);
1514
- listen('framework:reset', reset);
1515
1432
  return {
1516
- on: listen,
1517
- off: stopListen,
1518
- emit: emit
1433
+ emit: emit,
1434
+ nobodyPrevents: nobodyPrevents,
1435
+ reset: reset
1519
1436
  };
1520
- })();
1437
+ })(jQuery);
1438
+
1439
+ up.reset = up.bus.reset;
1521
1440
 
1522
1441
  }).call(this);
1523
1442
 
@@ -1541,8 +1460,8 @@ We need to work on this page:
1541
1460
  (function() {
1542
1461
  var slice = [].slice;
1543
1462
 
1544
- up.magic = (function() {
1545
- var DESTROYABLE_CLASS, DESTROYER_KEY, applyCompiler, compile, compiler, compilers, data, defaultCompilers, defaultLiveDescriptions, destroy, live, liveDescriptions, onEscape, ready, reset, snapshot, u;
1463
+ up.magic = (function($) {
1464
+ var DESTROYABLE_CLASS, DESTROYER_KEY, applyCompiler, compile, compiler, compilers, data, defaultCompilers, defaultLiveDescriptions, destroy, hello, live, liveDescriptions, onEscape, reset, snapshot, u, upListenerToJqueryListener;
1546
1465
  u = up.util;
1547
1466
  DESTROYABLE_CLASS = 'up-destroyable';
1548
1467
  DESTROYER_KEY = 'up-destroyer';
@@ -1595,8 +1514,10 @@ We need to work on this page:
1595
1514
  @method up.on
1596
1515
  @param {String} events
1597
1516
  A space-separated list of event names to bind.
1598
- @param {String} selector
1599
- The selector an on which the event must be triggered.
1517
+ @param {String} [selector]
1518
+ The selector of an element on which the event must be triggered.
1519
+ Omit the selector to listen to all events with that name, regardless
1520
+ of the event target.
1600
1521
  @param {Function(event, $element, data)} behavior
1601
1522
  The handler that should be called.
1602
1523
  The function takes the affected element as the first argument (as a jQuery object).
@@ -1605,16 +1526,28 @@ We need to work on this page:
1605
1526
  */
1606
1527
  liveDescriptions = [];
1607
1528
  defaultLiveDescriptions = null;
1608
- live = function(events, selector, behavior) {
1609
- var description, ref;
1529
+
1530
+ /**
1531
+ * Convert an Up.js style listener (second argument is the event target
1532
+ * as a jQuery collection) to a vanilla jQuery listener
1533
+ */
1534
+ upListenerToJqueryListener = function(upListener) {
1535
+ return function(event) {
1536
+ var $me;
1537
+ $me = event.$element || $(this);
1538
+ return upListener.apply($me.get(0), [event, $me, data($me)]);
1539
+ };
1540
+ };
1541
+ live = function() {
1542
+ var args, behavior, description, lastIndex, ref;
1543
+ args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
1610
1544
  if (!up.browser.isSupported()) {
1611
1545
  return;
1612
1546
  }
1613
- description = [
1614
- events, selector, function(event) {
1615
- return behavior.apply(this, [event, $(this), data(this)]);
1616
- }
1617
- ];
1547
+ description = u.copy(args);
1548
+ lastIndex = description.length - 1;
1549
+ behavior = description[lastIndex];
1550
+ description[lastIndex] = upListenerToJqueryListener(behavior);
1618
1551
  liveDescriptions.push(description);
1619
1552
  return (ref = $(document)).on.apply(ref, description);
1620
1553
  };
@@ -1883,14 +1816,16 @@ We need to work on this page:
1883
1816
  other Up.js methods. You will only need to call this if you
1884
1817
  manipulate the DOM without going through Up.js.
1885
1818
 
1886
- @method up.ready
1887
- @param {String|Element|jQuery} selectorOrFragment
1819
+ @method up.hello
1820
+ @param {String|Element|jQuery} selectorOrElement
1888
1821
  */
1889
- ready = function(selectorOrFragment) {
1890
- var $fragment;
1891
- $fragment = $(selectorOrFragment);
1892
- up.bus.emit('fragment:ready', $fragment);
1893
- return $fragment;
1822
+ hello = function(selectorOrElement) {
1823
+ var $element;
1824
+ $element = $(selectorOrElement);
1825
+ up.bus.emit('up:fragment:inserted', {
1826
+ $element: $element
1827
+ });
1828
+ return $element;
1894
1829
  };
1895
1830
  onEscape = function(handler) {
1896
1831
  return live('keydown', 'body', function(event) {
@@ -1899,33 +1834,38 @@ We need to work on this page:
1899
1834
  }
1900
1835
  });
1901
1836
  };
1902
- up.bus.on('app:ready', (function() {
1903
- return ready(document.body);
1837
+ live('ready', (function() {
1838
+ return hello(document.body);
1904
1839
  }));
1905
- up.bus.on('fragment:ready', compile);
1906
- up.bus.on('fragment:destroy', destroy);
1907
- up.bus.on('framework:ready', snapshot);
1908
- up.bus.on('framework:reset', reset);
1840
+ live('up:fragment:inserted', function(event) {
1841
+ return compile(event.$element);
1842
+ });
1843
+ live('up:fragment:destroy', function(event) {
1844
+ return destroy(event.$element);
1845
+ });
1846
+ live('up:framework:boot', snapshot);
1847
+ live('up:framework:reset', reset);
1909
1848
  return {
1910
1849
  compiler: compiler,
1911
1850
  on: live,
1912
- ready: ready,
1851
+ hello: hello,
1913
1852
  onEscape: onEscape,
1914
1853
  data: data
1915
1854
  };
1916
- })();
1855
+ })(jQuery);
1917
1856
 
1918
1857
  up.compiler = up.magic.compiler;
1919
1858
 
1920
1859
  up.on = up.magic.on;
1921
1860
 
1922
- up.ready = up.magic.ready;
1861
+ up.hello = up.magic.hello;
1862
+
1863
+ up.ready = function() {
1864
+ return up.util.error('up.ready no longer exists. Please use up.hello instead.');
1865
+ };
1923
1866
 
1924
1867
  up.awaken = function() {
1925
- var args;
1926
- args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
1927
- up.util.warn("up.awaken has been renamed to up.compiler and will be removed in a future version");
1928
- return up.compiler.apply(up, args);
1868
+ return up.util.error('up.awaken no longer exists. Please use up.compiler instead.');
1929
1869
  };
1930
1870
 
1931
1871
  }).call(this);
@@ -1946,16 +1886,16 @@ We need to work on this page:
1946
1886
  */
1947
1887
 
1948
1888
  (function() {
1949
- up.history = (function() {
1889
+ up.history = (function($) {
1950
1890
  var buildState, config, currentUrl, isCurrentUrl, manipulate, nextPreviousUrl, normalizeUrl, observeNewUrl, pop, previousUrl, push, register, replace, reset, restoreStateOnPop, u;
1951
1891
  u = up.util;
1952
1892
 
1953
1893
  /**
1954
- @method up.history.defaults
1955
- @param {Array<String>} [options.popTargets=['body']]
1894
+ @method up.history.config
1895
+ @param {Array<String>} [config.popTargets=['body']]
1956
1896
  An array of CSS selectors to replace when the user goes
1957
1897
  back in history.
1958
- @param {Boolean} [options.restoreScroll=true]
1898
+ @param {Boolean} [config.restoreScroll=true]
1959
1899
  Whether to restore the known scroll positions
1960
1900
  when the user goes back or forward in history.
1961
1901
  */
@@ -2121,9 +2061,12 @@ We need to work on this page:
2121
2061
  return up.link.makeFollowable($link);
2122
2062
  }
2123
2063
  });
2124
- up.bus.on('framework:reset', reset);
2064
+ up.on('up:framework:reset', reset);
2125
2065
  return {
2126
- defaults: config.update,
2066
+ config: config,
2067
+ defaults: function() {
2068
+ return u.error('up.history.defaults(...) no longer exists. Set values on he up.history.config property instead.');
2069
+ },
2127
2070
  push: push,
2128
2071
  replace: replace,
2129
2072
  url: currentUrl,
@@ -2132,7 +2075,7 @@ We need to work on this page:
2132
2075
  },
2133
2076
  normalizeUrl: normalizeUrl
2134
2077
  };
2135
- })();
2078
+ })(jQuery);
2136
2079
 
2137
2080
  }).call(this);
2138
2081
 
@@ -2148,37 +2091,37 @@ This modules contains functions to scroll the viewport and reveal contained elem
2148
2091
  (function() {
2149
2092
  var slice = [].slice;
2150
2093
 
2151
- up.layout = (function() {
2094
+ up.layout = (function($) {
2152
2095
  var SCROLL_PROMISE_KEY, anchoredRight, config, finishScrolling, fixedChildren, lastScrollTops, measureObstruction, reset, restoreScroll, reveal, saveScroll, scroll, scrollTops, u, viewportOf, viewportSelector, viewports, viewportsWithin;
2153
2096
  u = up.util;
2154
2097
 
2155
2098
  /**
2156
2099
  Configures the application layout.
2157
2100
 
2158
- @method up.layout.defaults
2159
- @param {Array<String>} [options.viewports]
2101
+ @method up.layout.config
2102
+ @param {Array<String>} [config.viewports]
2160
2103
  An array of CSS selectors that find viewports
2161
2104
  (containers that scroll their contents).
2162
- @param {Array<String>} [options.fixedTop]
2105
+ @param {Array<String>} [config.fixedTop]
2163
2106
  An array of CSS selectors that find elements fixed to the
2164
2107
  top edge of the screen (using `position: fixed`).
2165
- @param {Array<String>} [options.fixedBottom]
2108
+ @param {Array<String>} [config.fixedBottom]
2166
2109
  An array of CSS selectors that find elements fixed to the
2167
2110
  bottom edge of the screen (using `position: fixed`).
2168
- @param {Array<String>} [options.anchoredRight]
2111
+ @param {Array<String>} [config.anchoredRight]
2169
2112
  An array of CSS selectors that find elements anchored to the
2170
2113
  right edge of the screen (using `position: fixed` or `position: absolute`).
2171
- @param {Number} [options.duration]
2114
+ @param {Number} [config.duration]
2172
2115
  The duration of the scrolling animation in milliseconds.
2173
2116
  Setting this to `0` will disable scrolling animations.
2174
- @param {String} [options.easing]
2117
+ @param {String} [config.easing]
2175
2118
  The timing function that controls the animation's acceleration.
2176
2119
  See [W3C documentation](http://www.w3.org/TR/css3-transitions/#transition-timing-function)
2177
2120
  for a list of pre-defined timing functions.
2178
- @param {Number} [options.snap]
2121
+ @param {Number} [config.snap]
2179
2122
  When [revealing](#up.reveal) elements, Up.js will scroll an viewport
2180
- to the top when the revealed element is closer to the top than `options.snap`.
2181
- @param {Number} [options.substance]
2123
+ to the top when the revealed element is closer to the top than `config.snap`.
2124
+ @param {Number} [config.substance]
2182
2125
  A number indicating how many top pixel rows of an element to [reveal](#up.reveal).
2183
2126
  */
2184
2127
  config = u.config({
@@ -2346,7 +2289,7 @@ This modules contains functions to scroll the viewport and reveal contained elem
2346
2289
  - the currently open [modal](/up.modal)
2347
2290
  - an element with the attribute `[up-viewport]`
2348
2291
  - the `<body>` element
2349
- - an element matching the selector you have configured using `up.viewport.defaults({ viewSelector: 'my-custom-selector' })`
2292
+ - an element matching the selector you have configured using `up.viewport.config.viewports.push('my-custom-selector')`
2350
2293
 
2351
2294
  \#\#\#\# Fixed elements obstruction the viewport
2352
2295
 
@@ -2356,7 +2299,7 @@ This modules contains functions to scroll the viewport and reveal contained elem
2356
2299
  To make `up.aware` of these fixed elements you can either:
2357
2300
 
2358
2301
  - give the element an attribute [`up-fixed="top"`](#up-fixed-top) or [`up-fixed="bottom"`](up-fixed-bottom)
2359
- - [configure default options](#up.layout.defaults) for `fixedTop` or `fixedBottom`
2302
+ - [configure default options](#up.layout.config) for `fixedTop` or `fixedBottom`
2360
2303
 
2361
2304
  @method up.reveal
2362
2305
  @param {String|Element|jQuery} element
@@ -2518,7 +2461,7 @@ This modules contains functions to scroll the viewport and reveal contained elem
2518
2461
 
2519
2462
  /**
2520
2463
  Saves the top scroll positions of all the
2521
- viewports configured in `up.layout.defaults('viewports').
2464
+ viewports configured in [`up.layout.config.viewports`](#up.layout.config).
2522
2465
  The saved scroll positions can be restored by calling
2523
2466
  [`up.layout.restoreScroll()`](#up.layout.restoreScroll).
2524
2467
 
@@ -2539,7 +2482,7 @@ This modules contains functions to scroll the viewport and reveal contained elem
2539
2482
 
2540
2483
  /**
2541
2484
  Restores the top scroll positions of all the
2542
- viewports configured in `up.layout.defaults('viewports')`.
2485
+ viewports configured in [`up.layout.config.viewports`](#up.layout.config).
2543
2486
 
2544
2487
  @method up.layout.restoreScroll
2545
2488
  @param {jQuery} [options.around]
@@ -2652,12 +2595,15 @@ This modules contains functions to scroll the viewport and reveal contained elem
2652
2595
  @method [up-fixed=bottom]
2653
2596
  @ujs
2654
2597
  */
2655
- up.bus.on('framework:reset', reset);
2598
+ up.on('up:framework:reset', reset);
2656
2599
  return {
2657
2600
  reveal: reveal,
2658
2601
  scroll: scroll,
2659
2602
  finishScrolling: finishScrolling,
2660
- defaults: config.update,
2603
+ config: config,
2604
+ defaults: function() {
2605
+ return u.error('up.layout.defaults(...) no longer exists. Set values on he up.layout.config property instead.');
2606
+ },
2661
2607
  viewportOf: viewportOf,
2662
2608
  viewportsWithin: viewportsWithin,
2663
2609
  viewports: viewports,
@@ -2667,7 +2613,7 @@ This modules contains functions to scroll the viewport and reveal contained elem
2667
2613
  anchoredRight: anchoredRight,
2668
2614
  fixedChildren: fixedChildren
2669
2615
  };
2670
- })();
2616
+ })(jQuery);
2671
2617
 
2672
2618
  up.scroll = up.layout.scroll;
2673
2619
 
@@ -2694,8 +2640,8 @@ We need to work on this page:
2694
2640
  */
2695
2641
 
2696
2642
  (function() {
2697
- up.flow = (function() {
2698
- var autofocus, destroy, elementsInserted, findOldFragment, first, fragmentNotFound, implant, isRealElement, parseImplantSteps, parseResponse, reload, replace, reset, reveal, setSource, source, swapElements, u;
2643
+ up.flow = (function($) {
2644
+ var autofocus, destroy, elementsInserted, findOldFragment, first, fragmentNotFound, implant, isRealElement, parseImplantSteps, parseResponse, reload, replace, reveal, setSource, source, swapElements, u;
2699
2645
  u = up.util;
2700
2646
  setSource = function(element, sourceUrl) {
2701
2647
  var $element;
@@ -2885,7 +2831,7 @@ We need to work on this page:
2885
2831
  });
2886
2832
  }
2887
2833
  autofocus($new);
2888
- return up.ready($new);
2834
+ return up.hello($new);
2889
2835
  };
2890
2836
  swapElements = function($old, $new, pseudoClass, transition, options) {
2891
2837
  var $wrapper, insertionMethod;
@@ -2999,23 +2945,31 @@ We need to work on this page:
2999
2945
  destroy = function(selectorOrElement, options) {
3000
2946
  var $element, animateOptions, animationDeferred;
3001
2947
  $element = $(selectorOrElement);
3002
- options = u.options(options, {
3003
- animation: 'none'
3004
- });
3005
- animateOptions = up.motion.animateOptions(options);
3006
- $element.addClass('up-destroying');
3007
- if (u.isPresent(options.url)) {
3008
- up.history.push(options.url);
3009
- }
3010
- if (u.isPresent(options.title)) {
3011
- document.title = options.title;
3012
- }
3013
- up.bus.emit('fragment:destroy', $element);
3014
- animationDeferred = u.presence(options.animation, u.isDeferred) || up.motion.animate($element, options.animation, animateOptions);
3015
- animationDeferred.then(function() {
3016
- return $element.remove();
3017
- });
3018
- return animationDeferred;
2948
+ if (up.bus.nobodyPrevents('up:fragment:destroy', {
2949
+ $element: $element
2950
+ })) {
2951
+ options = u.options(options, {
2952
+ animation: 'none'
2953
+ });
2954
+ animateOptions = up.motion.animateOptions(options);
2955
+ $element.addClass('up-destroying');
2956
+ if (u.isPresent(options.url)) {
2957
+ up.history.push(options.url);
2958
+ }
2959
+ if (u.isPresent(options.title)) {
2960
+ document.title = options.title;
2961
+ }
2962
+ animationDeferred = u.presence(options.animation, u.isDeferred) || up.motion.animate($element, options.animation, animateOptions);
2963
+ animationDeferred.then(function() {
2964
+ up.bus.emit('up:fragment:destroyed', {
2965
+ $element: $element
2966
+ });
2967
+ return $element.remove();
2968
+ });
2969
+ return animationDeferred;
2970
+ } else {
2971
+ return $.Deferred();
2972
+ }
3019
2973
  };
3020
2974
 
3021
2975
  /**
@@ -3038,22 +2992,7 @@ We need to work on this page:
3038
2992
  sourceUrl = options.url || source(selectorOrElement);
3039
2993
  return replace(selectorOrElement, sourceUrl, options);
3040
2994
  };
3041
-
3042
- /**
3043
- Resets Up.js to the state when it was booted.
3044
- All custom event handlers, animations, etc. that have been registered
3045
- will be discarded.
3046
-
3047
- This is an internal method for to enable unit testing.
3048
- Don't use this in production.
3049
-
3050
- @protected
3051
- @method up.reset
3052
- */
3053
- reset = function() {
3054
- return up.bus.emit('framework:reset');
3055
- };
3056
- up.bus.on('app:ready', function() {
2995
+ up.on('ready', function() {
3057
2996
  return setSource(document.body, up.browser.url());
3058
2997
  });
3059
2998
  return {
@@ -3061,10 +3000,9 @@ We need to work on this page:
3061
3000
  reload: reload,
3062
3001
  destroy: destroy,
3063
3002
  implant: implant,
3064
- reset: reset,
3065
3003
  first: first
3066
3004
  };
3067
- })();
3005
+ })(jQuery);
3068
3006
 
3069
3007
  up.replace = up.flow.replace;
3070
3008
 
@@ -3072,8 +3010,6 @@ We need to work on this page:
3072
3010
 
3073
3011
  up.destroy = up.flow.destroy;
3074
3012
 
3075
- up.reset = up.flow.reset;
3076
-
3077
3013
  up.first = up.flow.first;
3078
3014
 
3079
3015
  }).call(this);
@@ -3107,7 +3043,7 @@ We need to work on this page:
3107
3043
  */
3108
3044
 
3109
3045
  (function() {
3110
- up.motion = (function() {
3046
+ up.motion = (function($) {
3111
3047
  var GHOSTING_PROMISE_KEY, animate, animateOptions, animation, animations, assertIsDeferred, config, defaultAnimations, defaultTransitions, findAnimation, finish, finishGhosting, morph, none, prependCopy, reset, resolvableWhen, snapshot, transition, transitions, u, withGhosts;
3112
3048
  u = up.util;
3113
3049
  animations = {};
@@ -3118,10 +3054,10 @@ We need to work on this page:
3118
3054
  /**
3119
3055
  Sets default options for animations and transitions.
3120
3056
 
3121
- @method up.motion.defaults
3122
- @param {Number} [options.duration=300]
3123
- @param {Number} [options.delay=0]
3124
- @param {String} [options.easing='ease']
3057
+ @method up.motion.config
3058
+ @param {Number} [config.duration=300]
3059
+ @param {Number} [config.delay=0]
3060
+ @param {String} [config.easing='ease']
3125
3061
  */
3126
3062
  config = u.config({
3127
3063
  duration: 300,
@@ -3241,7 +3177,7 @@ We need to work on this page:
3241
3177
  return options;
3242
3178
  };
3243
3179
  findAnimation = function(name) {
3244
- return animations[name] || u.error("Unknown animation %o", animation);
3180
+ return animations[name] || u.error("Unknown animation %o", name);
3245
3181
  };
3246
3182
  GHOSTING_PROMISE_KEY = 'up-ghosting-promise';
3247
3183
  withGhosts = function($old, $new, options, block) {
@@ -3677,8 +3613,8 @@ We need to work on this page:
3677
3613
  transition('cross-fade', function($old, $new, options) {
3678
3614
  return resolvableWhen(animate($old, 'fade-out', options), animate($new, 'fade-in', options));
3679
3615
  });
3680
- up.bus.on('framework:ready', snapshot);
3681
- up.bus.on('framework:reset', reset);
3616
+ up.on('up:framework:boot', snapshot);
3617
+ up.on('up:framework:reset', reset);
3682
3618
  return {
3683
3619
  morph: morph,
3684
3620
  animate: animate,
@@ -3686,12 +3622,15 @@ We need to work on this page:
3686
3622
  finish: finish,
3687
3623
  transition: transition,
3688
3624
  animation: animation,
3689
- defaults: config.update,
3625
+ config: config,
3626
+ defaults: function() {
3627
+ return u.error('up.motion.defaults(...) no longer exists. Set values on he up.motion.config property instead.');
3628
+ },
3690
3629
  none: none,
3691
3630
  when: resolvableWhen,
3692
3631
  prependCopy: prependCopy
3693
3632
  };
3694
- })();
3633
+ })(jQuery);
3695
3634
 
3696
3635
  up.transition = up.motion.transition;
3697
3636
 
@@ -3708,8 +3647,8 @@ Caching and preloading
3708
3647
  ======================
3709
3648
 
3710
3649
  All HTTP requests go through the Up.js proxy.
3711
- It caches a [limited](/up.proxy#up.proxy.defaults) number of server responses
3712
- for a [limited](/up.proxy#up.proxy.defaults) amount of time,
3650
+ It caches a [limited](/up.proxy#up.proxy.config) number of server responses
3651
+ for a [limited](/up.proxy#up.proxy.config) amount of time,
3713
3652
  making requests to these URLs return insantly.
3714
3653
 
3715
3654
  The cache is cleared whenever the user makes a non-`GET` request
@@ -3750,13 +3689,13 @@ The `proxy:busy` event will be emitted after a delay of 300 ms
3750
3689
  to prevent the spinner from flickering on and off.
3751
3690
  You can change (or remove) this delay like this:
3752
3691
 
3753
- up.proxy.defaults({ busyDelay: 150 });
3692
+ up.proxy.config.busyDelay = 150;
3754
3693
 
3755
3694
  @class up.proxy
3756
3695
  */
3757
3696
 
3758
3697
  (function() {
3759
- up.proxy = (function() {
3698
+ up.proxy = (function($) {
3760
3699
  var $waitingLink, SAFE_HTTP_METHODS, ajax, alias, busy, busyDelayTimer, busyEventEmitted, cache, cacheKey, cancelBusyDelay, cancelPreloadDelay, checkPreload, clear, config, get, idle, isIdempotent, load, loadEnded, loadStarted, normalizeRequest, pendingCount, preload, preloadDelayTimer, remove, reset, set, startPreloadDelay, u;
3761
3700
  u = up.util;
3762
3701
  $waitingLink = void 0;
@@ -3766,17 +3705,17 @@ You can change (or remove) this delay like this:
3766
3705
  busyEventEmitted = void 0;
3767
3706
 
3768
3707
  /**
3769
- @method up.proxy.defaults
3770
- @param {Number} [options.preloadDelay=75]
3708
+ @method up.proxy.config
3709
+ @param {Number} [config.preloadDelay=75]
3771
3710
  The number of milliseconds to wait before [`[up-preload]`](#up-preload)
3772
3711
  starts preloading.
3773
- @param {Number} [options.cacheSize=70]
3712
+ @param {Number} [config.cacheSize=70]
3774
3713
  The maximum number of responses to cache.
3775
3714
  If the size is exceeded, the oldest items will be dropped from the cache.
3776
- @param {Number} [options.cacheExpiry=300000]
3715
+ @param {Number} [config.cacheExpiry=300000]
3777
3716
  The number of milliseconds until a cache entry expires.
3778
3717
  Defaults to 5 minutes.
3779
- @param {Number} [options.busyDelay=300]
3718
+ @param {Number} [config.busyDelay=300]
3780
3719
  How long the proxy waits until emitting the `proxy:busy` [event](/up.bus).
3781
3720
  Use this to prevent flickering of spinners.
3782
3721
  */
@@ -3937,7 +3876,7 @@ You can change (or remove) this delay like this:
3937
3876
  if (wasIdle) {
3938
3877
  emission = function() {
3939
3878
  if (busy()) {
3940
- up.bus.emit('proxy:busy');
3879
+ up.bus.emit('up:proxy:busy');
3941
3880
  return busyEventEmitted = true;
3942
3881
  }
3943
3882
  };
@@ -3951,17 +3890,17 @@ You can change (or remove) this delay like this:
3951
3890
  loadEnded = function() {
3952
3891
  pendingCount -= 1;
3953
3892
  if (idle() && busyEventEmitted) {
3954
- up.bus.emit('proxy:idle');
3893
+ up.bus.emit('up:proxy:idle');
3955
3894
  return busyEventEmitted = false;
3956
3895
  }
3957
3896
  };
3958
3897
  load = function(request) {
3959
3898
  var promise;
3960
3899
  u.debug('Loading URL %o', request.url);
3961
- up.bus.emit('proxy:load', request);
3900
+ up.bus.emit('up:proxy:load', request);
3962
3901
  promise = u.ajax(request);
3963
3902
  promise.always(function() {
3964
- return up.bus.emit('proxy:receive', request);
3903
+ return up.bus.emit('up:proxy:receive', request);
3965
3904
  });
3966
3905
  return promise;
3967
3906
  };
@@ -4028,7 +3967,7 @@ You can change (or remove) this delay like this:
4028
3967
  return checkPreload($element);
4029
3968
  }
4030
3969
  });
4031
- up.bus.on('framework:reset', reset);
3970
+ up.on('up:framework:reset', reset);
4032
3971
  return {
4033
3972
  preload: preload,
4034
3973
  ajax: ajax,
@@ -4038,9 +3977,12 @@ You can change (or remove) this delay like this:
4038
3977
  remove: remove,
4039
3978
  idle: idle,
4040
3979
  busy: busy,
4041
- defaults: config.update
3980
+ config: config,
3981
+ defaults: function() {
3982
+ return u.error('up.proxy.defaults(...) no longer exists. Set values on he up.proxy.config property instead.');
3983
+ }
4042
3984
  };
4043
- })();
3985
+ })(jQuery);
4044
3986
 
4045
3987
  }).call(this);
4046
3988
 
@@ -4129,7 +4071,7 @@ Read on
4129
4071
  */
4130
4072
 
4131
4073
  (function() {
4132
- up.link = (function() {
4074
+ up.link = (function($) {
4133
4075
  var childClicked, follow, followMethod, makeFollowable, shouldProcessLinkEvent, u, visit;
4134
4076
  u = up.util;
4135
4077
 
@@ -4474,7 +4416,7 @@ Read on
4474
4416
  childClicked: childClicked,
4475
4417
  followMethod: followMethod
4476
4418
  };
4477
- })();
4419
+ })(jQuery);
4478
4420
 
4479
4421
  up.visit = up.link.visit;
4480
4422
 
@@ -4507,7 +4449,7 @@ We need to work on this page:
4507
4449
  */
4508
4450
 
4509
4451
  (function() {
4510
- up.form = (function() {
4452
+ up.form = (function($) {
4511
4453
  var observe, submit, u;
4512
4454
  u = up.util;
4513
4455
 
@@ -4815,7 +4757,7 @@ We need to work on this page:
4815
4757
  submit: submit,
4816
4758
  observe: observe
4817
4759
  };
4818
- })();
4760
+ })(jQuery);
4819
4761
 
4820
4762
  up.submit = up.form.submit;
4821
4763
 
@@ -4848,15 +4790,16 @@ We need to work on this page:
4848
4790
  */
4849
4791
 
4850
4792
  (function() {
4851
- up.popup = (function() {
4852
- var autoclose, close, config, contains, createHiddenPopup, currentSource, discardHistory, ensureInViewport, open, rememberHistory, reset, setPosition, source, u, updated;
4793
+ up.popup = (function($) {
4794
+ var attach, autoclose, close, config, contains, createHiddenPopup, currentSource, discardHistory, ensureInViewport, rememberHistory, reset, setPosition, source, u, updated;
4853
4795
  u = up.util;
4854
4796
  currentSource = void 0;
4855
4797
 
4856
4798
  /**
4857
- @method up.popup.defaults
4858
- @param {String} options.animation
4859
- @param {String} options.position
4799
+ @method up.popup.config
4800
+ @param {String} config.openAnimation
4801
+ @param {String} config.closeAnimation
4802
+ @param {String} config.position
4860
4803
  */
4861
4804
  config = u.config({
4862
4805
  openAnimation: 'fade-in',
@@ -4968,9 +4911,9 @@ We need to work on this page:
4968
4911
  };
4969
4912
 
4970
4913
  /**
4971
- Opens a popup overlay.
4914
+ Attaches a popup overlay to the given element or selector.
4972
4915
 
4973
- @method up.popup.open
4916
+ @method up.popup.attach
4974
4917
  @param {Element|jQuery|String} elementOrSelector
4975
4918
  @param {String} [options.url]
4976
4919
  @param {String} [options.position='bottom-right']
@@ -4987,7 +4930,7 @@ We need to work on this page:
4987
4930
  open even if the page changes in the background.
4988
4931
  @param {Object} [options.history=false]
4989
4932
  */
4990
- open = function(linkOrSelector, options) {
4933
+ attach = function(linkOrSelector, options) {
4991
4934
  var $link, $popup, animateOptions, animation, history, position, selector, sticky, url;
4992
4935
  $link = $(linkOrSelector);
4993
4936
  options = u.options(options);
@@ -5066,9 +5009,9 @@ We need to work on this page:
5066
5009
  };
5067
5010
 
5068
5011
  /**
5069
- Opens the target of this link in a popup overlay:
5012
+ Opens this link's destination of in a popup overlay:
5070
5013
 
5071
- <a href="/decks" up-modal=".deck_list">Switch deck</a>
5014
+ <a href="/decks" up-popup=".deck_list">Switch deck</a>
5072
5015
 
5073
5016
  If the `up-sticky` attribute is set, the dialog does not auto-close
5074
5017
  if a page fragment below the popup overlay updates:
@@ -5086,7 +5029,7 @@ We need to work on this page:
5086
5029
  if ($link.is('.up-current')) {
5087
5030
  return close();
5088
5031
  } else {
5089
- return open($link);
5032
+ return attach($link);
5090
5033
  }
5091
5034
  });
5092
5035
  up.on('click', 'body', function(event, $body) {
@@ -5096,7 +5039,7 @@ We need to work on this page:
5096
5039
  return close();
5097
5040
  }
5098
5041
  });
5099
- up.bus.on('fragment:ready', function($fragment) {
5042
+ up.on('up:fragment:inserted', function(event, $fragment) {
5100
5043
  var newSource;
5101
5044
  if (contains($fragment)) {
5102
5045
  if (newSource = $fragment.attr('up-source')) {
@@ -5123,15 +5066,21 @@ We need to work on this page:
5123
5066
  return event.preventDefault();
5124
5067
  }
5125
5068
  });
5126
- up.bus.on('framework:reset', reset);
5069
+ up.on('up:framework:reset', reset);
5127
5070
  return {
5128
- open: open,
5071
+ attach: attach,
5129
5072
  close: close,
5130
5073
  source: source,
5131
- defaults: config.update,
5132
- contains: contains
5074
+ config: config,
5075
+ defaults: function() {
5076
+ return u.error('up.popup.defaults(...) no longer exists. Set values on he up.popup.config property instead.');
5077
+ },
5078
+ contains: contains,
5079
+ open: function() {
5080
+ return up.warn('up.popup.open no longer exists. Please use up.popup.attach instead.');
5081
+ }
5133
5082
  };
5134
- })();
5083
+ })(jQuery);
5135
5084
 
5136
5085
  }).call(this);
5137
5086
 
@@ -5148,32 +5097,30 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5148
5097
  */
5149
5098
 
5150
5099
  (function() {
5151
- var slice = [].slice;
5152
-
5153
- up.modal = (function() {
5154
- var autoclose, close, config, contains, createHiddenModal, currentSource, discardHistory, open, rememberHistory, reset, shiftElements, source, templateHtml, u, unshiftElements, updated;
5100
+ up.modal = (function($) {
5101
+ var autoclose, close, config, contains, createHiddenModal, currentSource, discardHistory, follow, open, rememberHistory, reset, shiftElements, source, templateHtml, u, unshiftElements, updated, visit;
5155
5102
  u = up.util;
5156
5103
 
5157
5104
  /**
5158
5105
  Sets default options for future modals.
5159
5106
 
5160
- @method up.modal.defaults
5161
- @param {Number} [options.width]
5107
+ @method up.modal.config
5108
+ @param {Number} [config.width]
5162
5109
  The width of the dialog as a CSS value like `'400px'` or `50%`.
5163
5110
 
5164
5111
  Defaults to `undefined`, meaning that the dialog will grow to fit its contents
5165
- until it reaches `options.maxWidth`. Leaving this as `undefined` will
5112
+ until it reaches `config.maxWidth`. Leaving this as `undefined` will
5166
5113
  also allow you to control the width using CSS on `.up-modal-dialog´.
5167
- @param {Number} [options.maxWidth]
5114
+ @param {Number} [config.maxWidth]
5168
5115
  The width of the dialog as a CSS value like `'400px'` or `50%`.
5169
5116
  You can set this to `undefined` to make the dialog fit its contents.
5170
5117
  Be aware however, that e.g. Bootstrap stretches input elements
5171
5118
  to `width: 100%`, meaning the dialog will also stretch to the full
5172
5119
  width of the screen.
5173
- @param {Number} [options.height='auto']
5120
+ @param {Number} [config.height='auto']
5174
5121
  The height of the dialog in pixels.
5175
5122
  Defaults to `undefined`, meaning that the dialog will grow to fit its contents.
5176
- @param {String|Function(config)} [options.template]
5123
+ @param {String|Function(config)} [config.template]
5177
5124
  A string containing the HTML structure of the modal.
5178
5125
  You can supply an alternative template string, but make sure that it
5179
5126
  defines tag with the classes `up-modal`, `up-modal-dialog` and `up-modal-content`.
@@ -5181,12 +5128,12 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5181
5128
  You can also supply a function that returns a HTML string.
5182
5129
  The function will be called with the modal options (merged from these defaults
5183
5130
  and any per-open overrides) whenever a modal opens.
5184
- @param {String} [options.closeLabel='X']
5131
+ @param {String} [config.closeLabel='X']
5185
5132
  The label of the button that closes the dialog.
5186
- @param {String} [options.openAnimation='fade-in']
5133
+ @param {String} [config.openAnimation='fade-in']
5187
5134
  The animation used to open the modal. The animation will be applied
5188
5135
  to both the dialog box and the overlay dimming the page.
5189
- @param {String} [options.closeAnimation='fade-out']
5136
+ @param {String} [config.closeAnimation='fade-out']
5190
5137
  The animation used to close the modal. The animation will be applied
5191
5138
  to both the dialog box and the overlay dimming the page.
5192
5139
  */
@@ -5278,33 +5225,31 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5278
5225
  });
5279
5226
  };
5280
5227
  updated = function($modal, animation, animateOptions) {
5281
- var promise;
5282
- up.bus.emit('modal:open');
5228
+ var deferred;
5283
5229
  shiftElements();
5284
5230
  $modal.show();
5285
- promise = up.animate($modal, animation, animateOptions);
5286
- promise.then(function() {
5287
- return up.bus.emit('modal:opened');
5231
+ deferred = up.animate($modal, animation, animateOptions);
5232
+ return deferred.then(function() {
5233
+ return up.bus.emit('up:modal:opened');
5288
5234
  });
5289
- return promise;
5290
5235
  };
5291
5236
 
5292
5237
  /**
5293
5238
  Opens the given link's destination in a modal overlay:
5294
5239
 
5295
5240
  var $link = $('...');
5296
- up.modal.open($link);
5241
+ up.modal.follow($link);
5297
5242
 
5298
5243
  Any option attributes for [`a[up-modal]`](#a.up-modal) will be honored.
5299
5244
 
5300
5245
  \#\#\#\# Events
5301
5246
 
5302
- - Emits an [event](/up.bus) `modal:open` when the modal
5247
+ - Emits an [event](/up.bus) `up:modal:open` when the modal
5303
5248
  is starting to open.
5304
- - Emits an [event](/up.bus) `modal:opened` when the opening
5249
+ - Emits an [event](/up.bus) `up:modal:opened` when the opening
5305
5250
  animation has finished and the modal contents are fully visible.
5306
5251
 
5307
- @method up.modal.open
5252
+ @method up.modal.follow
5308
5253
  @param {Element|jQuery|String} elementOrSelector
5309
5254
  The link to follow.
5310
5255
  @param {String} [options.target]
@@ -5331,19 +5276,24 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5331
5276
  @return {Promise}
5332
5277
  A promise that will be resolved when the modal has finished loading.
5333
5278
  */
5279
+ follow = function($link, options) {
5280
+ options = u.options(options);
5281
+ options.$link = $link;
5282
+ return open(options);
5283
+ };
5334
5284
 
5335
5285
  /**
5336
5286
  Opens a modal for the given URL.
5337
5287
 
5338
5288
  Example:
5339
5289
 
5340
- up.modal.open({ url: '/foo', target: '.list' })
5290
+ up.modal.visit('/foo', { target: '.list' })
5341
5291
 
5342
5292
  This will request `/foo`, extract the `.list` selector from the response
5343
5293
  and open the selected container in a modal dialog.
5344
5294
 
5345
- @method up.modal.open
5346
- @param {String} options.url
5295
+ @method up.modal.visit
5296
+ @param {String} url
5347
5297
  The URL to load.
5348
5298
  @param {String} options.target
5349
5299
  The CSS selector to extract from the response.
@@ -5351,17 +5301,19 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5351
5301
  @param {Object} options
5352
5302
  See options for [previous `up.modal.open` variant](#up.modal.open).
5353
5303
  */
5354
- open = function() {
5355
- var $link, $modal, animateOptions, animation, args, height, history, maxWidth, options, selector, sticky, url, width;
5356
- args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
5357
- if (u.isObject(args[0]) && !u.isElement(args[0]) && !u.isJQuery(args[0])) {
5358
- $link = u.nullJquery();
5359
- options = args[0];
5360
- } else {
5361
- $link = $(args[0]);
5362
- options = args[1];
5363
- }
5304
+ visit = function(url, options) {
5305
+ options = u.options(options);
5306
+ options.url = url;
5307
+ return open(options);
5308
+ };
5309
+
5310
+ /**
5311
+ @private
5312
+ */
5313
+ open = function(options) {
5314
+ var $link, $modal, animateOptions, animation, height, history, maxWidth, selector, sticky, url, width;
5364
5315
  options = u.options(options);
5316
+ $link = u.option(options.$link, u.nullJquery());
5365
5317
  url = u.option(options.url, $link.attr('up-href'), $link.attr('href'));
5366
5318
  selector = u.option(options.target, $link.attr('up-modal'), 'body');
5367
5319
  width = u.option(options.width, $link.attr('up-width'), config.width);
@@ -5372,19 +5324,25 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5372
5324
  history = up.browser.canPushState() ? u.option(options.history, u.castedAttr($link, 'up-history'), true) : false;
5373
5325
  animateOptions = up.motion.animateOptions(options, $link);
5374
5326
  close();
5375
- $modal = createHiddenModal({
5376
- selector: selector,
5377
- width: width,
5378
- maxWidth: maxWidth,
5379
- height: height,
5380
- sticky: sticky
5381
- });
5382
- return up.replace(selector, url, {
5383
- history: history,
5384
- insert: function() {
5385
- return updated($modal, animation, animateOptions);
5386
- }
5387
- });
5327
+ if (up.bus.nobodyPrevents('up:modal:open', {
5328
+ url: url
5329
+ })) {
5330
+ $modal = createHiddenModal({
5331
+ selector: selector,
5332
+ width: width,
5333
+ maxWidth: maxWidth,
5334
+ height: height,
5335
+ sticky: sticky
5336
+ });
5337
+ return up.replace(selector, url, {
5338
+ history: history,
5339
+ insert: function() {
5340
+ return updated($modal, animation, animateOptions);
5341
+ }
5342
+ });
5343
+ } else {
5344
+ return $.Deferred();
5345
+ }
5388
5346
  };
5389
5347
 
5390
5348
  /**
@@ -5418,22 +5376,27 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5418
5376
  var $modal, deferred;
5419
5377
  $modal = $('.up-modal');
5420
5378
  if ($modal.length) {
5421
- options = u.options(options, {
5422
- animation: config.closeAnimation,
5423
- url: $modal.attr('up-previous-url'),
5424
- title: $modal.attr('up-previous-title')
5425
- });
5426
- currentSource = void 0;
5427
- up.bus.emit('modal:close');
5428
- deferred = up.destroy($modal, options);
5429
- deferred.then(function() {
5430
- var unshifter;
5431
- while (unshifter = unshiftElements.pop()) {
5432
- unshifter();
5433
- }
5434
- return up.bus.emit('modal:closed');
5435
- });
5436
- return deferred;
5379
+ if (up.bus.nobodyPrevents('up:modal:close', {
5380
+ $element: $modal
5381
+ })) {
5382
+ options = u.options(options, {
5383
+ animation: config.closeAnimation,
5384
+ url: $modal.attr('up-previous-url'),
5385
+ title: $modal.attr('up-previous-title')
5386
+ });
5387
+ currentSource = void 0;
5388
+ deferred = up.destroy($modal, options);
5389
+ deferred.then(function() {
5390
+ var unshifter;
5391
+ while (unshifter = unshiftElements.pop()) {
5392
+ unshifter();
5393
+ }
5394
+ return up.bus.emit('up:modal:closed');
5395
+ });
5396
+ return deferred;
5397
+ } else {
5398
+ return $.Deferred();
5399
+ }
5437
5400
  } else {
5438
5401
  return u.resolvedDeferred();
5439
5402
  }
@@ -5499,7 +5462,7 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5499
5462
  </div>
5500
5463
 
5501
5464
  If you want to change the design beyond CSS, you can
5502
- configure Up.js to [use a different HTML structure](#up.modal.defaults).
5465
+ configure Up.js to [use a different HTML structure](#up.modal.config).
5503
5466
 
5504
5467
 
5505
5468
  \#\#\#\# Closing behavior
@@ -5538,7 +5501,7 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5538
5501
  return close();
5539
5502
  }
5540
5503
  });
5541
- up.bus.on('fragment:ready', function($fragment) {
5504
+ up.on('up:fragment:inserted', function(event, $fragment) {
5542
5505
  var newSource;
5543
5506
  if (contains($fragment)) {
5544
5507
  if (newSource = $fragment.attr('up-source')) {
@@ -5565,15 +5528,22 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
5565
5528
  return event.preventDefault();
5566
5529
  }
5567
5530
  });
5568
- up.bus.on('framework:reset', reset);
5531
+ up.on('up:framework:reset', reset);
5569
5532
  return {
5570
- open: open,
5533
+ visit: visit,
5534
+ follow: follow,
5535
+ open: function() {
5536
+ return up.error('up.modal.open no longer exists. Please use either up.modal.follow or up.modal.visit.');
5537
+ },
5571
5538
  close: close,
5572
5539
  source: source,
5573
- defaults: config.update,
5540
+ config: config,
5541
+ defaults: function() {
5542
+ return u.error('up.modal.defaults(...) no longer exists. Set values on he up.modal.config property instead.');
5543
+ },
5574
5544
  contains: contains
5575
5545
  };
5576
- })();
5546
+ })(jQuery);
5577
5547
 
5578
5548
  }).call(this);
5579
5549
 
@@ -5597,8 +5567,8 @@ We need to work on this page:
5597
5567
  */
5598
5568
 
5599
5569
  (function() {
5600
- up.tooltip = (function() {
5601
- var close, createElement, open, setPosition, u;
5570
+ up.tooltip = (function($) {
5571
+ var attach, close, createElement, setPosition, u;
5602
5572
  u = up.util;
5603
5573
  setPosition = function($link, $tooltip, position) {
5604
5574
  var css, linkBox, tooltipBox;
@@ -5623,8 +5593,16 @@ We need to work on this page:
5623
5593
  $tooltip.attr('up-position', position);
5624
5594
  return $tooltip.css(css);
5625
5595
  };
5626
- createElement = function(html) {
5627
- return u.$createElementFromSelector('.up-tooltip').html(html).appendTo(document.body);
5596
+ createElement = function(options) {
5597
+ var $element;
5598
+ $element = u.$createElementFromSelector('.up-tooltip');
5599
+ if (u.isGiven(options.text)) {
5600
+ $element.text(options.text);
5601
+ } else {
5602
+ $element.html(options.html);
5603
+ }
5604
+ $element.appendTo(document.body);
5605
+ return $element;
5628
5606
  };
5629
5607
 
5630
5608
  /**
@@ -5634,7 +5612,7 @@ We need to work on this page:
5634
5612
  html: 'Enter multiple words or phrases'
5635
5613
  });
5636
5614
 
5637
- @method up.tooltip.open
5615
+ @method up.tooltip.attach
5638
5616
  @param {Element|jQuery|String} elementOrSelector
5639
5617
  @param {String} [options.html]
5640
5618
  The HTML to display in the tooltip.
@@ -5643,18 +5621,22 @@ We need to work on this page:
5643
5621
  @param {String} [options.animation]
5644
5622
  The animation to use when opening the tooltip.
5645
5623
  */
5646
- open = function(linkOrSelector, options) {
5647
- var $link, $tooltip, animateOptions, animation, html, position;
5624
+ attach = function(linkOrSelector, options) {
5625
+ var $link, $tooltip, animateOptions, animation, html, position, text;
5648
5626
  if (options == null) {
5649
5627
  options = {};
5650
5628
  }
5651
5629
  $link = $(linkOrSelector);
5652
- html = u.option(options.html, $link.attr('up-tooltip'), $link.attr('title'));
5630
+ html = u.option(options.html, $link.attr('up-tooltip-html'));
5631
+ text = u.option(options.text, $link.attr('up-tooltip'), $link.attr('title'));
5653
5632
  position = u.option(options.position, $link.attr('up-position'), 'top');
5654
5633
  animation = u.option(options.animation, u.castedAttr($link, 'up-animation'), 'fade-in');
5655
5634
  animateOptions = up.motion.animateOptions(options, $link);
5656
5635
  close();
5657
- $tooltip = createElement(html);
5636
+ $tooltip = createElement({
5637
+ text: text,
5638
+ html: html
5639
+ });
5658
5640
  setPosition($link, $tooltip, position);
5659
5641
  return up.animate($tooltip, animation, animateOptions);
5660
5642
  };
@@ -5680,7 +5662,7 @@ We need to work on this page:
5680
5662
  };
5681
5663
 
5682
5664
  /**
5683
- Displays a tooltip when hovering the mouse over this element:
5665
+ Displays a tooltip with text content when hovering the mouse over this element:
5684
5666
 
5685
5667
  <a href="/decks" up-tooltip="Show all decks">Decks</a>
5686
5668
 
@@ -5691,7 +5673,16 @@ We need to work on this page:
5691
5673
  @method [up-tooltip]
5692
5674
  @ujs
5693
5675
  */
5694
- up.compiler('[up-tooltip]', function($link) {
5676
+
5677
+ /**
5678
+ Displays a tooltip with HTML content when hovering the mouse over this element:
5679
+
5680
+ <a href="/decks" up-tooltip="Show &lt;b&gt;all&lt;/b&gt; decks">Decks</a>
5681
+
5682
+ @method [up-tooltip-html]
5683
+ @ujs
5684
+ */
5685
+ up.compiler('[up-tooltip], [up-tooltip-html]', function($link) {
5695
5686
  $link.on('mouseover', function() {
5696
5687
  return open($link);
5697
5688
  });
@@ -5702,15 +5693,18 @@ We need to work on this page:
5702
5693
  up.on('click', 'body', function(event, $body) {
5703
5694
  return close();
5704
5695
  });
5705
- up.bus.on('framework:reset', close);
5696
+ up.on('up:framework:reset', close);
5706
5697
  up.magic.onEscape(function() {
5707
5698
  return close();
5708
5699
  });
5709
5700
  return {
5710
- open: open,
5711
- close: close
5701
+ attach: attach,
5702
+ close: close,
5703
+ open: function() {
5704
+ return u.error('up.tooltip.open no longer exists. Use up.tooltip.attach instead.');
5705
+ }
5712
5706
  };
5713
- })();
5707
+ })(jQuery);
5714
5708
 
5715
5709
  }).call(this);
5716
5710
 
@@ -5729,16 +5723,16 @@ by providing instant feedback for user interactions.
5729
5723
  */
5730
5724
 
5731
5725
  (function() {
5732
- up.navigation = (function() {
5726
+ up.navigation = (function($) {
5733
5727
  var CLASS_ACTIVE, SELECTORS_SECTION, SELECTOR_ACTIVE, SELECTOR_SECTION, SELECTOR_SECTION_INSTANT, config, currentClass, enlargeClickArea, locationChanged, normalizeUrl, reset, sectionClicked, sectionUrls, selector, u, unmarkActive, urlSet;
5734
5728
  u = up.util;
5735
5729
 
5736
5730
  /**
5737
5731
  Sets default options for this module.
5738
5732
 
5739
- @method up.navigation.defaults
5740
- @param {Number} [options.currentClass]
5741
- The class to set on [links that point the current location](#up-current).
5733
+ @method up.navigation.config
5734
+ @param {Number} [config.currentClasses]
5735
+ An array of classes to set on [links that point the current location](#up-current).
5742
5736
  */
5743
5737
  config = u.config({
5744
5738
  currentClasses: ['up-current']
@@ -5927,97 +5921,29 @@ by providing instant feedback for user interactions.
5927
5921
  @method [up-current]
5928
5922
  @ujs
5929
5923
  */
5930
- up.bus.on('fragment:ready', function() {
5924
+ up.on('up:fragment:inserted', function() {
5931
5925
  unmarkActive();
5932
5926
  return locationChanged();
5933
5927
  });
5934
- up.bus.on('fragment:destroy', function($fragment) {
5928
+ up.on('up:fragment:destroy', function(event, $fragment) {
5935
5929
  if ($fragment.is('.up-modal, .up-popup')) {
5936
5930
  return locationChanged();
5937
5931
  }
5938
5932
  });
5939
- up.bus.on('framework:reset', reset);
5933
+ up.on('up:framework:reset', reset);
5940
5934
  return {
5941
- defaults: config.update
5942
- };
5943
- })();
5944
-
5945
- }).call(this);
5946
-
5947
- /**
5948
- Content slots
5949
- =============
5950
-
5951
- It can be useful to mark "slots" in your page layout where you expect
5952
- content to appear in the future.
5953
-
5954
- For example, you might have
5955
-
5956
- <div up-slot class="alerts"></div>
5957
-
5958
- <script>
5959
- up.compiler('.alerts', function ($element) {
5960
- setInterval(3000, function() { up.reload('.alerts') });
5961
- });
5962
- </script>
5963
-
5964
- Seeing that the `.alerts` container is empty, Up.js will hide it:
5965
-
5966
- <div class="alerts" up-slot style="display: none"></div>
5967
-
5968
- As soon as you
5969
-
5970
- <div class="alerts" up-slot>
5971
- Meeting at 11:30 AM
5972
- </div>
5973
-
5974
-
5975
- TODO: Write some documentation
5976
-
5977
- @class up.slot
5978
- */
5979
-
5980
- (function() {
5981
- up.slot = (function() {
5982
- var check, hasContent, u;
5983
- u = up.util;
5984
- hasContent = function($slot) {
5985
- return u.trim($slot.html()) !== '';
5986
- };
5987
- check = function($element) {
5988
- return u.findWithSelf($element, '[up-slot]').each(function() {
5989
- var $slot;
5990
- $slot = $(this);
5991
- if (!hasContent($slot)) {
5992
- return $slot.hide();
5993
- }
5994
- });
5935
+ config: config,
5936
+ defaults: function() {
5937
+ return u.error('up.navigation.defaults(...) no longer exists. Set values on he up.navigation.config property instead.');
5938
+ }
5995
5939
  };
5996
-
5997
- /**
5998
- Use this attribute to mark up empty element containers that
5999
- you plan to update with content in the future.
6000
-
6001
- An element with this attribute is automatically hidden
6002
- if it has no content, and is re-shown if it is updated with
6003
- content.
6004
-
6005
- This is useful to prevent the element from applying unwanted
6006
- margins to the surrounding page flow.
6007
-
6008
- @method [up-slot]
6009
- @ujs
6010
- */
6011
- return up.bus.on('fragment:ready', check);
6012
- })();
5940
+ })(jQuery);
6013
5941
 
6014
5942
  }).call(this);
6015
5943
  (function() {
6016
5944
  if (up.browser.isSupported()) {
6017
- up.bus.emit('framework:ready');
6018
- $(document).on('ready', function() {
6019
- return up.bus.emit('app:ready');
6020
- });
5945
+ up.bus.emit('up:framework:boot');
5946
+ up.bus.emit('up:framework:booted');
6021
5947
  }
6022
5948
 
6023
5949
  }).call(this);