1- import type { Options as SwupOptions , Handler } from 'swup' ;
1+ import type { Handler , Visit } from 'swup' ;
22import { forceReflow } from 'swup' ;
33import Plugin from '@swup/plugin' ;
44
@@ -10,7 +10,7 @@ declare module 'swup' {
1010}
1111
1212type PluginOptions = {
13- containers : SwupOptions [ 'containers' ] ;
13+ containers : string [ ] ;
1414} ;
1515
1616type ContainerSet = {
@@ -28,7 +28,7 @@ export default class SwupParallelPlugin extends Plugin {
2828 } ;
2929 options : PluginOptions ;
3030
31- originalContainers : SwupOptions [ 'containers' ] = [ ] ;
31+ originalContainers : string [ ] | null = null ;
3232 previousContainers : Element [ ] = [ ] ;
3333 nextContainers : Element [ ] = [ ] ;
3434
@@ -57,58 +57,41 @@ export default class SwupParallelPlugin extends Plugin {
5757 }
5858
5959 startVisit : Handler < 'visit:start' > = ( visit ) => {
60- const { animate , parallel } = visit . animation ;
61- const { containers } = this . options ;
62- if ( ! animate || parallel === false ) {
60+ this . originalContainers = null ;
61+
62+ if ( ! visit . animation . animate || visit . animation . parallel === false ) {
6363 return ;
6464 }
65+
6566 // Only mark as parallel visit if containers found
66- const hasContainers = containers . some ( ( selector ) => {
67- const el = document . querySelector ( selector )
68- if ( ! el ) return false ;
69- return visit . containers . some ( s => el . matches ( s ) ) ;
70- } ) ;
71- if ( hasContainers ) {
67+ if ( this . visitHasParallelContainers ( visit ) ) {
7268 visit . animation . wait = true ;
7369 visit . animation . parallel = true ;
7470 }
7571 } ;
7672
7773 skipOutAnimation : Handler < 'animation:out:await' > = ( visit , args ) => {
78- const { animate, parallel } = visit . animation ;
79- if ( animate && parallel ) {
74+ if ( visit . animation . animate && visit . animation . parallel ) {
8075 args . skip = true ;
8176 }
8277 } ;
8378
84- insertContainers : Handler < 'content:replace' > = ( visit , args ) => {
85- const { animate, parallel } = visit . animation ;
86- const { containers } = visit ;
87- const { page } = args ;
88-
89- if ( ! animate || ! parallel ) {
79+ insertContainers : Handler < 'content:replace' > = ( visit , { page } ) => {
80+ if ( ! visit . animation . animate || ! visit . animation . parallel ) {
9081 return ;
9182 }
9283
93- const defaultContainers = [ ...containers ] ;
94- const containersInParallel = this . options . containers ;
95- const containersInSeries = defaultContainers . filter (
96- ( selector ) => ! containersInParallel . includes ( selector )
97- ) ;
98- const hasContainers = containersInParallel . every ( ( selector ) =>
99- defaultContainers . includes ( selector )
100- ) ;
101- if ( ! hasContainers ) {
84+ const parallelContainers = this . options . containers ;
85+ const hasParallelContainers = parallelContainers . every ( ( s ) => visit . containers . includes ( s ) ) ;
86+ if ( ! hasParallelContainers ) {
10287 console . warn (
103- '[parallel-plugin] Parallel containers must be included in default containers'
88+ '[parallel-plugin] Parallel containers not found in list of replaced containers'
10489 ) ;
10590 return ;
10691 }
10792
10893 // Replace parallel containers ourselves
109-
110- const parallelContainers = this . parseContainers ( page ) ;
111- parallelContainers . forEach ( ( { previous, next } ) => {
94+ this . parseContainers ( page ) . forEach ( ( { previous, next } ) => {
11295 this . previousContainers . push ( previous ) ;
11396 this . nextContainers . push ( next ) ;
11497
@@ -117,27 +100,25 @@ export default class SwupParallelPlugin extends Plugin {
117100
118101 next . classList . add ( 'is-next-container' ) ;
119102 forceReflow ( next ) ;
120- next . classList . remove ( 'is-next-container' ) ;
121103 previous . classList . add ( 'is-previous-container' ) ;
104+ next . classList . remove ( 'is-next-container' ) ;
122105 } ) ;
123106
124- this . originalContainers = defaultContainers ;
125- visit . containers = containersInSeries ;
107+ // Hand all other non-parallel containers to swup
108+ this . originalContainers = visit . containers ;
109+ visit . containers = visit . containers . filter ( ( s ) => ! parallelContainers . includes ( s ) ) ;
126110 } ;
127111
128112 resetContainers : Handler < 'content:replace' > = ( visit ) => {
129- const { animate, parallel } = visit . animation ;
130- if ( ! animate || ! parallel ) {
131- return ;
113+ if ( this . originalContainers ) {
114+ visit . containers = this . originalContainers ;
132115 }
133-
134- visit . containers = this . originalContainers ;
135116 } ;
136117
137118 cleanupContainers = ( ) => {
138119 this . previousContainers . forEach ( ( c ) => c . remove ( ) ) ;
139- this . previousContainers = [ ] ;
140120 this . nextContainers . forEach ( ( c ) => c . classList . remove ( 'is-next-container' ) ) ;
121+ this . previousContainers = [ ] ;
141122 this . nextContainers = [ ] ;
142123 } ;
143124
@@ -149,4 +130,11 @@ export default class SwupParallelPlugin extends Plugin {
149130 return previous && next ? [ ...containers , { previous, next } ] : containers ;
150131 } , [ ] as ContainerSet [ ] ) ;
151132 }
133+
134+ visitHasParallelContainers ( visit : Visit ) {
135+ return this . options . containers . some ( ( selector ) => {
136+ const container = document . querySelector ( selector ) ;
137+ return container ?. matches ( visit . containers . join ( ',' ) ) ;
138+ } ) ;
139+ }
152140}
0 commit comments