swup 4.6.0 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { type DelegateEvent } from 'delegate-it';
2
+ import { Location } from './helpers.js';
2
3
  import { type DelegateEventUnsubscribe } from './helpers/delegateEvent.js';
3
4
  import { Cache } from './modules/Cache.js';
4
5
  import { Classes } from './modules/Classes.js';
@@ -61,8 +62,10 @@ export default class Swup {
61
62
  readonly hooks: Hooks;
62
63
  /** Animation class manager */
63
64
  readonly classes: Classes;
64
- /** URL of the currently visible page */
65
- currentPageUrl: string;
65
+ /** Location of the currently visible page */
66
+ location: Location;
67
+ /** URL of the currently visible page @deprecated Use swup.location.url instead */
68
+ get currentPageUrl(): string;
66
69
  /** Index of the current history entry */
67
70
  protected currentHistoryIndex: number;
68
71
  /** Delegated event subscription handle */
@@ -108,7 +111,6 @@ export default class Swup {
108
111
  /** Check if two URLs resolve to the same location */
109
112
  protected isSameResolvedUrl: typeof isSameResolvedUrl;
110
113
  constructor(options?: Partial<Options>);
111
- protected checkRequirements(): boolean;
112
114
  /** Enable this instance, adding listeners and classnames. */
113
115
  enable(): Promise<void>;
114
116
  /** Disable this instance, removing listeners and classnames. */
@@ -1 +1 @@
1
- {"version":3,"file":"Swup.d.ts","sourceRoot":"","sources":["../../src/Swup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Swup.d.ts","sourceRoot":"","sources":["../../src/Swup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,EAAgC,QAAQ,EAAuB,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,KAAK,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAMnD,OAAO,EAAO,KAAK,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAIxE,+CAA+C;AAC/C,MAAM,MAAM,OAAO,GAAG;IACrB,4DAA4D;IAC5D,sBAAsB,EAAE,OAAO,CAAC;IAChC,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,YAAY,CAAC;IACtC,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;IACf,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,6FAA6F;IAC7F,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,KAAK,OAAO,CAAC;IACtF,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,UAAU,EAAE,sBAAsB,CAAC;IACnC,+DAA+D;IAC/D,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,wCAAwC;IACxC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,oEAAoE;IACpE,oBAAoB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IACxD,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAsBF,oCAAoC;AACpC,MAAM,CAAC,OAAO,OAAO,IAAI;IACxB,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAW;IACnC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAY;IACtC,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,mCAAmC;IACnC,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB;IACrB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,oBAAoB;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,EAAE,QAAQ,CAA0C;IAC5D,kFAAkF;IAClF,IAAI,cAAc,IAAI,MAAM,CAE3B;IACD,yCAAyC;IACzC,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACtC,0CAA0C;IAC1C,SAAS,CAAC,aAAa,CAAC,EAAE,wBAAwB,CAAC;IACnD,wBAAwB;IACxB,SAAS,CAAC,UAAU,EAAE,OAAO,CAAS;IACtC,+BAA+B;IAC/B,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C,uBAAuB;IACvB,GAAG,wDAAO;IACV,yBAAyB;IACzB,KAAK,eAAS;IACd,wCAAwC;IACxC,UAAU,oBAAc;IAExB,oEAAoE;IACpE,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAY;IAE7D,4BAA4B;IAC5B,QAAQ,kBAAY;IACpB,oCAAoC;IACpC,SAAS,CAAC,iBAAiB,2BAAqB;IAChD,0CAA0C;IAC1C,SAAS,CAAC,WAAW,qBAAe;IACpC,0CAA0C;IAC1C,aAAa,4bAAiB;IAC9B,mCAAmC;IACnC,SAAS,mBAAa;IACtB,iDAAiD;IACjD,eAAe,yBAAmB;IAClC,SAAS,CAAC,UAAU,+FAAc;IAClC,0CAA0C;IAC1C,cAAc,wCAAkB;IAChC,SAAS,CAAC,aAAa,8CAAiB;IACxC,SAAS,CAAC,cAAc,8CAAkB;IAC1C,SAAS,CAAC,eAAe,wCAAmB;IAC5C,+CAA+C;IAC/C,gBAAgB,gDAAoB;IAEpC,+BAA+B;IAC/B,aAAa;;iBAAiB;IAC9B,0CAA0C;IAC1C,UAAU,oBAAc;IACxB,qDAAqD;IACrD,SAAS,CAAC,iBAAiB,2BAAqB;gBAEpC,OAAO,GAAE,OAAO,CAAC,OAAO,CAAM;IAiB1C,6DAA6D;IACvD,MAAM;IAwCZ,gEAAgE;IAC1D,OAAO;IAwBb,uFAAuF;IACvF,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAO;IAsBnF,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC;IAiE1D,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa;IA4C7C,iFAAiF;IACjF,SAAS,CAAC,wBAAwB,CAAC,SAAS,EAAE,OAAO;CAMrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"delegateEvent.d.ts","sourceRoot":"","sources":["../../../src/helpers/delegateEvent.ts"],"names":[],"mappings":"AAAA,OAAiB,EAChB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,MAAM,wBAAwB,GAAG;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,aAAa,8SAQf,eAAe,KACvB,wBAKF,CAAC"}
1
+ {"version":3,"file":"delegateEvent.d.ts","sourceRoot":"","sources":["../../../src/helpers/delegateEvent.ts"],"names":[],"mappings":"AAAA,OAAiB,EAChB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,MAAM,wBAAwB,GAAG;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,aAAa,6LAKf,QAAQ,QACZ,MAAM,YACF,qBAAqB,2BAA2B,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,YACnE,eAAe,KACvB,wBAKF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /** Get the current page URL: path name + query params. Optionally including hash. */
2
2
  export declare const getCurrentUrl: ({ hash }?: {
3
- hash?: boolean | undefined;
3
+ hash?: boolean;
4
4
  }) => string;
5
5
  //# sourceMappingURL=getCurrentUrl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getCurrentUrl.d.ts","sourceRoot":"","sources":["../../../src/helpers/getCurrentUrl.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,aAAa;;MAAwC,MAEjE,CAAC"}
1
+ {"version":3,"file":"getCurrentUrl.d.ts","sourceRoot":"","sources":["../../../src/helpers/getCurrentUrl.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,aAAa,cAAc;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KAAQ,MAEjE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"matchPath.d.ts","sourceRoot":"","sources":["../../../src/helpers/matchPath.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,IAAI,EACJ,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;AAErB,oFAAoF;AACpF,eAAO,MAAM,SAAS,oCACf,IAAI,YACA,YAAY,GAAG,qBAAqB,GAAG,uBAAuB,qBAOxE,CAAC"}
1
+ {"version":3,"file":"matchPath.d.ts","sourceRoot":"","sources":["../../../src/helpers/matchPath.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,IAAI,EACJ,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;AAErB,oFAAoF;AACpF,eAAO,MAAM,SAAS,oCACf,IAAI,YACA,YAAY,GAAG,qBAAqB,GAAG,uBAAuB,KACtE,cAAc,CAAC,CAMjB,CAAC"}
@@ -5,6 +5,8 @@ import type { HistoryAction, HistoryDirection } from './navigate.js';
5
5
  export interface VisitFrom {
6
6
  /** The URL of the previous page */
7
7
  url: string;
8
+ /** The hash of the previous page */
9
+ hash?: string;
8
10
  }
9
11
  export interface VisitTo {
10
12
  /** The URL of the next page */
@@ -1 +1 @@
1
- {"version":3,"file":"Visit.d.ts","sourceRoot":"","sources":["../../../src/modules/Visit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErE,kDAAkD;AAGlD,MAAM,WAAW,SAAS;IACzB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,OAAO;IACvB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC9B,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,gGAAgG;IAChG,IAAI,EAAE,OAAO,CAAC;IACd,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,MAAM,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,EAAE,CAAC;IACxC,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC3B,4EAA4E;IAC5E,KAAK,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC5B,6CAA6C;IAC7C,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,2CAA2C;IAC3C,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IAC1B,yEAAyE;IACzE,IAAI,EAAE,OAAO,CAAC;IACd,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,qIAAqI;IACrI,MAAM,EAAE,aAAa,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,4FAA4F;IAC5F,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAkBD,yDAAyD;AACzD,qBAAa,KAAK;IACjB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IAGX,wCAAwC;IACxC,IAAI,EAAE,SAAS,CAAC;IAChB,oCAAoC;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,kDAAkD;IAClD,SAAS,EAAE,cAAc,CAAC;IAC1B,gCAAgC;IAChC,OAAO,EAAE,YAAY,CAAC;IACtB,oCAAoC;IACpC,KAAK,EAAE,UAAU,CAAC;IAClB,6CAA6C;IAC7C,OAAO,EAAE,YAAY,CAAC;IACtB,oCAAoC;IACpC,MAAM,EAAE,WAAW,CAAC;gBAER,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB;IA2CjD,8DAA8D;IAC9D,IAAI,IAAI,IAAI,OAAO,CAElB;CACD;AAED,iCAAiC;AACjC,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,KAAK,CAExE"}
1
+ {"version":3,"file":"Visit.d.ts","sourceRoot":"","sources":["../../../src/modules/Visit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErE,kDAAkD;AAGlD,MAAM,WAAW,SAAS;IACzB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,OAAO;IACvB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC9B,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,gGAAgG;IAChG,IAAI,EAAE,OAAO,CAAC;IACd,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,MAAM,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,EAAE,CAAC;IACxC,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC3B,4EAA4E;IAC5E,KAAK,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC5B,6CAA6C;IAC7C,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,2CAA2C;IAC3C,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IAC1B,yEAAyE;IACzE,IAAI,EAAE,OAAO,CAAC;IACd,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,qIAAqI;IACrI,MAAM,EAAE,aAAa,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,4FAA4F;IAC5F,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAkBD,yDAAyD;AACzD,qBAAa,KAAK;IACjB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IAGX,wCAAwC;IACxC,IAAI,EAAE,SAAS,CAAC;IAChB,oCAAoC;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,kDAAkD;IAClD,SAAS,EAAE,cAAc,CAAC;IAC1B,gCAAgC;IAChC,OAAO,EAAE,YAAY,CAAC;IACtB,oCAAoC;IACpC,KAAK,EAAE,UAAU,CAAC;IAClB,6CAA6C;IAC7C,OAAO,EAAE,YAAY,CAAC;IACtB,oCAAoC;IACpC,MAAM,EAAE,WAAW,CAAC;gBAER,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB;IA2CjD,8DAA8D;IAC9D,IAAI,IAAI,IAAI,OAAO,CAElB;CACD;AAED,iCAAiC;AACjC,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,KAAK,CAExE"}
@@ -2,20 +2,20 @@ import type Swup from '../Swup.js';
2
2
  import type { Options } from '../Swup.js';
3
3
  declare const TRANSITION = "transition";
4
4
  declare const ANIMATION = "animation";
5
- type AnimationTypes = typeof TRANSITION | typeof ANIMATION;
5
+ type AnimationType = typeof TRANSITION | typeof ANIMATION;
6
+ type AnimationProperty = 'Delay' | 'Duration';
7
+ type AnimationStyleKey = `${AnimationType}${AnimationProperty}` | 'transitionProperty';
6
8
  export type AnimationDirection = 'in' | 'out';
7
9
  /**
8
10
  * Return a Promise that resolves when all CSS animations and transitions
9
11
  * are done on the page. Filters by selector or takes elements directly.
10
12
  */
11
- export declare function awaitAnimations(this: Swup, { elements, selector }: {
13
+ export declare function awaitAnimations(this: Swup, { selector, elements }: {
12
14
  selector: Options['animationSelector'];
13
15
  elements?: NodeListOf<HTMLElement> | HTMLElement[];
14
16
  }): Promise<void>;
15
- export declare function getTransitionInfo(element: Element, expectedType?: AnimationTypes): {
16
- type: AnimationTypes | null;
17
- timeout: number;
18
- propCount: number;
19
- };
17
+ export declare function getStyleProperties(styles: CSSStyleDeclaration, key: AnimationStyleKey): string[];
18
+ export declare function calculateTimeout(delays: string[], durations: string[]): number;
19
+ export declare function toMs(time: string): number;
20
20
  export {};
21
21
  //# sourceMappingURL=awaitAnimations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"awaitAnimations.d.ts","sourceRoot":"","sources":["../../../src/modules/awaitAnimations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,QAAA,MAAM,UAAU,eAAe,CAAC;AAChC,QAAA,MAAM,SAAS,cAAc,CAAC;AAE9B,KAAK,cAAc,GAAG,OAAO,UAAU,GAAG,OAAO,SAAS,CAAC;AAK3D,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9C;;;GAGG;AACH,wBAAsB,eAAe,CACpC,IAAI,EAAE,IAAI,EACV,EACC,QAAQ,EACR,QAAQ,EACR,EAAE;IACF,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,WAAW,EAAE,CAAC;CACnD,GACC,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAoDD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,cAAc;;;;EAyChF"}
1
+ {"version":3,"file":"awaitAnimations.d.ts","sourceRoot":"","sources":["../../../src/modules/awaitAnimations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,QAAA,MAAM,UAAU,eAAe,CAAC;AAChC,QAAA,MAAM,SAAS,cAAc,CAAC;AAE9B,KAAK,aAAa,GAAG,OAAO,UAAU,GAAG,OAAO,SAAS,CAAC;AAE1D,KAAK,iBAAiB,GAAG,OAAO,GAAG,UAAU,CAAC;AAC9C,KAAK,iBAAiB,GAAG,GAAG,aAAa,GAAG,iBAAiB,EAAE,GAAG,oBAAoB,CAAC;AAEvF,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9C;;;GAGG;AACH,wBAAsB,eAAe,CACpC,IAAI,EAAE,IAAI,EACV,EACC,QAAQ,EACR,QAAQ,EACR,EAAE;IACF,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,WAAW,EAAE,CAAC;CACnD,GACC,OAAO,CAAC,IAAI,CAAC,CA+Bf;AA2ED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAEhG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAM9E;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../../src/modules/navigate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAc,KAAK,YAAY,EAAiB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,KAAK,EAAc,MAAM,YAAY,CAAC;AAS3E,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAC/C,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,WAAW,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEtE,wCAAwC;AACxC,KAAK,iBAAiB,GAAG;IACxB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qIAAqI;IACrI,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,iEAAiE;IACjE,KAAK,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CACvB,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,iBAAiB,GAAG,YAAiB,EAC9C,IAAI,GAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAM,QAgBvC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,iBAAiB,GAAG,YAAiB,GAC5C,OAAO,CAAC,IAAI,CAAC,CAwKf"}
1
+ {"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../../src/modules/navigate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAc,KAAK,YAAY,EAAiB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,KAAK,EAAc,MAAM,YAAY,CAAC;AAI3E,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAC/C,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,WAAW,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEtE,wCAAwC;AACxC,KAAK,iBAAiB,GAAG;IACxB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qIAAqI;IACrI,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,iEAAiE;IACjE,KAAK,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CACvB,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,iBAAiB,GAAG,YAAiB,EAC9C,IAAI,GAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAM,QAgBvC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,iBAAiB,GAAG,YAAiB,GAC5C,OAAO,CAAC,IAAI,CAAC,CAuKf"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderPage.d.ts","sourceRoot":"","sources":["../../../src/modules/renderPage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,UAAU,SAAyB,IAAI,SAAS,KAAK,QAAQ,QAAQ,KAAG,QAAQ,IAAI,CAyChG,CAAC"}
1
+ {"version":3,"file":"renderPage.d.ts","sourceRoot":"","sources":["../../../src/modules/renderPage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,UAAU,SAAyB,IAAI,SAAS,KAAK,QAAQ,QAAQ,KAAG,QAAQ,IAAI,CA0ChG,CAAC"}
@@ -13,8 +13,11 @@ export declare function runAsPromise(func: Function, args?: unknown[]): Promise<
13
13
  * @see https://stackoverflow.com/a/21665117/3759615
14
14
  */
15
15
  export declare function forceReflow(element?: HTMLElement): void;
16
- /** Escape a string with special chars to not break CSS selectors. */
17
- export declare const escapeCssIdentifier: (ident: string) => string;
18
- /** Fix for Chrome below v61 formatting CSS floats with comma in some locales. */
19
- export declare const toMs: (s: string) => number;
16
+ /**
17
+ * Read data attribute from closest element with that attribute.
18
+ *
19
+ * Returns `undefined` if no element is found or attribute is missing.
20
+ * Returns `true` if attribute is present without a value.
21
+ */
22
+ export declare function getContextualAttr(el: Element | undefined, attr: string): string | boolean | undefined;
20
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,eAAO,MAAM,KAAK,aAAc,MAAM,YAAW,QAAQ,GAAG,OAAO,uBAElE,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,QAAQ,aACV,MAAM,YACP,QAAQ,GAAG,OAAO,KACzB,WAAW,EAEb,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,QAAQ,QAAO,QAAQ,IAAI,CAQvC,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAMhE;AAED,wFAAwF;AAExF,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CASnF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAGvD;AAED,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,UAAW,MAAM,WAMhD,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,IAAI,MAAO,MAAM,WAE7B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,eAAO,MAAM,KAAK,aAAc,MAAM,YAAW,QAAQ,GAAG,OAAO,uBAElE,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,QAAQ,aACV,MAAM,YACP,QAAQ,GAAG,OAAO,KACzB,WAAW,EAEb,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,QAAQ,QAAO,QAAQ,IAAI,CAQvC,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAMhE;AAED,wFAAwF;AAExF,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CASnF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAGvD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,EAAE,EAAE,OAAO,GAAG,SAAS,EACvB,IAAI,EAAE,MAAM,GACV,MAAM,GAAG,OAAO,GAAG,SAAS,CAG9B"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "swup",
3
3
  "amdName": "Swup",
4
- "version": "4.6.0",
4
+ "version": "4.7.0",
5
5
  "description": "Versatile and extensible page transition library for server-rendered websites",
6
6
  "type": "module",
7
7
  "source": "./src/Swup.ts",
@@ -70,18 +70,18 @@
70
70
  "@swup/prettier-config": "^1.0.0",
71
71
  "@types/dom-view-transitions": "^1.0.2",
72
72
  "@types/jsdom": "^21.1.1",
73
- "@typescript-eslint/eslint-plugin": "^6.3.0",
74
- "@typescript-eslint/parser": "^6.3.0",
73
+ "@typescript-eslint/eslint-plugin": "^7.13.0",
74
+ "@typescript-eslint/parser": "^7.13.0",
75
75
  "eslint": "^8.46.0",
76
76
  "eslint-config-prettier": "^9.0.0",
77
- "eslint-plugin-compat": "^4.2.0",
77
+ "eslint-plugin-compat": "^5.0.0",
78
78
  "eslint-plugin-ecmascript-compat": "^3.2.0",
79
79
  "eslint-plugin-prettier": "^5.0.1",
80
- "husky": "^8.0.0",
80
+ "husky": "^9.0.11",
81
81
  "istanbul-lib-coverage": "^3.2.0",
82
- "jsdom": "^23.0.1",
82
+ "jsdom": "^24.1.0",
83
83
  "microbundle": "^0.15.0",
84
- "nyc": "^15.1.0",
84
+ "nyc": "^17.0.0",
85
85
  "prettier": "^3.1.0",
86
86
  "serve": "^14.2.1",
87
87
  "typed-query-selector": "^2.11.0",
package/src/Swup.ts CHANGED
@@ -93,8 +93,12 @@ export default class Swup {
93
93
  readonly hooks: Hooks;
94
94
  /** Animation class manager */
95
95
  readonly classes: Classes;
96
- /** URL of the currently visible page */
97
- currentPageUrl: string = getCurrentUrl();
96
+ /** Location of the currently visible page */
97
+ location: Location = Location.fromUrl(window.location.href);
98
+ /** URL of the currently visible page @deprecated Use swup.location.url instead */
99
+ get currentPageUrl(): string {
100
+ return this.location.url;
101
+ }
98
102
  /** Index of the current history entry */
99
103
  protected currentHistoryIndex: number;
100
104
  /** Delegated event subscription handle */
@@ -156,21 +160,9 @@ export default class Swup {
156
160
 
157
161
  this.currentHistoryIndex = (window.history.state as HistoryState)?.index ?? 1;
158
162
 
159
- if (!this.checkRequirements()) {
160
- return;
161
- }
162
-
163
163
  this.enable();
164
164
  }
165
165
 
166
- protected checkRequirements() {
167
- if (typeof Promise === 'undefined') {
168
- console.warn('Promise is not supported');
169
- return false;
170
- }
171
- return true;
172
- }
173
-
174
166
  /** Enable this instance, adding listeners and classnames. */
175
167
  async enable() {
176
168
  // Add event listener
@@ -334,7 +326,7 @@ export default class Swup {
334
326
  }
335
327
 
336
328
  // Exit early if the resolved path hasn't changed
337
- if (this.isSameResolvedUrl(getCurrentUrl(), this.currentPageUrl)) {
329
+ if (this.isSameResolvedUrl(getCurrentUrl(), this.location.url)) {
338
330
  return;
339
331
  }
340
332
 
@@ -8,6 +8,8 @@ import type { HistoryAction, HistoryDirection } from './navigate.js';
8
8
  export interface VisitFrom {
9
9
  /** The URL of the previous page */
10
10
  url: string;
11
+ /** The hash of the previous page */
12
+ hash?: string;
11
13
  }
12
14
 
13
15
  export interface VisitTo {
@@ -114,11 +116,11 @@ export class Visit {
114
116
  scroll: VisitScroll;
115
117
 
116
118
  constructor(swup: Swup, options: VisitInitOptions) {
117
- const { to, from = swup.currentPageUrl, hash, el, event } = options;
119
+ const { to, from, hash, el, event } = options;
118
120
 
119
121
  this.id = Math.random();
120
122
  this.state = VisitState.CREATED;
121
- this.from = { url: from };
123
+ this.from = { url: from ?? swup.location.url, hash: swup.location.hash };
122
124
  this.to = { url: to, hash };
123
125
  this.containers = swup.options.containers;
124
126
  this.animation = {
@@ -1,14 +1,14 @@
1
- import { queryAll, toMs } from '../utils.js';
1
+ import { queryAll } from '../utils.js';
2
2
  import type Swup from '../Swup.js';
3
3
  import type { Options } from '../Swup.js';
4
4
 
5
5
  const TRANSITION = 'transition';
6
6
  const ANIMATION = 'animation';
7
7
 
8
- type AnimationTypes = typeof TRANSITION | typeof ANIMATION;
9
- type AnimationProperties = 'Delay' | 'Duration';
10
- type AnimationStyleKeys = `${AnimationTypes}${AnimationProperties}` | 'transitionProperty';
11
- type AnimationStyleDeclarations = Pick<CSSStyleDeclaration, AnimationStyleKeys>;
8
+ type AnimationType = typeof TRANSITION | typeof ANIMATION;
9
+ type AnimationEndEvent = `${AnimationType}end`;
10
+ type AnimationProperty = 'Delay' | 'Duration';
11
+ type AnimationStyleKey = `${AnimationType}${AnimationProperty}` | 'transitionProperty';
12
12
 
13
13
  export type AnimationDirection = 'in' | 'out';
14
14
 
@@ -19,8 +19,8 @@ export type AnimationDirection = 'in' | 'out';
19
19
  export async function awaitAnimations(
20
20
  this: Swup,
21
21
  {
22
- elements,
23
- selector
22
+ selector,
23
+ elements
24
24
  }: {
25
25
  selector: Options['animationSelector'];
26
26
  elements?: NodeListOf<HTMLElement> | HTMLElement[];
@@ -58,7 +58,7 @@ export async function awaitAnimations(
58
58
  await Promise.all(awaitedAnimations);
59
59
  }
60
60
 
61
- function awaitAnimationsOnElement(element: Element): Promise<void> | false {
61
+ function awaitAnimationsOnElement(element: HTMLElement): Promise<void> | false {
62
62
  const { type, timeout, propCount } = getTransitionInfo(element);
63
63
 
64
64
  // Resolve immediately if no transition defined
@@ -67,7 +67,7 @@ function awaitAnimationsOnElement(element: Element): Promise<void> | false {
67
67
  }
68
68
 
69
69
  return new Promise((resolve) => {
70
- const endEvent = `${type}end`;
70
+ const endEvent: AnimationEndEvent = `${type}end`;
71
71
  const startTime = performance.now();
72
72
  let propsTransitioned = 0;
73
73
 
@@ -76,16 +76,12 @@ function awaitAnimationsOnElement(element: Element): Promise<void> | false {
76
76
  resolve();
77
77
  };
78
78
 
79
- const onEnd: EventListener = (event) => {
79
+ const onEnd = (event: TransitionEvent | AnimationEvent) => {
80
80
  // Skip transitions on child elements
81
81
  if (event.target !== element) {
82
82
  return;
83
83
  }
84
84
 
85
- if (!isTransitionOrAnimationEvent(event)) {
86
- throw new Error('Not a transition or animation event.');
87
- }
88
-
89
85
  // Skip transitions that happened before we started listening
90
86
  const elapsedTime = (performance.now() - startTime) / 1000;
91
87
  if (elapsedTime < event.elapsedTime) {
@@ -108,41 +104,25 @@ function awaitAnimationsOnElement(element: Element): Promise<void> | false {
108
104
  });
109
105
  }
110
106
 
111
- export function getTransitionInfo(element: Element, expectedType?: AnimationTypes) {
112
- const styles = window.getComputedStyle(element) as AnimationStyleDeclarations;
107
+ function getTransitionInfo(element: Element) {
108
+ const styles = window.getComputedStyle(element);
113
109
 
114
110
  const transitionDelays = getStyleProperties(styles, `${TRANSITION}Delay`);
115
111
  const transitionDurations = getStyleProperties(styles, `${TRANSITION}Duration`);
116
112
  const transitionTimeout = calculateTimeout(transitionDelays, transitionDurations);
113
+
117
114
  const animationDelays = getStyleProperties(styles, `${ANIMATION}Delay`);
118
115
  const animationDurations = getStyleProperties(styles, `${ANIMATION}Duration`);
119
116
  const animationTimeout = calculateTimeout(animationDelays, animationDurations);
120
117
 
121
- let type: AnimationTypes | null = null;
122
- let timeout = 0;
123
- let propCount = 0;
124
-
125
- if (expectedType === TRANSITION) {
126
- if (transitionTimeout > 0) {
127
- type = TRANSITION;
128
- timeout = transitionTimeout;
129
- propCount = transitionDurations.length;
130
- }
131
- } else if (expectedType === ANIMATION) {
132
- if (animationTimeout > 0) {
133
- type = ANIMATION;
134
- timeout = animationTimeout;
135
- propCount = animationDurations.length;
136
- }
137
- } else {
138
- timeout = Math.max(transitionTimeout, animationTimeout);
139
- type = timeout > 0 ? (transitionTimeout > animationTimeout ? TRANSITION : ANIMATION) : null;
140
- propCount = type
141
- ? type === TRANSITION
142
- ? transitionDurations.length
143
- : animationDurations.length
144
- : 0;
145
- }
118
+ const timeout = Math.max(transitionTimeout, animationTimeout);
119
+ const type: AnimationType | null =
120
+ timeout > 0 ? (transitionTimeout > animationTimeout ? TRANSITION : ANIMATION) : null;
121
+ const propCount = type
122
+ ? type === TRANSITION
123
+ ? transitionDurations.length
124
+ : animationDurations.length
125
+ : 0;
146
126
 
147
127
  return {
148
128
  type,
@@ -151,18 +131,18 @@ export function getTransitionInfo(element: Element, expectedType?: AnimationType
151
131
  };
152
132
  }
153
133
 
154
- function isTransitionOrAnimationEvent(event: Event): event is TransitionEvent | AnimationEvent {
155
- return [`${TRANSITION}end`, `${ANIMATION}end`].includes(event.type);
156
- }
157
-
158
- function getStyleProperties(styles: AnimationStyleDeclarations, key: AnimationStyleKeys): string[] {
134
+ export function getStyleProperties(styles: CSSStyleDeclaration, key: AnimationStyleKey): string[] {
159
135
  return (styles[key] || '').split(', ');
160
136
  }
161
137
 
162
- function calculateTimeout(delays: string[], durations: string[]): number {
138
+ export function calculateTimeout(delays: string[], durations: string[]): number {
163
139
  while (delays.length < durations.length) {
164
140
  delays = delays.concat(delays);
165
141
  }
166
142
 
167
143
  return Math.max(...durations.map((duration, i) => toMs(duration) + toMs(delays[i])));
168
144
  }
145
+
146
+ export function toMs(time: string): number {
147
+ return parseFloat(time) * 1000;
148
+ }
@@ -1,4 +1,4 @@
1
- import { escapeCssIdentifier as escape, query } from '../utils.js';
1
+ import { query } from '../utils.js';
2
2
 
3
3
  /**
4
4
  * Find the anchor element for a given hash.
@@ -21,8 +21,8 @@ export const getAnchorElement = (hash?: string): Element | null => {
21
21
  let element =
22
22
  document.getElementById(hash) ||
23
23
  document.getElementById(decoded) ||
24
- query(`a[name='${escape(hash)}']`) ||
25
- query(`a[name='${escape(decoded)}']`);
24
+ query(`a[name='${CSS.escape(hash)}']`) ||
25
+ query(`a[name='${CSS.escape(decoded)}']`);
26
26
 
27
27
  if (!element && hash === 'top') {
28
28
  element = document.body;
@@ -1,13 +1,8 @@
1
1
  import type Swup from '../Swup.js';
2
2
  import { FetchError, type FetchOptions, type PageData } from './fetchPage.js';
3
3
  import { type VisitInitOptions, type Visit, VisitState } from './Visit.js';
4
- import {
5
- createHistoryRecord,
6
- updateHistoryRecord,
7
- getCurrentUrl,
8
- Location,
9
- classify
10
- } from '../helpers.js';
4
+ import { createHistoryRecord, updateHistoryRecord, Location, classify } from '../helpers.js';
5
+ import { getContextualAttr } from '../utils.js';
11
6
 
12
7
  export type HistoryAction = 'push' | 'replace';
13
8
  export type HistoryDirection = 'forwards' | 'backwards';
@@ -88,7 +83,7 @@ export async function performNavigation(
88
83
  this.visit = visit;
89
84
 
90
85
  const { el } = visit.trigger;
91
- options.referrer = options.referrer || this.currentPageUrl;
86
+ options.referrer = options.referrer || this.location.url;
92
87
 
93
88
  if (options.animate === false) {
94
89
  visit.animation.animate = false;
@@ -100,14 +95,14 @@ export async function performNavigation(
100
95
  }
101
96
 
102
97
  // Get history action from option or attribute on trigger element
103
- const history = options.history || el?.getAttribute('data-swup-history') || undefined;
104
- if (history && ['push', 'replace'].includes(history)) {
98
+ const history = options.history || getContextualAttr(el, 'data-swup-history');
99
+ if (typeof history === 'string' && ['push', 'replace'].includes(history)) {
105
100
  visit.history.action = history as HistoryAction;
106
101
  }
107
102
 
108
103
  // Get custom animation name from option or attribute on trigger element
109
- const animation = options.animation || el?.getAttribute('data-swup-animation') || undefined;
110
- if (animation) {
104
+ const animation = options.animation || getContextualAttr(el, 'data-swup-animation');
105
+ if (typeof animation === 'string') {
111
106
  visit.animation.name = animation;
112
107
  }
113
108
 
@@ -123,6 +118,7 @@ export async function performNavigation(
123
118
 
124
119
  try {
125
120
  await this.hooks.call('visit:start', visit, undefined);
121
+
126
122
  visit.state = VisitState.STARTED;
127
123
 
128
124
  // Begin loading page
@@ -150,18 +146,16 @@ export async function performNavigation(
150
146
  });
151
147
 
152
148
  // Create/update history record if this is not a popstate call or leads to the same URL
149
+ const newUrl = visit.to.url + visit.to.hash;
153
150
  if (!visit.history.popstate) {
154
- // Add the hash directly from the trigger element
155
- const newUrl = visit.to.url + visit.to.hash;
156
- if (visit.history.action === 'replace' || visit.to.url === this.currentPageUrl) {
151
+ if (visit.history.action === 'replace' || visit.to.url === this.location.url) {
157
152
  updateHistoryRecord(newUrl);
158
153
  } else {
159
154
  this.currentHistoryIndex++;
160
155
  createHistoryRecord(newUrl, { index: this.currentHistoryIndex });
161
156
  }
162
157
  }
163
-
164
- this.currentPageUrl = getCurrentUrl();
158
+ this.location = Location.fromUrl(newUrl);
165
159
 
166
160
  // Mark visit type with classes
167
161
  if (visit.history.popstate) {
@@ -1,4 +1,4 @@
1
- import { updateHistoryRecord, getCurrentUrl, classify } from '../helpers.js';
1
+ import { updateHistoryRecord, getCurrentUrl, classify, Location } from '../helpers.js';
2
2
  import type Swup from '../Swup.js';
3
3
  import type { PageData } from './fetchPage.js';
4
4
  import { VisitState, type Visit } from './Visit.js';
@@ -17,8 +17,9 @@ export const renderPage = async function (this: Swup, visit: Visit, page: PageDa
17
17
  // update state if the url was redirected
18
18
  if (!this.isSameResolvedUrl(getCurrentUrl(), url)) {
19
19
  updateHistoryRecord(url);
20
- this.currentPageUrl = getCurrentUrl();
21
- visit.to.url = this.currentPageUrl;
20
+ this.location = Location.fromUrl(url);
21
+ visit.to.url = this.location.url;
22
+ visit.to.hash = this.location.hash;
22
23
  }
23
24
 
24
25
  // replace content: allow handlers and plugins to overwrite paga data and containers
@@ -46,5 +47,5 @@ export const renderPage = async function (this: Swup, visit: Visit, page: PageDa
46
47
  return this.scrollToContent(visit);
47
48
  });
48
49
 
49
- await this.hooks.call('page:view', visit, { url: this.currentPageUrl, title: document.title });
50
+ await this.hooks.call('page:view', visit, { url: this.location.url, title: document.title });
50
51
  };
@@ -53,16 +53,16 @@ export function forceReflow(element?: HTMLElement): void {
53
53
  element?.getBoundingClientRect();
54
54
  }
55
55
 
56
- /** Escape a string with special chars to not break CSS selectors. */
57
- export const escapeCssIdentifier = (ident: string) => {
58
- // @ts-ignore this is for support check, so it's correct that TS complains
59
- if (window.CSS && window.CSS.escape) {
60
- return CSS.escape(ident);
61
- }
62
- return ident;
63
- };
64
-
65
- /** Fix for Chrome below v61 formatting CSS floats with comma in some locales. */
66
- export const toMs = (s: string) => {
67
- return Number(s.slice(0, -1).replace(',', '.')) * 1000;
68
- };
56
+ /**
57
+ * Read data attribute from closest element with that attribute.
58
+ *
59
+ * Returns `undefined` if no element is found or attribute is missing.
60
+ * Returns `true` if attribute is present without a value.
61
+ */
62
+ export function getContextualAttr(
63
+ el: Element | undefined,
64
+ attr: string
65
+ ): string | boolean | undefined {
66
+ const target = el?.closest(`[${attr}]`);
67
+ return target?.hasAttribute(attr) ? target?.getAttribute(attr) || true : undefined;
68
+ }