unpoly-rails 0.61.1 → 1.0.1

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.

Potentially problematic release.


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

Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +56 -1
  3. data/Gemfile +0 -1
  4. data/Gemfile.lock +1 -7
  5. data/README.md +7 -6
  6. data/Rakefile +10 -1
  7. data/dist/unpoly.js +85 -55
  8. data/dist/unpoly.min.js +4 -4
  9. data/lib/assets/javascripts/unpoly/classes/body_shifter.coffee +21 -12
  10. data/lib/assets/javascripts/unpoly/classes/follow_variant.coffee +11 -3
  11. data/lib/assets/javascripts/unpoly/classes/params.coffee.erb +1 -0
  12. data/lib/assets/javascripts/unpoly/classes/request.coffee +1 -0
  13. data/lib/assets/javascripts/unpoly/element.coffee.erb +8 -5
  14. data/lib/assets/javascripts/unpoly/event.coffee.erb +1 -1
  15. data/lib/assets/javascripts/unpoly/form.coffee.erb +16 -1
  16. data/lib/assets/javascripts/unpoly/fragment.coffee.erb +1 -0
  17. data/lib/assets/javascripts/unpoly/framework.coffee +7 -9
  18. data/lib/assets/javascripts/unpoly/log.coffee +7 -2
  19. data/lib/assets/javascripts/unpoly/modal.coffee.erb +2 -0
  20. data/lib/assets/javascripts/unpoly/motion.coffee.erb +1 -1
  21. data/lib/assets/javascripts/unpoly/protocol.coffee +2 -0
  22. data/lib/assets/javascripts/unpoly/syntax.coffee.erb +2 -3
  23. data/lib/assets/javascripts/unpoly/util.coffee.erb +2 -1
  24. data/lib/unpoly/rails/version.rb +1 -1
  25. data/package.json +1 -1
  26. data/spec_app/Gemfile +0 -1
  27. data/spec_app/Gemfile.lock +1 -7
  28. data/spec_app/app/views/compiler_test/timestamp.erb +1 -0
  29. data/spec_app/app/views/css_test/modal.erb +1 -1
  30. data/spec_app/app/views/css_test/popup.erb +1 -1
  31. data/spec_app/spec/javascripts/up/fragment_spec.js.coffee +27 -1
  32. data/spec_app/spec/javascripts/up/link_spec.js.coffee +7 -2
  33. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +23 -1
  34. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +2 -1
  35. data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +8 -0
  36. data/spec_app/spec/javascripts/up/util_spec.js.coffee +14 -0
  37. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 100bf69b4ef6a03c11b19ca7b7ed2e7180cf739ce5df3222d8cb22cbac296a60
4
- data.tar.gz: a77f9194b9026975094a1e19a52dcc83ff2e0db28332bf0c6263d0637edf5353
3
+ metadata.gz: 2f41bd14a88026cca1b4d98253d557b3c7f03eb9a92a079b5892dcf81c16f703
4
+ data.tar.gz: 1e81428e2a3ee05a77b82792f3835f55891a0b845e4fe0b05e0fafb9b3a19291
5
5
  SHA512:
6
- metadata.gz: 8be34463c5f666375cd71494c5a021698f8acdccddb4889972a062e3a457941ea912328b9b5cb9d3dd40d7e50930c9d76986d607609e42ad782172d16a564561
7
- data.tar.gz: 5c22c78254ba8dea5835d4628fdd07e957247618f99a0b781562113f491ba9b1b644eb667bcafb044d997967e13c405afda203373611e514da0d93d390fd5781
6
+ metadata.gz: 653e3343531c9254fc318dbd951d1bd5fa7a4a0f997e627f7d3dc8350a64c4471879d8ab458f9cb90abf67b466e9590b674b143a7cc331780d4663ee8ff792a6
7
+ data.tar.gz: 30bfba350545b36fa5201b9072bea60fe61883e86c352c21ec3d4ef6f432b7b4413bcebedf4046e50dd8731fa46e21cb79f7278ec2d51bb26d72ef579ae2aa95
data/CHANGELOG.md CHANGED
@@ -5,11 +5,66 @@ Changes to this project will be documented in this file.
5
5
 
6
6
  You may browse a formatted and hyperlinked version of this file at <https://unpoly.com/changes>.
7
7
 
