swup 2.0.16 → 2.0.19

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.
package/dist/swup.js CHANGED
@@ -91,7 +91,7 @@ return /******/ (function(modules) { // webpackBootstrap
91
91
  /******/
92
92
  /******/
93
93
  /******/ // Load entry module and return exports
94
- /******/ return __webpack_require__(__webpack_require__.s = 2);
94
+ /******/ return __webpack_require__(__webpack_require__.s = 3);
95
95
  /******/ })
96
96
  /************************************************************************/
97
97
  /******/ ([
@@ -101,6 +101,76 @@ return /******/ (function(modules) { // webpackBootstrap
101
101
  "use strict";
102
102
 
103
103
 
104
+ Object.defineProperty(exports, "__esModule", {
105
+ value: true
106
+ });
107
+ exports.cleanupAnimationClasses = exports.Link = exports.markSwupElements = exports.normalizeUrl = exports.getCurrentUrl = exports.transitionProperty = exports.transitionEnd = exports.fetch = exports.getDataFromHtml = exports.createHistoryRecord = exports.classify = undefined;
108
+
109
+ var _classify = __webpack_require__(7);
110
+
111
+ var _classify2 = _interopRequireDefault(_classify);
112
+
113
+ var _createHistoryRecord = __webpack_require__(8);
114
+
115
+ var _createHistoryRecord2 = _interopRequireDefault(_createHistoryRecord);
116
+
117
+ var _getDataFromHtml = __webpack_require__(9);
118
+
119
+ var _getDataFromHtml2 = _interopRequireDefault(_getDataFromHtml);
120
+
121
+ var _fetch = __webpack_require__(10);
122
+
123
+ var _fetch2 = _interopRequireDefault(_fetch);
124
+
125
+ var _transitionEnd = __webpack_require__(11);
126
+
127
+ var _transitionEnd2 = _interopRequireDefault(_transitionEnd);
128
+
129
+ var _transitionProperty = __webpack_require__(12);
130
+
131
+ var _transitionProperty2 = _interopRequireDefault(_transitionProperty);
132
+
133
+ var _getCurrentUrl = __webpack_require__(13);
134
+
135
+ var _getCurrentUrl2 = _interopRequireDefault(_getCurrentUrl);
136
+
137
+ var _normalizeUrl = __webpack_require__(14);
138
+
139
+ var _normalizeUrl2 = _interopRequireDefault(_normalizeUrl);
140
+
141
+ var _markSwupElements = __webpack_require__(15);
142
+
143
+ var _markSwupElements2 = _interopRequireDefault(_markSwupElements);
144
+
145
+ var _Link = __webpack_require__(2);
146
+
147
+ var _Link2 = _interopRequireDefault(_Link);
148
+
149
+ var _cleanupAnimationClasses = __webpack_require__(16);
150
+
151
+ var _cleanupAnimationClasses2 = _interopRequireDefault(_cleanupAnimationClasses);
152
+
153
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
154
+
155
+ var classify = exports.classify = _classify2.default;
156
+ var createHistoryRecord = exports.createHistoryRecord = _createHistoryRecord2.default;
157
+ var getDataFromHtml = exports.getDataFromHtml = _getDataFromHtml2.default;
158
+ var fetch = exports.fetch = _fetch2.default;
159
+ var transitionEnd = exports.transitionEnd = _transitionEnd2.default;
160
+ var transitionProperty = exports.transitionProperty = _transitionProperty2.default;
161
+ var getCurrentUrl = exports.getCurrentUrl = _getCurrentUrl2.default;
162
+ var normalizeUrl = exports.normalizeUrl = _normalizeUrl2.default;
163
+ var markSwupElements = exports.markSwupElements = _markSwupElements2.default;
164
+ var Link = exports.Link = _Link2.default;
165
+ var cleanupAnimationClasses = exports.cleanupAnimationClasses = _cleanupAnimationClasses2.default;
166
+
167
+ /***/ }),
168
+ /* 1 */
169
+ /***/ (function(module, exports, __webpack_require__) {
170
+
171
+ "use strict";
172
+
173
+
104
174
  Object.defineProperty(exports, "__esModule", {
105
175
  value: true
106
176
  });
@@ -133,68 +203,75 @@ var escapeCssIdentifier = exports.escapeCssIdentifier = function escapeCssIdenti
133
203
  };
134
204
 
135
205
  /***/ }),
136
- /* 1 */
206
+ /* 2 */
137
207
  /***/ (function(module, exports, __webpack_require__) {
138
208
 
139
209
  "use strict";
140
210
 
141
211
 
142
212
  Object.defineProperty(exports, "__esModule", {
143
- value: true
213
+ value: true
144
214
  });
145
- exports.Link = exports.markSwupElements = exports.getCurrentUrl = exports.transitionEnd = exports.fetch = exports.getDataFromHtml = exports.createHistoryRecord = exports.classify = undefined;
146
-
147
- var _classify = __webpack_require__(7);
148
215
 
149
- var _classify2 = _interopRequireDefault(_classify);
150
-
151
- var _createHistoryRecord = __webpack_require__(8);
152
-
153
- var _createHistoryRecord2 = _interopRequireDefault(_createHistoryRecord);
154
-
155
- var _getDataFromHtml = __webpack_require__(9);
156
-
157
- var _getDataFromHtml2 = _interopRequireDefault(_getDataFromHtml);
158
-
159
- var _fetch = __webpack_require__(10);
160
-
161
- var _fetch2 = _interopRequireDefault(_fetch);
162
-
163
- var _transitionEnd = __webpack_require__(11);
164
-
165
- var _transitionEnd2 = _interopRequireDefault(_transitionEnd);
216
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
166
217
 
167
- var _getCurrentUrl = __webpack_require__(12);
218
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
168
219
 
169
- var _getCurrentUrl2 = _interopRequireDefault(_getCurrentUrl);
220
+ var Link = function () {
221
+ function Link(elementOrUrl) {
222
+ _classCallCheck(this, Link);
170
223
 
171
- var _markSwupElements = __webpack_require__(13);
224
+ if (elementOrUrl instanceof Element || elementOrUrl instanceof SVGElement) {
225
+ this.link = elementOrUrl;
226
+ } else {
227
+ this.link = document.createElement('a');
228
+ this.link.href = elementOrUrl;
229
+ }
230
+ }
172
231
 
173
- var _markSwupElements2 = _interopRequireDefault(_markSwupElements);
232
+ _createClass(Link, [{
233
+ key: 'getPath',
234
+ value: function getPath() {
235
+ var path = this.link.pathname;
236
+ if (path[0] !== '/') {
237
+ path = '/' + path;
238
+ }
239
+ return path;
240
+ }
241
+ }, {
242
+ key: 'getAddress',
243
+ value: function getAddress() {
244
+ var path = this.link.pathname + this.link.search;
174
245
 
175
- var _Link = __webpack_require__(14);
246
+ if (this.link.getAttribute('xlink:href')) {
247
+ path = this.link.getAttribute('xlink:href');
248
+ }
176
249
 
177
- var _Link2 = _interopRequireDefault(_Link);
250
+ if (path[0] !== '/') {
251
+ path = '/' + path;
252
+ }
253
+ return path;
254
+ }
255
+ }, {
256
+ key: 'getHash',
257
+ value: function getHash() {
258
+ return this.link.hash;
259
+ }
260
+ }]);
178
261
 
179
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
262
+ return Link;
263
+ }();
180
264
 
181
- var classify = exports.classify = _classify2.default;
182
- var createHistoryRecord = exports.createHistoryRecord = _createHistoryRecord2.default;
183
- var getDataFromHtml = exports.getDataFromHtml = _getDataFromHtml2.default;
184
- var fetch = exports.fetch = _fetch2.default;
185
- var transitionEnd = exports.transitionEnd = _transitionEnd2.default;
186
- var getCurrentUrl = exports.getCurrentUrl = _getCurrentUrl2.default;
187
- var markSwupElements = exports.markSwupElements = _markSwupElements2.default;
188
- var Link = exports.Link = _Link2.default;
265
+ exports.default = Link;
189
266
 
190
267
  /***/ }),
191
- /* 2 */
268
+ /* 3 */
192
269
  /***/ (function(module, exports, __webpack_require__) {
193
270
 
194
271
  "use strict";
195
272
 
196
273
 
197
- var _index = __webpack_require__(3);
274
+ var _index = __webpack_require__(4);
198
275
 
199
276
  var _index2 = _interopRequireDefault(_index);
200
277
 
@@ -203,7 +280,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
203
280
  module.exports = _index2.default; // this is here for webpack to expose Swup as window.Swup
204
281
 
205
282
  /***/ }),
206
- /* 3 */
283
+ /* 4 */
207
284
  /***/ (function(module, exports, __webpack_require__) {
208
285
 
209
286
  "use strict";
@@ -220,55 +297,55 @@ var _createClass = function () { function defineProperties(target, props) { for
220
297
  // modules
221
298
 
222
299
 
223
- var _delegateIt = __webpack_require__(4);
300
+ var _delegateIt = __webpack_require__(5);
224
301
 
225
302
  var _delegateIt2 = _interopRequireDefault(_delegateIt);
226
303
 
227
- var _Cache = __webpack_require__(5);
304
+ var _Cache = __webpack_require__(6);
228
305
 
229
306
  var _Cache2 = _interopRequireDefault(_Cache);
230
307
 
231
- var _loadPage = __webpack_require__(6);
308
+ var _loadPage = __webpack_require__(17);
232
309
 
233
310
  var _loadPage2 = _interopRequireDefault(_loadPage);
234
311
 
235
- var _renderPage = __webpack_require__(15);
312
+ var _renderPage = __webpack_require__(18);
236
313
 
237
314
  var _renderPage2 = _interopRequireDefault(_renderPage);
238
315
 
239
- var _triggerEvent = __webpack_require__(16);
316
+ var _triggerEvent = __webpack_require__(19);
240
317
 
241
318
  var _triggerEvent2 = _interopRequireDefault(_triggerEvent);
242
319
 
243
- var _on = __webpack_require__(17);
320
+ var _on = __webpack_require__(20);
244
321
 
245
322
  var _on2 = _interopRequireDefault(_on);
246
323
 
247
- var _off = __webpack_require__(18);
324
+ var _off = __webpack_require__(21);
248
325
 
249
326
  var _off2 = _interopRequireDefault(_off);
250
327
 
251
- var _updateTransition = __webpack_require__(19);
328
+ var _updateTransition = __webpack_require__(22);
252
329
 
253
330
  var _updateTransition2 = _interopRequireDefault(_updateTransition);
254
331
 
255
- var _getAnchorElement = __webpack_require__(20);
332
+ var _getAnchorElement = __webpack_require__(23);
256
333
 
257
334
  var _getAnchorElement2 = _interopRequireDefault(_getAnchorElement);
258
335
 
259
- var _getAnimationPromises = __webpack_require__(21);
336
+ var _getAnimationPromises = __webpack_require__(24);
260
337
 
261
338
  var _getAnimationPromises2 = _interopRequireDefault(_getAnimationPromises);
262
339
 
263
- var _getPageData = __webpack_require__(22);
340
+ var _getPageData = __webpack_require__(25);
264
341
 
265
342
  var _getPageData2 = _interopRequireDefault(_getPageData);
266
343
 
267
- var _plugins = __webpack_require__(23);
344
+ var _plugins = __webpack_require__(26);
268
345
 
269
- var _utils = __webpack_require__(0);
346
+ var _utils = __webpack_require__(1);
270
347
 
271
- var _helpers = __webpack_require__(1);
348
+ var _helpers = __webpack_require__(0);
272
349
 
273
350
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
274
351
 
@@ -353,6 +430,8 @@ var Swup = function () {
353
430
  this.use = _plugins.use;
354
431
  this.unuse = _plugins.unuse;
355
432
  this.findPlugin = _plugins.findPlugin;
433
+ this.getCurrentUrl = _helpers.getCurrentUrl;
434
+ this.cleanupAnimationClasses = _helpers.cleanupAnimationClasses;
356
435
 
357
436
  // enable swup
358
437
  this.enable();
@@ -374,11 +453,11 @@ var Swup = function () {
374
453
  window.addEventListener('popstate', this.boundPopStateHandler);
375
454
 
376
455
  // initial save to cache
377
- var page = (0, _helpers.getDataFromHtml)(document.documentElement.outerHTML, this.options.containers);
378
- page.url = page.responseURL = (0, _helpers.getCurrentUrl)();
379
- if (this.options.cache) {
380
- this.cache.cacheUrl(page);
381
- }
456
+ if (this.options.cache) {}
457
+ // disabled to avoid caching modified dom state
458
+ // https://github.com/swup/swup/issues/475
459
+ // logic moved to preload plugin
460
+
382
461
 
383
462
  // mark swup blocks in html
384
463
  (0, _helpers.markSwupElements)(document.documentElement, this.options.containers);
@@ -496,6 +575,12 @@ var Swup = function () {
496
575
  event.preventDefault();
497
576
  }
498
577
  this.triggerEvent('popState', event);
578
+
579
+ if (!this.options.animateHistoryBrowsing) {
580
+ document.documentElement.classList.remove('is-animating');
581
+ (0, _helpers.cleanupAnimationClasses)();
582
+ }
583
+
499
584
  this.loadPage({ url: link.getAddress() }, event);
500
585
  }
501
586
  }]);
@@ -506,7 +591,7 @@ var Swup = function () {
506
591
  exports.default = Swup;
507
592
 
508
593
  /***/ }),
509
- /* 4 */
594
+ /* 5 */
510
595
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
511
596
 
512
597
  "use strict";
@@ -599,7 +684,7 @@ function delegate(base, selector, type, callback, options) {
599
684
 
600
685
 
601
686
  /***/ }),
602
- /* 5 */
687
+ /* 6 */
603
688
  /***/ (function(module, exports, __webpack_require__) {
604
689
 
605
690
  "use strict";
@@ -608,9 +693,12 @@ function delegate(base, selector, type, callback, options) {
608
693
  Object.defineProperty(exports, "__esModule", {
609
694
  value: true
610
695
  });
696
+ exports.Cache = undefined;
611
697
 
612
698
  var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
613
699
 
700
+ var _helpers = __webpack_require__(0);
701
+
614
702
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
615
703
 
616
704
  var Cache = exports.Cache = function () {
@@ -624,6 +712,7 @@ var Cache = exports.Cache = function () {
624
712
  _createClass(Cache, [{
625
713
  key: 'cacheUrl',
626
714
  value: function cacheUrl(page) {
715
+ page.url = (0, _helpers.normalizeUrl)(page.url);
627
716
  if (page.url in this.pages === false) {
628
717
  this.pages[page.url] = page;
629
718
  }
@@ -633,16 +722,18 @@ var Cache = exports.Cache = function () {
633
722
  }, {
634
723
  key: 'getPage',
635
724
  value: function getPage(url) {
725
+ url = (0, _helpers.normalizeUrl)(url);
636
726
  return this.pages[url];
637
727
  }
638
728
  }, {
639
729
  key: 'getCurrentPage',
640
730
  value: function getCurrentPage() {
641
- return this.getPage(window.location.pathname + window.location.search);
731
+ return this.getPage((0, _helpers.getCurrentUrl)());
642
732
  }
643
733
  }, {
644
734
  key: 'exists',
645
735
  value: function exists(url) {
736
+ url = (0, _helpers.normalizeUrl)(url);
646
737
  return url in this.pages;
647
738
  }
648
739
  }, {
@@ -664,130 +755,6 @@ var Cache = exports.Cache = function () {
664
755
 
665
756
  exports.default = Cache;
666
757
 
667
- /***/ }),
668
- /* 6 */
669
- /***/ (function(module, exports, __webpack_require__) {
670
-
671
- "use strict";
672
-
673
-
674
- Object.defineProperty(exports, "__esModule", {
675
- value: true
676
- });
677
-
678
- var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
679
-
680
- var _helpers = __webpack_require__(1);
681
-
682
- var loadPage = function loadPage(data, popstate) {
683
- var _this = this;
684
-
685
- // create array for storing animation promises
686
- var animationPromises = [],
687
- xhrPromise = void 0;
688
- var animateOut = function animateOut() {
689
- _this.triggerEvent('animationOutStart');
690
-
691
- // handle classes
692
- document.documentElement.classList.add('is-changing');
693
- document.documentElement.classList.add('is-leaving');
694
- document.documentElement.classList.add('is-animating');
695
- if (popstate) {
696
- document.documentElement.classList.add('is-popstate');
697
- }
698
- document.documentElement.classList.add('to-' + (0, _helpers.classify)(data.url));
699
-
700
- // animation promise stuff
701
- animationPromises = _this.getAnimationPromises('out');
702
- Promise.all(animationPromises).then(function () {
703
- _this.triggerEvent('animationOutDone');
704
- });
705
-
706
- // create history record if this is not a popstate call
707
- if (!popstate) {
708
- // create pop element with or without anchor
709
- var state = void 0;
710
- if (_this.scrollToElement != null) {
711
- state = data.url + _this.scrollToElement;
712
- } else {
713
- state = data.url;
714
- }
715
-
716
- (0, _helpers.createHistoryRecord)(state);
717
- }
718
- };
719
-
720
- this.triggerEvent('transitionStart', popstate);
721
-
722
- // set transition object
723
- if (data.customTransition != null) {
724
- this.updateTransition(window.location.pathname, data.url, data.customTransition);
725
- document.documentElement.classList.add('to-' + (0, _helpers.classify)(data.customTransition));
726
- } else {
727
- this.updateTransition(window.location.pathname, data.url);
728
- }
729
-
730
- // start/skip animation
731
- if (!popstate || this.options.animateHistoryBrowsing) {
732
- animateOut();
733
- } else {
734
- this.triggerEvent('animationSkipped');
735
- }
736
-
737
- // start/skip loading of page
738
- if (this.cache.exists(data.url)) {
739
- xhrPromise = new Promise(function (resolve) {
740
- resolve();
741
- });
742
- this.triggerEvent('pageRetrievedFromCache');
743
- } else {
744
- if (!this.preloadPromise || this.preloadPromise.route != data.url) {
745
- xhrPromise = new Promise(function (resolve, reject) {
746
- (0, _helpers.fetch)(_extends({}, data, { headers: _this.options.requestHeaders }), function (response) {
747
- if (response.status === 500) {
748
- _this.triggerEvent('serverError');
749
- reject(data.url);
750
- return;
751
- } else {
752
- // get json data
753
- var page = _this.getPageData(response);
754
- if (page != null) {
755
- page.url = data.url;
756
- } else {
757
- reject(data.url);
758
- return;
759
- }
760
- // render page
761
- _this.cache.cacheUrl(page);
762
- _this.triggerEvent('pageLoaded');
763
- }
764
- resolve();
765
- });
766
- });
767
- } else {
768
- xhrPromise = this.preloadPromise;
769
- }
770
- }
771
-
772
- // when everything is ready, handle the outcome
773
- Promise.all(animationPromises.concat([xhrPromise])).then(function () {
774
- // render page
775
- _this.renderPage(_this.cache.getPage(data.url), popstate);
776
- _this.preloadPromise = null;
777
- }).catch(function (errorUrl) {
778
- // rewrite the skipPopStateHandling function to redirect manually when the history.go is processed
779
- _this.options.skipPopStateHandling = function () {
780
- window.location = errorUrl;
781
- return true;
782
- };
783
-
784
- // go back to the actual page were still at
785
- window.history.go(-1);
786
- });
787
- };
788
-
789
- exports.default = loadPage;
790
-
791
758
  /***/ }),
792
759
  /* 7 */
793
760
  /***/ (function(module, exports, __webpack_require__) {
@@ -827,7 +794,7 @@ var createHistoryRecord = function createHistoryRecord(url) {
827
794
  url: url || window.location.href.split(window.location.hostname)[1],
828
795
  random: Math.random(),
829
796
  source: 'swup'
830
- }, document.getElementsByTagName('title')[0].innerText, url || window.location.href.split(window.location.hostname)[1]);
797
+ }, document.title, url || window.location.href.split(window.location.hostname)[1]);
831
798
  };
832
799
 
833
800
  exports.default = createHistoryRecord;
@@ -843,37 +810,30 @@ Object.defineProperty(exports, "__esModule", {
843
810
  value: true
844
811
  });
845
812
 
846
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
847
-
848
- var _utils = __webpack_require__(0);
813
+ var _utils = __webpack_require__(1);
849
814
 
850
815
  var getDataFromHtml = function getDataFromHtml(html, containers) {
851
816
  var fakeDom = document.createElement('html');
852
817
  fakeDom.innerHTML = html;
853
818
  var blocks = [];
854
819
 
855
- var _loop = function _loop(i) {
856
- if (fakeDom.querySelector(containers[i]) == null) {
857
- // page in invalid
858
- return {
859
- v: null
860
- };
820
+ containers.forEach(function (selector) {
821
+ if ((0, _utils.query)(selector, fakeDom) == null) {
822
+ console.warn('[swup] Container ' + selector + ' not found on page.');
823
+ return null;
861
824
  } else {
862
- (0, _utils.queryAll)(containers[i]).forEach(function (item, index) {
863
- (0, _utils.queryAll)(containers[i], fakeDom)[index].setAttribute('data-swup', blocks.length); // marks element with data-swup
864
- blocks.push((0, _utils.queryAll)(containers[i], fakeDom)[index].outerHTML);
825
+ if ((0, _utils.queryAll)(selector).length !== (0, _utils.queryAll)(selector, fakeDom).length) {
826
+ console.warn('[swup] Mismatched number of containers found on new page.');
827
+ }
828
+ (0, _utils.queryAll)(selector).forEach(function (item, index) {
829
+ (0, _utils.queryAll)(selector, fakeDom)[index].setAttribute('data-swup', blocks.length);
830
+ blocks.push((0, _utils.queryAll)(selector, fakeDom)[index].outerHTML);
865
831
  });
866
832
  }
867
- };
868
-
869
- for (var i = 0; i < containers.length; i++) {
870
- var _ret = _loop(i);
871
-
872
- if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
873
- }
833
+ });
874
834
 
875
835
  var json = {
876
- title: fakeDom.querySelector('title').innerText,
836
+ title: (fakeDom.querySelector('title') || {}).innerText,
877
837
  pageClass: fakeDom.querySelector('body').className,
878
838
  originalContent: html,
879
839
  blocks: blocks
@@ -946,22 +906,11 @@ Object.defineProperty(exports, "__esModule", {
946
906
  value: true
947
907
  });
948
908
  var transitionEnd = function transitionEnd() {
949
- var el = document.createElement('div');
950
-
951
- var transEndEventNames = {
952
- WebkitTransition: 'webkitTransitionEnd',
953
- MozTransition: 'transitionend',
954
- OTransition: 'oTransitionEnd otransitionend',
955
- transition: 'transitionend'
956
- };
957
-
958
- for (var name in transEndEventNames) {
959
- if (el.style[name] !== undefined) {
960
- return transEndEventNames[name];
961
- }
909
+ if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {
910
+ return 'webkitTransitionEnd';
911
+ } else {
912
+ return 'transitionend';
962
913
  }
963
-
964
- return false;
965
914
  };
966
915
 
967
916
  exports.default = transitionEnd;
@@ -973,6 +922,26 @@ exports.default = transitionEnd;
973
922
  "use strict";
974
923
 
975
924
 
925
+ Object.defineProperty(exports, "__esModule", {
926
+ value: true
927
+ });
928
+ var transitionProperty = function transitionProperty() {
929
+ if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {
930
+ return 'WebkitTransition';
931
+ } else {
932
+ return 'transition';
933
+ }
934
+ };
935
+
936
+ exports.default = transitionProperty;
937
+
938
+ /***/ }),
939
+ /* 13 */
940
+ /***/ (function(module, exports, __webpack_require__) {
941
+
942
+ "use strict";
943
+
944
+
976
945
  Object.defineProperty(exports, "__esModule", {
977
946
  value: true
978
947
  });
@@ -983,7 +952,7 @@ var getCurrentUrl = function getCurrentUrl() {
983
952
  exports.default = getCurrentUrl;
984
953
 
985
954
  /***/ }),
986
- /* 13 */
955
+ /* 14 */
987
956
  /***/ (function(module, exports, __webpack_require__) {
988
957
 
989
958
  "use strict";
@@ -993,31 +962,50 @@ Object.defineProperty(exports, "__esModule", {
993
962
  value: true
994
963
  });
995
964
 
996
- var _utils = __webpack_require__(0);
965
+ var _Link = __webpack_require__(2);
966
+
967
+ var _Link2 = _interopRequireDefault(_Link);
968
+
969
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
970
+
971
+ var normalizeUrl = function normalizeUrl(url) {
972
+ return new _Link2.default(url).getAddress();
973
+ };
974
+
975
+ exports.default = normalizeUrl;
976
+
977
+ /***/ }),
978
+ /* 15 */
979
+ /***/ (function(module, exports, __webpack_require__) {
980
+
981
+ "use strict";
982
+
983
+
984
+ Object.defineProperty(exports, "__esModule", {
985
+ value: true
986
+ });
987
+
988
+ var _utils = __webpack_require__(1);
997
989
 
998
990
  var markSwupElements = function markSwupElements(element, containers) {
999
991
  var blocks = 0;
1000
992
 
1001
- var _loop = function _loop(i) {
1002
- if (element.querySelector(containers[i]) == null) {
1003
- console.warn('Element ' + containers[i] + ' is not in current page.');
993
+ containers.forEach(function (selector) {
994
+ if ((0, _utils.query)(selector, element) == null) {
995
+ console.warn('[swup] Container ' + selector + ' not found on page.');
1004
996
  } else {
1005
- (0, _utils.queryAll)(containers[i]).forEach(function (item, index) {
1006
- (0, _utils.queryAll)(containers[i], element)[index].setAttribute('data-swup', blocks);
997
+ (0, _utils.queryAll)(selector).forEach(function (item, index) {
998
+ (0, _utils.queryAll)(selector, element)[index].setAttribute('data-swup', blocks);
1007
999
  blocks++;
1008
1000
  });
1009
1001
  }
1010
- };
1011
-
1012
- for (var i = 0; i < containers.length; i++) {
1013
- _loop(i);
1014
- }
1002
+ });
1015
1003
  };
1016
1004
 
1017
1005
  exports.default = markSwupElements;
1018
1006
 
1019
1007
  /***/ }),
1020
- /* 14 */
1008
+ /* 16 */
1021
1009
  /***/ (function(module, exports, __webpack_require__) {
1022
1010
 
1023
1011
  "use strict";
@@ -1026,60 +1014,151 @@ exports.default = markSwupElements;
1026
1014
  Object.defineProperty(exports, "__esModule", {
1027
1015
  value: true
1028
1016
  });
1017
+ var cleanupAnimationClasses = function cleanupAnimationClasses() {
1018
+ document.documentElement.className.split(' ').forEach(function (classItem) {
1019
+ if (
1020
+ // remove "to-{page}" classes
1021
+ new RegExp('^to-').test(classItem) ||
1022
+ // remove all other classes
1023
+ classItem === 'is-changing' || classItem === 'is-rendering' || classItem === 'is-popstate') {
1024
+ document.documentElement.classList.remove(classItem);
1025
+ }
1026
+ });
1027
+ };
1029
1028
 
1030
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
1029
+ exports.default = cleanupAnimationClasses;
1031
1030
 
1032
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
1031
+ /***/ }),
1032
+ /* 17 */
1033
+ /***/ (function(module, exports, __webpack_require__) {
1033
1034
 
1034
- var Link = function () {
1035
- function Link(elementOrUrl) {
1036
- _classCallCheck(this, Link);
1035
+ "use strict";
1037
1036
 
1038
- if (elementOrUrl instanceof Element || elementOrUrl instanceof SVGElement) {
1039
- this.link = elementOrUrl;
1040
- } else {
1041
- this.link = document.createElement('a');
1042
- this.link.href = elementOrUrl;
1043
- }
1044
- }
1045
1037
 
1046
- _createClass(Link, [{
1047
- key: 'getPath',
1048
- value: function getPath() {
1049
- var path = this.link.pathname;
1050
- if (path[0] !== '/') {
1051
- path = '/' + path;
1052
- }
1053
- return path;
1038
+ Object.defineProperty(exports, "__esModule", {
1039
+ value: true
1040
+ });
1041
+
1042
+ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
1043
+
1044
+ var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
1045
+
1046
+ var _helpers = __webpack_require__(0);
1047
+
1048
+ var loadPage = function loadPage(data, popstate) {
1049
+ var _this = this;
1050
+
1051
+ // create array for storing animation promises
1052
+ var animationPromises = [],
1053
+ xhrPromise = void 0;
1054
+ var animateOut = function animateOut() {
1055
+ _this.triggerEvent('animationOutStart');
1056
+
1057
+ // handle classes
1058
+ document.documentElement.classList.add('is-changing');
1059
+ document.documentElement.classList.add('is-leaving');
1060
+ document.documentElement.classList.add('is-animating');
1061
+ if (popstate) {
1062
+ document.documentElement.classList.add('is-popstate');
1054
1063
  }
1055
- }, {
1056
- key: 'getAddress',
1057
- value: function getAddress() {
1058
- var path = this.link.pathname + this.link.search;
1064
+ document.documentElement.classList.add('to-' + (0, _helpers.classify)(data.url));
1059
1065
 
1060
- if (this.link.getAttribute('xlink:href')) {
1061
- path = this.link.getAttribute('xlink:href');
1062
- }
1066
+ // animation promise stuff
1067
+ animationPromises = _this.getAnimationPromises('out');
1068
+ Promise.all(animationPromises).then(function () {
1069
+ _this.triggerEvent('animationOutDone');
1070
+ });
1063
1071
 
1064
- if (path[0] !== '/') {
1065
- path = '/' + path;
1072
+ // create history record if this is not a popstate call
1073
+ if (!popstate) {
1074
+ // create pop element with or without anchor
1075
+ var state = void 0;
1076
+ if (_this.scrollToElement != null) {
1077
+ state = data.url + _this.scrollToElement;
1078
+ } else {
1079
+ state = data.url;
1066
1080
  }
1067
- return path;
1081
+
1082
+ (0, _helpers.createHistoryRecord)(state);
1068
1083
  }
1069
- }, {
1070
- key: 'getHash',
1071
- value: function getHash() {
1072
- return this.link.hash;
1084
+ };
1085
+
1086
+ this.triggerEvent('transitionStart', popstate);
1087
+
1088
+ // set transition object
1089
+ if (data.customTransition != null) {
1090
+ this.updateTransition(window.location.pathname, data.url, data.customTransition);
1091
+ document.documentElement.classList.add('to-' + (0, _helpers.classify)(data.customTransition));
1092
+ } else {
1093
+ this.updateTransition(window.location.pathname, data.url);
1094
+ }
1095
+
1096
+ // start/skip animation
1097
+ if (!popstate || this.options.animateHistoryBrowsing) {
1098
+ animateOut();
1099
+ } else {
1100
+ this.triggerEvent('animationSkipped');
1101
+ }
1102
+
1103
+ // start/skip loading of page
1104
+ if (this.cache.exists(data.url)) {
1105
+ xhrPromise = new Promise(function (resolve) {
1106
+ resolve(_this.cache.getPage(data.url));
1107
+ });
1108
+ this.triggerEvent('pageRetrievedFromCache');
1109
+ } else {
1110
+ if (!this.preloadPromise || this.preloadPromise.route != data.url) {
1111
+ xhrPromise = new Promise(function (resolve, reject) {
1112
+ (0, _helpers.fetch)(_extends({}, data, { headers: _this.options.requestHeaders }), function (response) {
1113
+ if (response.status === 500) {
1114
+ _this.triggerEvent('serverError');
1115
+ reject(data.url);
1116
+ return;
1117
+ } else {
1118
+ // get json data
1119
+ var page = _this.getPageData(response);
1120
+ if (page != null && page.blocks.length > 0) {
1121
+ page.url = data.url;
1122
+ } else {
1123
+ reject(data.url);
1124
+ return;
1125
+ }
1126
+ // render page
1127
+ _this.cache.cacheUrl(page);
1128
+ _this.triggerEvent('pageLoaded');
1129
+ resolve(page);
1130
+ }
1131
+ });
1132
+ });
1133
+ } else {
1134
+ xhrPromise = this.preloadPromise;
1073
1135
  }
1074
- }]);
1136
+ }
1075
1137
 
1076
- return Link;
1077
- }();
1138
+ // when everything is ready, handle the outcome
1139
+ Promise.all([xhrPromise].concat(animationPromises)).then(function (_ref) {
1140
+ var _ref2 = _slicedToArray(_ref, 1),
1141
+ pageData = _ref2[0];
1078
1142
 
1079
- exports.default = Link;
1143
+ // render page
1144
+ _this.renderPage(pageData, popstate);
1145
+ _this.preloadPromise = null;
1146
+ }).catch(function (errorUrl) {
1147
+ // rewrite the skipPopStateHandling function to redirect manually when the history.go is processed
1148
+ _this.options.skipPopStateHandling = function () {
1149
+ window.location = errorUrl;
1150
+ return true;
1151
+ };
1152
+
1153
+ // go back to the actual page were still at
1154
+ window.history.go(-1);
1155
+ });
1156
+ };
1157
+
1158
+ exports.default = loadPage;
1080
1159
 
1081
1160
  /***/ }),
1082
- /* 15 */
1161
+ /* 18 */
1083
1162
  /***/ (function(module, exports, __webpack_require__) {
1084
1163
 
1085
1164
  "use strict";
@@ -1091,26 +1170,27 @@ Object.defineProperty(exports, "__esModule", {
1091
1170
 
1092
1171
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
1093
1172
 
1094
- var _utils = __webpack_require__(0);
1095
-
1096
- var _helpers = __webpack_require__(1);
1173
+ var _helpers = __webpack_require__(0);
1097
1174
 
1098
1175
  var renderPage = function renderPage(page, popstate) {
1099
1176
  var _this = this;
1100
1177
 
1101
1178
  document.documentElement.classList.remove('is-leaving');
1102
1179
 
1180
+ var isCurrentPage = this.getCurrentUrl() === page.url;
1181
+ if (!isCurrentPage) return;
1182
+
1103
1183
  // replace state in case the url was redirected
1104
- var link = new _helpers.Link(page.responseURL);
1105
- if (window.location.pathname !== link.getPath()) {
1184
+ var url = new _helpers.Link(page.responseURL).getPath();
1185
+ if (window.location.pathname !== url) {
1106
1186
  window.history.replaceState({
1107
- url: link.getPath(),
1187
+ url: url,
1108
1188
  random: Math.random(),
1109
1189
  source: 'swup'
1110
- }, document.title, link.getPath());
1190
+ }, document.title, url);
1111
1191
 
1112
1192
  // save new record for redirected url
1113
- this.cache.cacheUrl(_extends({}, page, { url: link.getPath() }));
1193
+ this.cache.cacheUrl(_extends({}, page, { url: url }));
1114
1194
  }
1115
1195
 
1116
1196
  // only add for non-popstate transitions
@@ -1119,15 +1199,12 @@ var renderPage = function renderPage(page, popstate) {
1119
1199
  }
1120
1200
 
1121
1201
  this.triggerEvent('willReplaceContent', popstate);
1122
-
1123
1202
  // replace blocks
1124
1203
  for (var i = 0; i < page.blocks.length; i++) {
1125
1204
  document.body.querySelector('[data-swup="' + i + '"]').outerHTML = page.blocks[i];
1126
1205
  }
1127
-
1128
1206
  // set title
1129
1207
  document.title = page.title;
1130
-
1131
1208
  this.triggerEvent('contentReplaced', popstate);
1132
1209
  this.triggerEvent('pageView', popstate);
1133
1210
 
@@ -1150,12 +1227,7 @@ var renderPage = function renderPage(page, popstate) {
1150
1227
  Promise.all(animationPromises).then(function () {
1151
1228
  _this.triggerEvent('animationInDone');
1152
1229
  _this.triggerEvent('transitionEnd', popstate);
1153
- // remove "to-{page}" classes
1154
- document.documentElement.className.split(' ').forEach(function (classItem) {
1155
- if (new RegExp('^to-').test(classItem) || classItem === 'is-changing' || classItem === 'is-rendering' || classItem === 'is-popstate') {
1156
- document.documentElement.classList.remove(classItem);
1157
- }
1158
- });
1230
+ _this.cleanupAnimationClasses();
1159
1231
  });
1160
1232
  } else {
1161
1233
  this.triggerEvent('transitionEnd', popstate);
@@ -1168,7 +1240,7 @@ var renderPage = function renderPage(page, popstate) {
1168
1240
  exports.default = renderPage;
1169
1241
 
1170
1242
  /***/ }),
1171
- /* 16 */
1243
+ /* 19 */
1172
1244
  /***/ (function(module, exports, __webpack_require__) {
1173
1245
 
1174
1246
  "use strict";
@@ -1195,7 +1267,7 @@ var triggerEvent = function triggerEvent(eventName, originalEvent) {
1195
1267
  exports.default = triggerEvent;
1196
1268
 
1197
1269
  /***/ }),
1198
- /* 17 */
1270
+ /* 20 */
1199
1271
  /***/ (function(module, exports, __webpack_require__) {
1200
1272
 
1201
1273
  "use strict";
@@ -1215,7 +1287,7 @@ var on = function on(event, handler) {
1215
1287
  exports.default = on;
1216
1288
 
1217
1289
  /***/ }),
1218
- /* 18 */
1290
+ /* 21 */
1219
1291
  /***/ (function(module, exports, __webpack_require__) {
1220
1292
 
1221
1293
  "use strict";
@@ -1255,7 +1327,7 @@ var off = function off(event, handler) {
1255
1327
  exports.default = off;
1256
1328
 
1257
1329
  /***/ }),
1258
- /* 19 */
1330
+ /* 22 */
1259
1331
  /***/ (function(module, exports, __webpack_require__) {
1260
1332
 
1261
1333
  "use strict";
@@ -1276,7 +1348,7 @@ var updateTransition = function updateTransition(from, to, custom) {
1276
1348
  exports.default = updateTransition;
1277
1349
 
1278
1350
  /***/ }),
1279
- /* 20 */
1351
+ /* 23 */
1280
1352
  /***/ (function(module, exports, __webpack_require__) {
1281
1353
 
1282
1354
  "use strict";
@@ -1286,7 +1358,7 @@ Object.defineProperty(exports, "__esModule", {
1286
1358
  value: true
1287
1359
  });
1288
1360
 
1289
- var _utils = __webpack_require__(0);
1361
+ var _utils = __webpack_require__(1);
1290
1362
 
1291
1363
  var getAnchorElement = function getAnchorElement(hash) {
1292
1364
  if (!hash) {
@@ -1307,7 +1379,7 @@ var getAnchorElement = function getAnchorElement(hash) {
1307
1379
  exports.default = getAnchorElement;
1308
1380
 
1309
1381
  /***/ }),
1310
- /* 21 */
1382
+ /* 24 */
1311
1383
  /***/ (function(module, exports, __webpack_require__) {
1312
1384
 
1313
1385
  "use strict";
@@ -1317,14 +1389,29 @@ Object.defineProperty(exports, "__esModule", {
1317
1389
  value: true
1318
1390
  });
1319
1391
 
1320
- var _utils = __webpack_require__(0);
1392
+ var _utils = __webpack_require__(1);
1321
1393
 
1322
- var _helpers = __webpack_require__(1);
1394
+ var _helpers = __webpack_require__(0);
1323
1395
 
1324
1396
  var getAnimationPromises = function getAnimationPromises() {
1397
+ var selector = this.options.animationSelector;
1398
+ var durationProperty = (0, _helpers.transitionProperty)() + 'Duration';
1325
1399
  var promises = [];
1326
- var animatedElements = (0, _utils.queryAll)(this.options.animationSelector);
1400
+ var animatedElements = (0, _utils.queryAll)(selector, document.body);
1401
+
1402
+ if (!animatedElements.length) {
1403
+ console.warn('[swup] No animated elements found by selector ' + selector);
1404
+ return [Promise.resolve()];
1405
+ }
1406
+
1327
1407
  animatedElements.forEach(function (element) {
1408
+ var transitionDuration = window.getComputedStyle(element)[durationProperty];
1409
+ // Resolve immediately if no transition defined
1410
+ if (!transitionDuration || transitionDuration == '0s') {
1411
+ console.warn('[swup] No CSS transition duration defined for element of selector ' + selector);
1412
+ promises.push(Promise.resolve());
1413
+ return;
1414
+ }
1328
1415
  var promise = new Promise(function (resolve) {
1329
1416
  element.addEventListener((0, _helpers.transitionEnd)(), function (event) {
1330
1417
  if (element == event.target) {
@@ -1334,13 +1421,14 @@ var getAnimationPromises = function getAnimationPromises() {
1334
1421
  });
1335
1422
  promises.push(promise);
1336
1423
  });
1424
+
1337
1425
  return promises;
1338
1426
  };
1339
1427
 
1340
1428
  exports.default = getAnimationPromises;
1341
1429
 
1342
1430
  /***/ }),
1343
- /* 22 */
1431
+ /* 25 */
1344
1432
  /***/ (function(module, exports, __webpack_require__) {
1345
1433
 
1346
1434
  "use strict";
@@ -1350,7 +1438,7 @@ Object.defineProperty(exports, "__esModule", {
1350
1438
  value: true
1351
1439
  });
1352
1440
 
1353
- var _helpers = __webpack_require__(1);
1441
+ var _helpers = __webpack_require__(0);
1354
1442
 
1355
1443
  var getPageData = function getPageData(request) {
1356
1444
  // this method can be replaced in case other content than html is expected to be received from server
@@ -1362,7 +1450,7 @@ var getPageData = function getPageData(request) {
1362
1450
  if (pageObject) {
1363
1451
  pageObject.responseURL = request.responseURL ? request.responseURL : window.location.href;
1364
1452
  } else {
1365
- console.warn('Received page is invalid.');
1453
+ console.warn('[swup] Received page is invalid.');
1366
1454
  return null;
1367
1455
  }
1368
1456
 
@@ -1372,7 +1460,7 @@ var getPageData = function getPageData(request) {
1372
1460
  exports.default = getPageData;
1373
1461
 
1374
1462
  /***/ }),
1375
- /* 23 */
1463
+ /* 26 */
1376
1464
  /***/ (function(module, exports, __webpack_require__) {
1377
1465
 
1378
1466
  "use strict";