unpoly-rails 2.7.2.2 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 78ae8255389adf6764d3bb943b4b3f1e5a5d8a31bc7f2ad01799ba683be9ea56
4
- data.tar.gz: b5c00aa016a7a178d855018db1491fa32b45316bd64457704657bf7ad2c98e59
3
+ metadata.gz: 8dd03173a9608fd149bb8169aab86440421c0dc4ce3d3709857cf4196a35c817
4
+ data.tar.gz: a424e2dbb80879bd5d291a627e74b8b75e7c4bd31ca7708287e77792c7f0aead
5
5
  SHA512:
6
- metadata.gz: 30506f67b5ea32e55f66fa3a749e1aaeee0a5fbb5eb62064044288b20da573197f79aa79e6cd4a3bc542c5d9b6c0f948b57a18cc5c004cdce1fdd08b347b7109
7
- data.tar.gz: 797a38f17df02e60213e95d68657f3f838c27a62a962eb6787d13770c38ddbd4e66018a53c62b0fc9db27a0faa6524ede38b54d1d2b306ee86899eaaf40877e7
6
+ metadata.gz: 993b1979ccff04c25fb4ea0b64ca071d25333e858723e560b5f9e9209dc2a4f4c1aa0c7bda6c76b2020c4edcf9f9672743d2f97608327be68e18005303cc2770
7
+ data.tar.gz: d85796e74cf2520c9e7d1f4aea33b14ee25002b5b92fd0d2671fb8d2b5c77ae1a1af4f29e2d3950f593d21e7fbee60c37aafa361d94e379b5116abb772f210a3
data/README.md CHANGED
@@ -5,6 +5,10 @@ unpoly-rails: Ruby on Rails bindings for Unpoly
5
5
 