8
+ 1.0.1
9
+ -----
10
+
11
+ This is a maintenance release for Unpoly 1. Expect little to no additional changes for this legacy version. New features will only be added to Unpoly 2.
12
+
13
+ - `up.request()` will now send Unpoly's version number as an `X-Up-Version` request header. Since `X-Up-Target` is optional in Unpoly 2, server-side integration libraries can look for `X-Up-Version` to reliably detect a fragment update for both Unpoly 1 and 2.
14
+ - Fix a bug where the Unpoly banner would still be printed to the development console when `up.log.config.banner = false` is set. (fix by @adam12)
15
+
16
+
17
+ 1.0.0
18
+ -----
19
+
20
+ For six years Unpoly has been released under a 0.x version number. To establish the maturity and stability of the project, we're releasing today's version as 1.0.0.
21
+
22
+ There are only three changes from 0.62.1:
23
+
24
+ - Fix a bug where `up.util.escapeHTML()` would not escape single quotes.
25
+ - Unpoly will no longer wait a JavaScript execution task to boot after `DOMContentLoaded`. This may improve the stability of test suites that previously interacted with the page too soon.
26
+ - You may now disable the Unpoly banner in the development console with `up.log.config.banner = false`. (change by @hfjallemark).
27
+
28
+ This is the last release of the 0.x API line. We're tracking its code in the [`1.x-stable`](https://github.com/unpoly/unpoly/tree/1.x-stable), but expect little to no changes in the future.
29
+
30
+ The next release will be [Unpoly 2](https://triskweline.de/unpoly2-slides). It will include major (but mostly backwards compatible) renovations to its API, unlocking many use cases that were not possible with Unpoly 1.
31
+
32
+
33
+ 0.62.1
34
+ ------
35
+
36
+ This is another maintenance release while we're finishing [the next major version of Unpoly](https://groups.google.com/forum/#!topic/unpoly/FDdVjxbjNLg).
37
+
38
+ Community members were involved in every change of this release:
39
+
40
+ - [`up.submit()`](/up.submit) has a new options `{ params }`. It may be used to pass extra form [parameters](/up.Params) that will be submitted in addition to the parameters from the form. (fix by @robinvdvleuten)
41
+ - [`a[up-modal]`](/a-up-modal) will now honor an [`[up-cache]`](/a-up-target#up-cache) attribute on the same link. (fix by @adam12)
42
+ - Prevent destructor function from being called twice if [`up.destroy()`](/up.destroy) is called twice with the same element (reported by @kratob)
43
+ - On devices that don't show a vertical scrollbar, users can no longer scroll the underlying page while a [modal overlay](/up.modal) is open. (reported by @msurdi)
44
+
45
+
46
+ 0.62.0
47
+ ------
48
+
49
+ This release backports a number of accessibility improvements from [the next major version of Unpoly](https://groups.google.com/forum/#!topic/unpoly/FDdVjxbjNLg).
50
+ We encourage everyone to upgrade to this release in order to better support users with visual impairments.
51
+
52
+ The following changes are included:
53
+
54
+ - Links with an [`[up-instant]`](/a-up-instant) attribute can now be followed with the keyboard.
55
+ - Fragments that are being [destroyed](/up.destroy) now get an [`[aria-hidden=true]`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-hidden_attribute)
56
+ attribute while its disappearance is being animated. When a fragment is being swapped with a new version, the old fragment version is also
57
+ given `[aria-hidden=true]` while it's disappearing.
58
+ - [Modal dialogs](/up.modal) now get an [`[aria-modal=true]`](https://a11ysupport.io/tech/aria/aria-modal_attribute) attribute.
59
+
60
+ The next major version of Unpoly will include additional accessibility improvements. In particular the
61
+ new modal ("layer") implementation will implement all best practices for accessible dialogs.
62
+
8
63
 
9
64
  0.61.1
10
65
  ------
11
66
 
12
- This is a maintenance release while we're getting ready for the next major version of Unpoly.
67
+ This is a maintenance release while we're getting ready for [the next major version of Unpoly](https://groups.google.com/forum/#!topic/unpoly/FDdVjxbjNLg).
13
68
 
14
69
  - Fix a bug where [`up.destroy()`](/up.destroy) wouldn't clean up the global jQuery cache. This is only relevant when using Unpoly together with jQuery.
15
70
  - Fields outside a <form> are now recognized when they have a matching [form] attribute (fixes #85)
data/Gemfile CHANGED
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'rack'
4
- gem 'therubyracer'
5
4
  gem 'sass'
6
5
  gem 'uglifier'
7
6
  gem 'coffee-script'
data/Gemfile.lock CHANGED
@@ -8,11 +8,9 @@ GEM
8
8
  execjs (2.7.0)
9
9
  hike (1.2.3)
10
10
  json (1.8.2)
11
- libv8 (3.16.14.11)
12
11
  multi_json (1.10.1)
13
12
  rack (1.6.0)
14
13
  rake (10.4.2)
15
- ref (1.0.5)
16
14
  sass (3.4.11)
17
15
  sprockets (2.12.3)
18
16
  hike (~> 1.2)
@@ -22,9 +20,6 @@ GEM
22
20
  sprockets-standalone (1.2.1)
23
21
  rake
24
22
  sprockets (~> 2.0)
25
- therubyracer (0.12.1)
26
- libv8 (~> 3.16.14.0)
27
- ref
28
23
  tilt (1.4.1)
29
24
  uglifier (2.7.0)
30
25
  execjs (>= 0.3.0)
@@ -38,8 +33,7 @@ DEPENDENCIES
38
33
  rack
39
34
  sass
40
35
  sprockets-standalone
41
- therubyracer
42
36
  uglifier
43
37
 
44
38
  BUNDLED WITH
45
- 1.16.1
39
+ 1.17.3
data/README.md CHANGED
@@ -31,8 +31,9 @@ Overview:
31
31
 
32
32
  Install dependencies for tests:
33
33
 
34
- - Install Ruby 2.1.2
34
+ - Install Ruby 2.3.8
35
35
  - Install Bundler by running `gem install bundler`
36
+ - Install Node.js (required for building the library)
36
37
  - `cd` into `spec_app`
37
38
  - Install dependencies by running `bundle install`
38
39
 
@@ -50,11 +51,9 @@ To run RSpec tests for the `unpoly-rails` gem:
50
51
 
51
52
  ### Making a new release
52
53
 
53
- We are currently feeding four release channels:
54
+ We are currently feeding the following release channels:
54
55
 
55
- - Manual download from GitHub
56
56
  - npm
57
- - Bower (which is based on Git and version tags)
58
57
  - Rubygems (as the `unpoly-rails` gem)
59
58
 
60
59
  We always release to all channel simultaneously.
@@ -64,6 +63,7 @@ To prepare a new version:
64
63
  1. Edit `lib/unpoly/rails/version.rb` and bump the version number. Use [semantic versioning](http://semver.org/).
65
64
  2. Add an entry to `CHANGELOG.md`
66
65
  3. Commit and push the version bump and `CHANGELOG.md`
66
+ 4. Merge the relevant `CHANGEOG.md` entries to the `master` branch (since [unpoly.com](https://unpoly.com) builds from there)
67
67
 
68
68
  Now we can release a new version. **This requires your to be logged into Rubygems and npm**:
69
69
 
@@ -78,8 +78,9 @@ If you have done this process a few times and know what you're doing, you can ca
78
78
 
79
79
  After you have published all release channels, remember to:
80
80
 
81
- 1. Update [unpoly.com](https://unpoly.com/) so users see the new version, CDN link and CHANGELOG.
82
- 2. Send a message to the [E-mail group](https://groups.google.com/group/unpoly) with the title "Unpoly X.Y.Z released". You can copy the relevant CHANGELOG part from [here](http://localhost:4567/changes_google_groups).
81
+ 1. Deploy to [unpoly.com](https://unpoly.com/)
82
+ 2. Deploy to [v1.unpoly.com](https://unpoly.com/)
83
+ 3. Send a message to the [E-mail group](https://groups.google.com/group/unpoly) with the title "Unpoly X.Y.Z released". You can copy the relevant CHANGELOG part from [here](http://localhost:4567/changes_google_groups).
83
84
 
84
85
 
85
86
  Credits
data/Rakefile CHANGED
@@ -99,7 +99,7 @@ namespace :publish do
99
99
 
100
100
  desc 'Release new version to all package managers'
101
101
  task :release do
102
- Rake::Task['release'].invoke
102
+ Rake::Task['rubygems:publish'].invoke
103
103
  Rake::Task['npm:publish'].invoke
104
104
  end
105
105
 
@@ -117,6 +117,15 @@ namespace :publish do
117
117
 
118
118
  end
119
119
 
120
+ namespace :rubygems do
121
+
122
+ task :publish do
123
+ puts 'Publishing to rubygems.org. If this seems to hang, enter your 2FA token.'
124
+ Rake::Task['release'].invoke
125
+ end
126
+
127
+ end
128
+
120
129
  namespace :npm do
121
130
 
122
131
  task :bump_version do
data/dist/unpoly.js CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  (function() {
7
7
  window.up = {
8
- version: "0.61.1"
8
+ version: "1.0.1"
9
9
  };
10
10
 
11
11
  }).call(this);
@@ -1305,7 +1305,8 @@ to not include another library in your asset bundle.
1305
1305
  "&": "&amp;",
1306
1306
  "<": "&lt;",
1307
1307
  ">": "&gt;",
1308
- '"': '&quot;'
1308
+ '"': '&quot;',
1309
+ "'": '&#x27;'
1309
1310
  };
1310
1311
 
1311
1312
  /***
@@ -1317,7 +1318,7 @@ to not include another library in your asset bundle.
1317
1318
  @stable
1318
1319
  */
1319
1320
  escapeHtml = function(string) {
1320
- return string.replace(/[&<>"]/g, function(char) {
1321
+ return string.replace(/[&<>"']/g, function(char) {
1321
1322
  return ESCAPE_HTML_ENTITY_MAP[char];
1322
1323
  });
1323
1324
  };
@@ -2519,6 +2520,7 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
2519
2520
  [this WHATWG mailing list post](http://lists.w3.org/Archives/Public/public-whatwg-archive/2014Apr/0094.html).
2520
2521
 
2521
2522
  @function up.element.show
2523
+ @param {Element} element
2522
2524
  @experimental
2523
2525
  */
2524
2526
  show = function(element) {
@@ -2557,8 +2559,10 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
2557
2559
  @param {Element} element
2558
2560
  The element for which to add or remove the class.
2559
2561
  @param {String} className
2560
- A boolean value to determine whether the class should be added or removed.
2561
- @param {String} state
2562
+ The class which should be added or removed.
2563
+ @param {Boolean} [newPresent]
2564
+ Pass `true` to add the class to the element or `false` to remove it.
2565
+
2562
2566
  If omitted, the class will be added if missing and removed if present.
2563
2567
  @experimental
2564
2568
  */
@@ -2771,11 +2775,11 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
2771
2775
  element.className // returns 'klass'
2772
2776
 
2773
2777
  @function up.element.affix
2774
- @params {Element} parent
2778
+ @param {Element} parent
2775
2779
  The parent to which to attach the created element.
2776
- @params {string} selector
2780
+ @param {string} selector
2777
2781
  The CSS selector from which to create an element.
2778
- @params {Object} attrs
2782
+ @param {Object} attrs
2779
2783
  An object of attributes to set on the created element.
2780
2784
  @param {Object} attrs.text
2781
2785
  The [text content](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) of the created element.
@@ -3428,32 +3432,32 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
3428
3432
  }
3429
3433
 
3430
3434
  BodyShifter.prototype.shift = function() {
3431
- var anchor, body, bodyRightPadding, bodyRightShift, elementRight, elementRightShift, i, len, overflowElement, ref, results, scrollbarWidth;
3432
- if (!up.viewport.rootHasVerticalScrollbar()) {
3433
- return;
3434
- }
3435
- body = document.body;
3435
+ var anchor, body, bodyRightPadding, bodyRightShift, elementRight, elementRightShift, i, len, overflowElement, ref, results, rootHadVerticalScrollbar, scrollbarWidth;
3436
+ rootHadVerticalScrollbar = up.viewport.rootHasVerticalScrollbar();
3436
3437
  overflowElement = up.viewport.rootOverflowElement();
3437
- scrollbarWidth = up.viewport.scrollbarWidth();
3438
- bodyRightPadding = e.styleNumber(body, 'paddingRight');
3439
- bodyRightShift = scrollbarWidth + bodyRightPadding;
3440
- this.unshiftFns.push(e.setTemporaryStyle(body, {
3441
- paddingRight: bodyRightShift
3442
- }));
3443
3438
  this.unshiftFns.push(e.setTemporaryStyle(overflowElement, {
3444
3439
  overflowY: 'hidden'
3445
3440
  }));
3446
- ref = up.viewport.anchoredRight();
3447
- results = [];
3448
- for (i = 0, len = ref.length; i < len; i++) {
3449
- anchor = ref[i];
3450
- elementRight = e.styleNumber(anchor, 'right');
3451
- elementRightShift = scrollbarWidth + elementRight;
3452
- results.push(this.unshiftFns.push(e.setTemporaryStyle(anchor, {
3453
- right: elementRightShift
3454
- })));
3441
+ if (rootHadVerticalScrollbar) {
3442
+ body = document.body;
3443
+ scrollbarWidth = up.viewport.scrollbarWidth();
3444
+ bodyRightPadding = e.styleNumber(body, 'paddingRight');
3445
+ bodyRightShift = scrollbarWidth + bodyRightPadding;
3446
+ this.unshiftFns.push(e.setTemporaryStyle(body, {
3447
+ paddingRight: bodyRightShift
3448
+ }));
3449
+ ref = up.viewport.anchoredRight();
3450
+ results = [];
3451
+ for (i = 0, len = ref.length; i < len; i++) {
3452
+ anchor = ref[i];
3453
+ elementRight = e.styleNumber(anchor, 'right');
3454
+ elementRightShift = scrollbarWidth + elementRight;
3455
+ results.push(this.unshiftFns.push(e.setTemporaryStyle(anchor, {
3456
+ right: elementRightShift
3457
+ })));
3458
+ }
3459
+ return results;
3455
3460
  }
3456
- return results;
3457
3461
  };
3458
3462
 
3459
3463
  BodyShifter.prototype.unshift = function() {
@@ -4692,8 +4696,9 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
4692
4696
 
4693
4697
  FollowVariant.prototype.onClick = function(event, link) {
4694
4698
  if (up.link.shouldProcessEvent(event, link)) {
4695
- if (e.matches(link, '[up-instant]')) {
4696
- return up.event.halt(event);
4699
+ if (e.matches(link, '[up-instant]') && link.upInstantSupported) {
4700
+ up.event.halt(event);
4701
+ link.upInstantSupported = false;
4697
4702
  } else {
4698
4703
  up.event.consumeAction(event);
4699
4704
  return this.followLink(link);
@@ -4705,6 +4710,7 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
4705
4710
 
4706
4711
  FollowVariant.prototype.onMousedown = function(event, link) {
4707
4712
  if (up.link.shouldProcessEvent(event, link)) {
4713
+ link.upInstantSupported = true;
4708
4714
  up.event.consumeAction(event);
4709
4715
  return this.followLink(link);
4710
4716
  }
@@ -5356,18 +5362,19 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
5356
5362
  if (u.isMissing(raw)) {
5357
5363
 
5358
5364
  } else if (raw instanceof this.constructor) {
5359
- return (ref = this.entries).push.apply(ref, raw.entries);
5365
+ (ref = this.entries).push.apply(ref, raw.entries);
5360
5366
  } else if (u.isArray(raw)) {
5361
- return (ref1 = this.entries).push.apply(ref1, raw);
5367
+ (ref1 = this.entries).push.apply(ref1, raw);
5362
5368
  } else if (u.isString(raw)) {
5363
- return this.addAllFromQuery(raw);
5369
+ this.addAllFromQuery(raw);
5364
5370
  } else if (u.isFormData(raw)) {
5365
- return this.addAllFromFormData(raw);
5371
+ this.addAllFromFormData(raw);
5366
5372
  } else if (u.isObject(raw)) {
5367
- return this.addAllFromObject(raw);
5373
+ this.addAllFromObject(raw);
5368
5374
  } else {
5369
- return up.fail("Unsupport params type: %o", raw);
5375
+ up.fail("Unsupport params type: %o", raw);
5370
5376
  }
5377
+ return this;
5371
5378
  };
5372
5379
 
5373
5380
  Params.prototype.addAllFromObject = function(object) {
@@ -5965,6 +5972,7 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
5965
5972
  xhrPayload = xhrParams.toFormData();
5966
5973
  }
5967
5974
  pc = up.protocol.config;
5975
+ xhrHeaders[pc.versionHeader] = up.version;
5968
5976
  if (_this.target) {
5969
5977
  xhrHeaders[pc.targetHeader] = _this.target;
5970
5978
  }
@@ -6827,13 +6835,11 @@ It complements [native `Element` methods](https://www.w3schools.com/jsref/dom_ob
6827
6835
  });
6828
6836
  isBooting = false;
6829
6837
  return up.event.onReady(function() {
6830
- return u.task(function() {
6831
- up.emit('up:app:boot', {
6832
- log: 'Booting user application'
6833
- });
6834
- return up.emit('up:app:booted', {
6835
- log: 'User application booted'
6836
- });
6838
+ up.emit('up:app:boot', {
6839
+ log: 'Booting user application'
6840
+ });
6841
+ return up.emit('up:app:booted', {
6842
+ log: 'User application booted'
6837
6843
  });
6838
6844
  });
6839
6845
  } else {
@@ -6960,7 +6966,7 @@ There are some advantages to using `up.on()`:
6960
6966
  for [event delegation](https://davidwalsh.name/event-delegate):
6961
6967
 
6962
6968
  var form = document.querySelector('form')
6963
- document.addEventListener(form, 'click', 'a', function(event, link) {
6969
+ up.on(form, 'click', 'a', function(event, link) {
6964
6970
  console.log("Click on a link %o within %o", link, form)
6965
6971
  })
6966
6972
 
@@ -7572,6 +7578,7 @@ an existing cookie should be deleted.
7572
7578
  Configures strings used in the optional [server protocol](/up.protocol).
7573
7579
 
7574
7580
  @property up.protocol.config
7581
+ @param {String} [config.versionHeader='X-Up-Version']
7575
7582
  @param {String} [config.targetHeader='X-Up-Target']
7576
7583
  @param {String} [config.failTargetHeader='X-Up-Fail-Target']
7577
7584
  @param {String} [config.locationHeader='X-Up-Location']
@@ -7615,6 +7622,7 @@ an existing cookie should be deleted.
7615
7622
  @experimental
7616
7623
  */
7617
7624
  config = new up.Config({
7625
+ versionHeader: 'X-Up-Version',
7618
7626
  targetHeader: 'X-Up-Target',
7619
7627
  failTargetHeader: 'X-Up-Fail-Target',
7620
7628
  locationHeader: 'X-Up-Location',
@@ -7697,12 +7705,15 @@ The output can be configured using the [`up.log.config`](/up.log.config) propert
7697
7705
  prints to the developer console.
7698
7706
  @param {string} [options.prefix='[UP] ']
7699
7707
  A string to prepend to Unpoly's logging messages so you can distinguish it from your own messages.
7708
+ @param {boolean} [options.banner=true]
7709
+ Print the Unpoly banner to the developer console.
7700
7710
  @stable
7701
7711
  */
7702
7712
  config = new up.Config({
7703
7713
  prefix: '[UP] ',
7704
7714
  enabled: sessionStore.get('enabled'),
7705
- collapse: false
7715
+ collapse: false,
7716
+ banner: true
7706
7717
  });
7707
7718
  reset = function() {
7708
7719
  return config.reset();
@@ -7888,6 +7899,9 @@ The output can be configured using the [`up.log.config`](/up.log.config) propert
7888
7899
  };
7889
7900
  printBanner = function() {
7890
7901
  var banner;
7902
+ if (!config.banner) {
7903
+ return;
7904
+ }
7891
7905
  banner = " __ _____ ___ ___ / /_ __\n" + ("/ // / _ \\/ _ \\/ _ \\/ / // / " + up.version + "\n") + "\\___/_//_/ .__/\\___/_/\\_. / \n" + " / / / /\n" + "\n";
7892
7906
  if (config.enabled) {
7893
7907
  banner += "Call `up.log.disable()` to disable logging for this session.";
@@ -7896,7 +7910,7 @@ The output can be configured using the [`up.log.config`](/up.log.config) propert
7896
7910
  }
7897
7911
  return console.log(banner);
7898
7912
  };
7899
- up.on('up:framework:booted', printBanner);
7913
+ up.on('up:app:boot', printBanner);
7900
7914
  up.on('up:framework:reset', reset);
7901
7915
  setEnabled = function(value) {
7902
7916
  sessionStore.set('enabled', value);
@@ -8430,15 +8444,14 @@ or when a matching fragment is [inserted via AJAX](/up.link) later.
8430
8444
  var cleanables;
8431
8445
  cleanables = e.subtree(fragment, '.up-can-clean');
8432
8446
  return u.each(cleanables, function(cleanable) {
8433
- var destructor, destructors, i, len, results;
8434
- if (destructors = cleanable.upDestructors) {
8435
- results = [];
8447
+ var destructor, destructors, i, len;
8448
+ if (destructors = u.pluckKey(cleanable, 'upDestructors')) {
8436
8449
  for (i = 0, len = destructors.length; i < len; i++) {
8437
8450
  destructor = destructors[i];
8438
- results.push(destructor());
8451
+ destructor();
8439
8452
  }
8440
- return results;
8441
8453
  }
8454
+ return cleanable.classList.remove('up-can-clean');
8442
8455
  });
8443
8456
  };
8444
8457
 
@@ -10638,7 +10651,8 @@ is built from `up.fragment` functions. You may use them to extend Unpoly from yo
10638
10651
  @stable
10639
10652
  */
10640
10653
  markElementAsDestroying = function(element) {
10641
- return element.classList.add('up-destroying');
10654
+ element.classList.add('up-destroying');
10655
+ return element.setAttribute('aria-hidden', 'true');
10642
10656
  };
10643
10657
 
10644
10658
  /***
@@ -10834,7 +10848,7 @@ You can define custom animations using [`up.transition()`](/up.transition) and
10834
10848
 
10835
10849
  You can pass additional options:
10836
10850
 
10837
- up.animate('warning', '.fade-in', {
10851
+ up.animate('.warning', 'fade-in', {
10838
10852
  delay: 1000,
10839
10853
  duration: 250,
10840
10854
  easing: 'linear'
@@ -13051,6 +13065,9 @@ open dialogs with sub-forms, etc. all without losing form state.
13051
13065
  If set to `'auto'` (default), Unpoly will try to find a match in the form's layer.
13052
13066
  @param {string} [options.failLayer='auto']
13053
13067
  The name of the layer that ought to be updated if the server sends a non-200 status code.
13068
+ @param {Object|FormData|string|Array|up.Params} [options.params]
13069
+ Extra form [parameters](/up.Params) that will be submitted in addition to
13070
+ the parameters from the form.
13054
13071
  @return {Promise}
13055
13072
  A promise for the successful form submission.
13056
13073
  @stable
@@ -13100,7 +13117,7 @@ open dialogs with sub-forms, etc. all without losing form state.
13100
13117
  if (options.failLayer == null) {
13101
13118
  options.failLayer = form.getAttribute('up-fail-layer');
13102
13119
  }
13103
- options.params = up.Params.fromForm(form);
13120
+ options.params = up.Params.fromForm(form).addAll(options.params);
13104
13121
  options = u.merge(options, up.motion.animateOptions(options, form));
13105
13122
  if (options.validate) {
13106
13123
  options.headers || (options.headers = {});
@@ -13822,6 +13839,15 @@ open dialogs with sub-forms, etc. all without losing form state.
13822
13839
 
13823
13840
  <input name="query" up-observe="showSuggestions(value)">
13824
13841
 
13842
+ Note that the parameter name in the markup must be called `value` or it will not work.
13843
+ The parameter name can be called whatever you want in the JavaScript, however.
13844
+
13845
+ Also note that the function must be declared on the `window` object to work, like so:
13846
+
13847
+ window.showSuggestions = function(selectedValue) {
13848
+ console.log(`Called showSuggestions() with ${selectedValue}`);
13849
+ }
13850
+
13825
13851
  \#\#\# Callback context
13826
13852
 
13827
13853
  The script given to `[up-observe]` runs with the following context:
@@ -14807,6 +14833,7 @@ or function.
14807
14833
  var closeElement, contentElement, dialogStyles, html, modalElement;
14808
14834
  html = templateHtml();
14809
14835
  state.modalElement = modalElement = e.createFromHtml(html);
14836
+ modalElement.setAttribute('aria-modal', 'true');
14810
14837
  modalElement.setAttribute('up-flavor', state.flavor);
14811
14838
  if (u.isPresent(state.position)) {
14812
14839
  modalElement.setAttribute('up-position', state.position);
@@ -15028,6 +15055,9 @@ or function.
15028
15055
  if (options.failLayer == null) {
15029
15056
  options.failLayer = (ref12 = link.getAttribute('up-fail-layer')) != null ? ref12 : 'auto';
15030
15057
  }
15058
+ if (options.cache == null) {
15059
+ options.cache = e.booleanAttr(link, 'up-cache');
15060
+ }
15031
15061
  animateOptions = up.motion.animateOptions(options, link, {
15032
15062
  duration: flavorDefault('openDuration', options.flavor),
15033
15063
  easing: flavorDefault('openEasing', options.flavor)