6
6
  The `unpoly-rails` gem helps integrating Unpoly with [Ruby on Rails](https://rubyonrails.org/) applications.
7
7
 
8
+ This branch tracks the next major version, Unpoly **3.x**.\
9
+ If you're using Unpoly **2.x**, use the [`2.x-stable`](https://github.com/unpoly/unpoly-rails/tree/2.x-stable) branch.\
10
+ If you're using Unpoly **1.x** or **0.x**, use the [`1.x-stable`](https://github.com/unpoly/unpoly/tree/1.x-stable/lib/unpoly/rails) branch in the [`unpoly`](https://github.com/unpoly/unpoly-rails/tree/2.x-stable) repository.
11
+
8
12
 
9
13
  Installing the gem
10
14
  ------------------
@@ -21,9 +25,9 @@ Now run `bundle install` and restart your development server.
21
25
  Installing frontend assets
22
26
  --------------------------
23
27
 
24
- ### With Webpacker
28
+ ### With esbuild or Webpacker
25
29
 
26
- If you're using [Webpacker](https://edgeguides.rubyonrails.org/webpacker.html), install the [`unpoly` npm package](https://unpoly.com/install/npm) to get Unpoly's frontend files.
30
+ If you're using [esbuild](https://esbuild.github.io/) or [Webpacker](https://edgeguides.rubyonrails.org/webpacker.html), install the [`unpoly` npm package](https://unpoly.com/install/npm) to get Unpoly's frontend files.
27
31
 
28
32
  Now `import` Unpoly from your `application.js` pack:
29
33
 
@@ -109,7 +113,7 @@ The frontend will use the server-provided target for both successful (HTTP statu
109
113
 
110
114
  Sometimes it's OK to render nothing, e.g. when you know that the current layer is to be closed.
111
115
 
112
- In this case you may call `up.render_nothing`:
116
+ In this case use `head(:no_content)`:
113
117
 
114
118
  ```ruby
115
119
  class NotesController < ApplicationController
@@ -118,7 +122,7 @@ class NotesController < ApplicationController
118
122
  if @note.save
119
123
  if up.layer.overlay?
120
124
  up.accept_layer(@note.id)
121
- up.render_nothing
125
+ head :no_content
122
126
  else
123
127
  redirect_to @note
124
128
  end
@@ -127,14 +131,6 @@ class NotesController < ApplicationController
127
131
  end
128
132
  ```
129
133
 
130
- This will render a 200 OK response with a header `X-Up-Target: none` and an empty body.
131
-
132
- You may render nothing with a different HTTP status by passing a `:status` option:
133
-
134
- ```ruby
135
- up.render_nothing(status: :bad_request)
136
- ```
137
-
138
134
 
139
135
  ### Pushing a document title to the client
140
136
 
@@ -205,41 +201,39 @@ class UsersController < ApplicationController
205
201
  end
206
202
  ```
207
203
 
208
- ### Detecting a fragment reload
209
-
210
- To test whether the current request was made to [reload](https://unpoly.com/up.reload) or [poll](https://unpoly.com/up-poll) a fragment:
204
+ You may also access the [names of the fields that triggered the validation request](https://unpoly.com/X-Up-Validate):
211
205
 
212
206
  ```ruby
213
- up.reload?
207
+ up.validate_names # => ['email', 'password']
214
208
  ```
215
209
 
216
- You also retrieve the time when the fragment being reloaded was previously inserted into the DOM:
217
210
 
218
- ```ruby
219
- up.reload_from_time # returns a Time object
220
- ```
211
+ ### Detecting a fragment reload
212
+
213
+ When Unpoly [reloads](https://unpoly.com/up.reload) or [polls](https://unpoly.com/up-poll) a fragment, the server will often render the same HTML. You can configure your controller actions to only render HTML if the underlying content changed since an earlier request.
214
+
215
+ Only rendering when needed saves <b>CPU time</b> on your server, which spends most of its response time rendering HTML. This also reduces the <b>bandwidth cost</b> for a request/response exchange to **~1 KB**.
216
+
217
+ When a fragment is reloaded, Unpoly sends an [`If-Modified-Since`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since) request header with the fragment's earlier [`Last-Modified`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified) time. It also sends an [`If-None-Match`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) header with the fragment's earlier [`ETag`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag).
221
218
 
222
- The server can compare the time from the request with the time of the last data update.
223
- If no more recent data is available, the server can [render nothing](/X-Up-Target):
219
+ Rails' [conditional GET support](https://guides.rubyonrails.org/caching_with_rails.html#conditional-get-support) lets you compare and set modification times and ETags with methods like `#fresh_when` or `#stale?`:
224
220
 
225
221
  ```ruby
226
222
  class MessagesController < ApplicationController
227
223
 
228
224
  def index
229
- if up.reload_from_time == current_user.last_message_at
230
- up.render_nothing
231
- else
232
- @messages = current_user.messages.order(time: :desc).to_a
233
- render 'index'
234
- end
225
+ @messages = current_user.messages.order(time: :desc)
226
+
227
+ # If the request's ETag and last modification time matches the given `@messages`,
228
+ # does not render and send a a `304 Not Modified` response.
229
+ # If the request's ETag or last modification time does not match, we will render
230
+ # the `index` view with fresh `ETag` and `Last-Modified` headers.
231
+ fresh_when(@messages)
235
232
  end
236
233
 
237
234
  end
238
235
  ```
239
236
 
240
- Only rendering when needed saves <b>CPU time</b> on your server, which spends most of its response time rendering HTML.
241
-
242
- This also reduces the <b>bandwidth cost</b> for a request/response exchange to **~1 KB**.
243
237
 
244
238
 
245
239
  ### Allowing callbacks with a strict CSP
@@ -374,36 +368,30 @@ Returns whether the layer targeted for a failed response is an overlay.
374
368
  Returns the [context](https://unpoly.com/up.context) object of the layer targeted for a failed response.
375
369
 
376
370
 
377
- ### Managing the client-side cache
371
+ ### Expiring the client-side cache
378
372
 
379
- The Unpoly frontend caches server responses for a few minutes, making requests to these URLs return instantly.
380
- Only `GET` requests are cached. The *entire* cache is cleared after every non-`GET` request (like `POST` or `PUT`).
381
-
382
- The server may override these defaults. For instance, the server can clear Unpoly's client-side response cache, even for `GET` requests:
383
-
384
- ```ruby
385
- up.cache.clear
386
- ```
373
+ The Unpoly frontend [caches server responses](https://unpoly.com/caching) for a few minutes, making requests to these URLs return instantly.
374
+ Only `GET` requests are cached. The entire cache is expired after every non-`GET` request (like `POST` or `PUT`).
387
375
 
388
- You may also clear a single page:
376
+ The server may override these defaults. For instance, the server can expire Unpoly's client-side response cache, even for `GET` requests:
389
377
 
390
378
  ```ruby
391
- up.cache.clear('/notes/1034')
379
+ up.cache.expire
392
380
  ```
393
381
 
394
- You may also clear all entries matching a URL pattern:
382
+ You may also expire a single URL or [URL pattern](https://unpoly.com/url-patterns):
395
383
 
396
384
  ```ruby
397
- up.cache.clear('/notes/*')
385
+ up.cache.expire('/notes/*')
398
386
  ```
399
387
 
400
- You may also prevent cache clearing for an unsafe request:
388
+ You may also prevent cache expiration for an unsafe request:
401
389
 
402
390
  ```ruby
403
- up.cache.keep
391
+ up.cache.expire(false)
404
392
  ```
405
393
 
406
- Here is an longer example where the server uses careful cache management to keep as much of the client-side cache as possible:
394
+ Here is an longer example where the server uses careful cache management to avoid expiring too much of the client-side cache:
407
395
 
408
396
  ```ruby
409
397
  def NotesController < ApplicationController
@@ -411,10 +399,10 @@ def NotesController < ApplicationController
411
399
  def create
412
400
  @note = Note.create!(params[:note].permit(...))
413
401
  if @note.save
414
- up.cache.clear('/notes/*') # Only clear affected entries
402
+ up.cache.expire('/notes/*') # Only expire affected entries
415
403
  redirect_to(@note)
416
404
  else
417
- up.cache.keep # Keep the cache because we haven't saved
405
+ up.cache.expire(false) # Keep the cache fresh because we haven't saved
418
406
  render 'new'
419
407
  end
420
408
  end
@@ -422,12 +410,68 @@ def NotesController < ApplicationController
422
410
  end
423
411
  ```
424
412
 
413
+ ### Evicting pages from the client-side cache
414
+
415
+ Instead of *expiring* pages from the cache you may also *evict*. The difference is that expired pages can still be rendered instantly and are then [revalidated](/caching#revalidation) with the server. Evicted pages are erased from the cache.
416
+
417
+ You may also expire all entries matching an [URL pattern](https://unpoly.com/url-patterns):
418
+
419
+ To evict the entire client-side cache:
420
+
421
+ ```ruby
422
+ up.cache.evict
423
+ ```
425
424
 
426
- ### Preserving Unpoly-related request information through redirects
425
+ You may also evict a single URL or [URL pattern](https://unpoly.com/url-patterns):
426
+
427
+ ```ruby
428
+ up.cache.evict('/notes/*')
429
+ ```
430
+
431
+
432
+ ### Unpoly headers are preserved through redirects
427
433
 
428
434
  `unpoly-rails` patches [`redirect_to`](https://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to)
429
- so Unpoly-related request information (like the CSS selector being targeted for a fragment
430
- update) will be preserved for the action you redirect to.
435
+ so [Unpoly-related request and response headers](https://unpoly.com/up.protocol) are preserved for the action you redirect to.
436
+
437
+
438
+ ### Accessing Unpoly request headers automatically sets a `Vary` response header
439
+
440
+ Accessing [Unpoly-related request headers](https://unpoly.com/up.protocol) through helper methods like `up.target` will automatically add a [`Vary`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary) response header. This is to indicate that the request header influenced the response and the response should be cached separately for each request header value.
441
+
442
+ For example, a controller may access the request's `X-Up-Mode` through the `up.layer.mode` helper:
443
+
444
+ ```ruby
445
+ def create
446
+ # ...
447
+
448
+ if up.layer.mode == 'modal' # Sets Vary header
449
+ up.layer.accept
450
+ else
451
+ redirect_to :show
452
+ end
453
+ end
454
+ ```
455
+
456
+ `unpoly-rails` will automatically add a `Vary` header to the response:
457
+
458
+ ```http
459
+ Vary: X-Up-Mode
460
+ ```
461
+
462
+ There are cases when reading an Unpoly request header does not necessarily influence the response, e.g. for logging. In that cases no `Vary` header should be set. To do so, call the helper method inside an `up.no_vary` block:
463
+
464
+ ```ruby
465
+ up.no_vary do
466
+ Rails.logger.info("Unpoly mode is " + up.layer.mode.inspect) # No Vary header is set
467
+ end
468
+ ````
469
+
470
+ Note that accessing `response.headers[]` directly never sets a `Vary` header:
471
+
472
+ ```ruby
473
+ Rails.logger.info("Unpoly mode is " + response.headers['X-Up-Mode']) # No Vary header is set
474
+ ```
431
475
 
432
476
 
433
477
  ### Automatic redirect detection
@@ -1,8 +1,8 @@
1
- /******/ (function() { // webpackBootstrap
1
+ /******/ (() => { // webpackBootstrap
2
2
  /******/ var __webpack_modules__ = ([
3
3
  /* 0 */,
4
4
  /* 1 */
5
- /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  "use strict";
8
8
  __webpack_require__.r(__webpack_exports__);
@@ -38,29 +38,31 @@ __webpack_require__.r(__webpack_exports__);
38
38
  /******/
39
39
  /************************************************************************/
40
40
  /******/ /* webpack/runtime/make namespace object */
41
- /******/ !function() {
41
+ /******/ (() => {
42
42
  /******/ // define __esModule on exports
43
- /******/ __webpack_require__.r = function(exports) {
43
+ /******/ __webpack_require__.r = (exports) => {
44
44
  /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
45
45
  /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
46
46
  /******/ }
47
47
  /******/ Object.defineProperty(exports, '__esModule', { value: true });
48
48
  /******/ };
49
- /******/ }();
49
+ /******/ })();
50
50
  /******/
51
51
  /************************************************************************/
52
52
  var __webpack_exports__ = {};
53
53
  // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
54
- !function() {
54
+ (() => {
55
55
  up.feedback.config.currentClasses.push('active');
56
56
  up.feedback.config.navSelectors.push('.nav', '.navbar');
57
- up.form.config.validateTargets.unshift('.form-group:has(:origin)');
57
+ up.form.config.groupSelectors.unshift('.form-group');
58
58
  up.viewport.config.fixedTop.push('.navbar-fixed-top');
59
59
  up.viewport.config.fixedBottom.push('.navbar-fixed-bottom');
60
60
  up.viewport.config.anchoredRight.push('.navbar-fixed-top', '.navbar-fixed-bottom');
61
61
  up.fragment.config.badTargetClasses.push('row', /^col(-xs|-sm|-md|-lg)?(-\d+)?$/);
62
+ up.layer.config.foreignOverlaySelectors.push('.modal:not(up-modal)', '.popover:not(up-popup)', '.dropdown-menu:not(up-popup)');
62
63
  __webpack_require__(1);
63
64
 
64
- }();
65
+ })();
66
+
65
67
  /******/ })()
66
68
  ;
@@ -1 +1 @@
1
- !function(){var e={303:function(e,o,t){"use strict";t.r(o)}},o={};function t(r){var n=o[r];if(void 0!==n)return n.exports;var i=o[r]={exports:{}};return e[r](i,i.exports,t),i.exports}t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.form.config.validateTargets.unshift(".form-group:has(:origin)"),up.viewport.config.fixedTop.push(".navbar-fixed-top"),up.viewport.config.fixedBottom.push(".navbar-fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar-fixed-top",".navbar-fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg)?(-\d+)?$/),t(303)}();
1
+ (()=>{var o={303:(o,e,r)=>{"use strict";r.r(e)}},e={};function r(p){var t=e[p];if(void 0!==t)return t.exports;var n=e[p]={exports:{}};return o[p](n,n.exports,r),n.exports}r.r=o=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.form.config.groupSelectors.unshift(".form-group"),up.viewport.config.fixedTop.push(".navbar-fixed-top"),up.viewport.config.fixedBottom.push(".navbar-fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar-fixed-top",".navbar-fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg)?(-\d+)?$/),up.layer.config.foreignOverlaySelectors.push(".modal:not(up-modal)",".popover:not(up-popup)",".dropdown-menu:not(up-popup)"),r(303)})();
@@ -1,8 +1,8 @@
1
- /******/ (function() { // webpackBootstrap
1
+ /******/ (() => { // webpackBootstrap
2
2
  /******/ var __webpack_modules__ = ([
3
3
  /* 0 */,
4
4
  /* 1 */
5
- /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  "use strict";
8
8
  __webpack_require__.r(__webpack_exports__);
@@ -38,29 +38,31 @@ __webpack_require__.r(__webpack_exports__);
38
38
  /******/
39
39
  /************************************************************************/
40
40
  /******/ /* webpack/runtime/make namespace object */
41
- /******/ !function() {
41
+ /******/ (() => {
42
42
  /******/ // define __esModule on exports
43
- /******/ __webpack_require__.r = function(exports) {
43
+ /******/ __webpack_require__.r = (exports) => {
44
44
  /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
45
45
  /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
46
46
  /******/ }
47
47
  /******/ Object.defineProperty(exports, '__esModule', { value: true });
48
48
  /******/ };
49
- /******/ }();
49
+ /******/ })();
50
50
  /******/
51
51
  /************************************************************************/
52
52
  var __webpack_exports__ = {};
53
53
  // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
54
- !function() {
54
+ (() => {
55
55
  up.feedback.config.currentClasses.push('active');
56
56
  up.feedback.config.navSelectors.push('.nav', '.navbar');
57
- up.form.config.validateTargets.unshift('.form-group:has(:origin)');
57
+ up.form.config.groupSelectors.unshift('.form-group');
58
58
  up.viewport.config.fixedTop.push('.navbar.fixed-top');
59
59
  up.viewport.config.fixedBottom.push('.navbar.fixed-bottom');
60
60
  up.viewport.config.anchoredRight.push('.navbar.fixed-top', '.navbar.fixed-bottom');
61
61
  up.fragment.config.badTargetClasses.push('row', /^col(-xs|-sm|-md|-lg|-xl)?(-\d+)?$/, /^[mp][tblrxy]?-\d+$/);
62
+ up.layer.config.foreignOverlaySelectors.push('.modal:not(up-modal)', '.popover:not(up-popup)', '.dropdown-menu:not(up-popup)');
62
63
  __webpack_require__(1);
63
64
 
64
- }();
65
+ })();
66
+
65
67
  /******/ })()
66
68
  ;
@@ -1 +1 @@
1
- !function(){var e={79:function(e,o,t){"use strict";t.r(o)}},o={};function t(r){var n=o[r];if(void 0!==n)return n.exports;var i=o[r]={exports:{}};return e[r](i,i.exports,t),i.exports}t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.form.config.validateTargets.unshift(".form-group:has(:origin)"),up.viewport.config.fixedTop.push(".navbar.fixed-top"),up.viewport.config.fixedBottom.push(".navbar.fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar.fixed-top",".navbar.fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg|-xl)?(-\d+)?$/,/^[mp][tblrxy]?-\d+$/),t(79)}();
1
+ (()=>{var o={79:(o,e,r)=>{"use strict";r.r(e)}},e={};function r(p){var t=e[p];if(void 0!==t)return t.exports;var n=e[p]={exports:{}};return o[p](n,n.exports,r),n.exports}r.r=o=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.form.config.groupSelectors.unshift(".form-group"),up.viewport.config.fixedTop.push(".navbar.fixed-top"),up.viewport.config.fixedBottom.push(".navbar.fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar.fixed-top",".navbar.fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg|-xl)?(-\d+)?$/,/^[mp][tblrxy]?-\d+$/),up.layer.config.foreignOverlaySelectors.push(".modal:not(up-modal)",".popover:not(up-popup)",".dropdown-menu:not(up-popup)"),r(79)})();
@@ -1,8 +1,8 @@
1
- /******/ (function() { // webpackBootstrap
1
+ /******/ (() => { // webpackBootstrap
2
2
  /******/ var __webpack_modules__ = ([
3
3
  /* 0 */,
4
4
  /* 1 */
5
- /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  "use strict";
8
8
  __webpack_require__.r(__webpack_exports__);
@@ -38,28 +38,30 @@ __webpack_require__.r(__webpack_exports__);
38
38
  /******/
39
39
  /************************************************************************/
40
40
  /******/ /* webpack/runtime/make namespace object */
41
- /******/ !function() {
41
+ /******/ (() => {
42
42
  /******/ // define __esModule on exports
43
- /******/ __webpack_require__.r = function(exports) {
43
+ /******/ __webpack_require__.r = (exports) => {
44
44
  /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
45
45
  /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
46
46
  /******/ }
47
47
  /******/ Object.defineProperty(exports, '__esModule', { value: true });
48
48
  /******/ };
49
- /******/ }();
49
+ /******/ })();
50
50
  /******/
51
51
  /************************************************************************/
52
52
  var __webpack_exports__ = {};
53
53
  // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
54
- !function() {
54
+ (() => {
55
55
  up.feedback.config.currentClasses.push('active');
56
56
  up.feedback.config.navSelectors.push('.nav', '.navbar');
57
57
  up.viewport.config.fixedTop.push('.navbar.fixed-top');
58
58
  up.viewport.config.fixedBottom.push('.navbar.fixed-bottom');
59
59
  up.viewport.config.anchoredRight.push('.navbar.fixed-top', '.navbar.fixed-bottom');
60
60
  up.fragment.config.badTargetClasses.push('row', /^col(-xs|-sm|-md|-lg|-xl|-xxl)?(-\d+)?$/, /^[mp][tbsexy]?-\d+$/);
61
+ up.layer.config.foreignOverlaySelectors.push('.modal:not(up-modal)', '.popover:not(up-popup)', '.dropdown-menu:not(up-popup)');
61
62
  __webpack_require__(1);
62
63
 
63
- }();
64
+ })();
65
+
64
66
  /******/ })()
65
67
  ;
@@ -1 +1 @@
1
- !function(){var e={313:function(e,o,t){"use strict";t.r(o)}},o={};function t(r){var n=o[r];if(void 0!==n)return n.exports;var i=o[r]={exports:{}};return e[r](i,i.exports,t),i.exports}t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.viewport.config.fixedTop.push(".navbar.fixed-top"),up.viewport.config.fixedBottom.push(".navbar.fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar.fixed-top",".navbar.fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg|-xl|-xxl)?(-\d+)?$/,/^[mp][tbsexy]?-\d+$/),t(313)}();
1
+ (()=>{var e={313:(e,o,r)=>{"use strict";r.r(o)}},o={};function r(p){var t=o[p];if(void 0!==t)return t.exports;var n=o[p]={exports:{}};return e[p](n,n.exports,r),n.exports}r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},up.feedback.config.currentClasses.push("active"),up.feedback.config.navSelectors.push(".nav",".navbar"),up.viewport.config.fixedTop.push(".navbar.fixed-top"),up.viewport.config.fixedBottom.push(".navbar.fixed-bottom"),up.viewport.config.anchoredRight.push(".navbar.fixed-top",".navbar.fixed-bottom"),up.fragment.config.badTargetClasses.push("row",/^col(-xs|-sm|-md|-lg|-xl|-xxl)?(-\d+)?$/,/^[mp][tbsexy]?-\d+$/),up.layer.config.foreignOverlaySelectors.push(".modal:not(up-modal)",".popover:not(up-popup)",".dropdown-menu:not(up-popup)"),r(313)})();