{"version":3,"mappings":"iDAAA;AAAA;AAAA;AAAA,IAaA,SAASA,EAAcC,EAAWC,EAASC,EAAY,CACrD,MAAMC,EAAK,SAAS,cAAcF,CAAO,EACzC,OAAID,IACFG,EAAG,UAAYH,GAEbE,GACFA,EAAW,YAAYC,CAAE,EAEpBA,CACT,CAUA,SAASC,EAAkBC,EAAGC,EAAGC,EAAO,CACtC,IAAIC,EAAY,eAAeH,CAAC,YAEhC,OAAIE,IAAU,SACZC,GAAa,YAAYD,CAAK,IAAIA,CAAK,OAGlCC,CACT,CASA,SAASC,EAAeN,EAAIO,EAAGC,EAAG,CAChCR,EAAG,MAAM,MAAS,OAAOO,GAAM,SAAY,GAAGA,CAAC,KAAOA,EACtDP,EAAG,MAAM,OAAU,OAAOQ,GAAM,SAAY,GAAGA,CAAC,KAAOA,CACzD,CAIA,MAAMC,EAAa,CACjB,KAAM,OACN,QAAS,UACT,OAAQ,SACR,MAAO,OACT,EAUA,SAASC,EAAeC,EAAG,CACzB,MAAQ,WAAYA,GAAKA,EAAE,SAAW,GAAMA,EAAE,SAAWA,EAAE,SAAWA,EAAE,QAAUA,EAAE,QACtF,CAUA,SAASC,EAAsBC,EAAQC,EAAgBC,EAAS,SAAU,CAExE,IAAIC,EAAW,GAEf,GAAIH,aAAkB,QACpBG,EAAW,CAACH,CAAM,UACTA,aAAkB,UAAY,MAAM,QAAQA,CAAM,EAC3DG,EAAW,MAAM,KAAKH,CAAM,MACvB,CACL,MAAMI,EAAW,OAAOJ,GAAW,SAAWA,EAASC,EACnDG,IACFD,EAAW,MAAM,KAAKD,EAAO,iBAAiBE,CAAQ,CAAC,EAE1D,CAED,OAAOD,CACT,CAQA,SAASE,EAAYC,EAAI,CACvB,OAAO,OAAOA,GAAO,YAChBA,EAAG,WACHA,EAAG,UAAU,IACpB,CAOA,SAASC,GAAW,CAClB,MAAO,CAAC,EAAE,UAAU,QAAU,UAAU,OAAO,MAAM,QAAQ,EAC/D,CAgNA,MAAMC,CAAgB,CAKpB,YAAYC,EAAMC,EAAS,CACzB,KAAK,KAAOD,EACZ,KAAK,iBAAmB,GACpBC,GACF,OAAO,OAAO,KAAMA,CAAO,CAE9B,CAED,gBAAiB,CACf,KAAK,iBAAmB,EACzB,CACH,CAMA,MAAMC,CAAU,CACd,aAAc,CAIZ,KAAK,WAAa,GAKlB,KAAK,SAAW,GAGhB,KAAK,KAAO,OAGZ,KAAK,QAAU,MAChB,CAQD,UAAUC,EAAMN,EAAIO,EAAW,IAAK,WAC7B,KAAK,SAASD,CAAI,IACrB,KAAK,SAASA,CAAI,EAAI,KAGxBE,EAAA,KAAK,SAASF,CAAI,IAAlB,MAAAE,EAAqB,KAAK,CAAE,GAAAR,EAAI,SAAAO,CAAQ,IACxCE,EAAA,KAAK,SAASH,CAAI,IAAlB,MAAAG,EAAqB,KAAK,CAACC,EAAIC,IAAOD,EAAG,SAAWC,EAAG,WAEvDC,EAAA,KAAK,OAAL,MAAAA,EAAW,UAAUN,EAAMN,EAAIO,EAChC,CAOD,aAAaD,EAAMN,EAAI,CACjB,KAAK,SAASM,CAAI,IAEpB,KAAK,SAASA,CAAI,EAAI,KAAK,SAASA,CAAI,EAAE,OAAOO,GAAWA,EAAO,KAAOb,CAAG,GAG3E,KAAK,MACP,KAAK,KAAK,aAAaM,EAAMN,CAAE,CAElC,CAQD,aAAaM,KAASQ,EAAM,OAC1B,OAAAN,EAAA,KAAK,SAASF,CAAI,IAAlB,MAAAE,EAAqB,QAASK,GAAW,CAEvCC,EAAK,CAAC,EAAID,EAAO,GAAG,MAAM,KAAMC,CAAI,CAC1C,GACWA,EAAK,CAAC,CACd,CAOD,GAAGR,EAAMN,EAAI,SACN,KAAK,WAAWM,CAAI,IACvB,KAAK,WAAWA,CAAI,EAAI,KAE1BE,EAAA,KAAK,WAAWF,CAAI,IAApB,MAAAE,EAAuB,KAAKR,IAK5BS,EAAA,KAAK,OAAL,MAAAA,EAAW,GAAGH,EAAMN,EACrB,CAOD,IAAIM,EAAMN,EAAI,OACR,KAAK,WAAWM,CAAI,IAEtB,KAAK,WAAWA,CAAI,EAAI,KAAK,WAAWA,CAAI,EAAE,OAAOS,GAAaf,IAAOe,CAAS,IAGpFP,EAAA,KAAK,OAAL,MAAAA,EAAW,IAAIF,EAAMN,EACtB,CAQD,SAASM,EAAMF,EAAS,OACtB,GAAI,KAAK,KACP,OAAO,KAAK,KAAK,SAASE,EAAMF,CAAO,EAGzC,MAAMY,EAA0C,IAAId,EAAgBI,EAAMF,CAAO,EAEjF,OAAAI,EAAA,KAAK,WAAWF,CAAI,IAApB,MAAAE,EAAuB,QAASO,GAAa,CAC3CA,EAAS,KAAK,KAAMC,CAAK,CAC/B,GAEWA,CACR,CACH,CAEA,MAAMC,CAAY,CAKhB,YAAYC,EAAUC,EAAW,CAU/B,GANA,KAAK,QAAU1C,EACb,mCACAyC,EAAW,MAAQ,MACnBC,CACN,EAEQD,EAAU,CACZ,MAAME,EAAyC,KAAK,QACpDA,EAAM,SAAW,QACjBA,EAAM,IAAM,GACZA,EAAM,IAAMF,EACZE,EAAM,aAAa,OAAQ,cAAc,CAC1C,CAED,KAAK,QAAQ,aAAa,cAAe,MAAM,CAChD,CAMD,iBAAiBC,EAAOC,EAAQ,CACzB,KAAK,UAIN,KAAK,QAAQ,UAAY,OAI3BnC,EAAe,KAAK,QAAS,IAAK,MAAM,EACxC,KAAK,QAAQ,MAAM,gBAAkB,MACrC,KAAK,QAAQ,MAAM,UAAYL,EAAkB,EAAG,EAAGuC,EAAQ,GAAG,GAElElC,EAAe,KAAK,QAASkC,EAAOC,CAAM,EAE7C,CAED,SAAU,QACJd,EAAA,KAAK,UAAL,MAAAA,EAAc,YAChB,KAAK,QAAQ,SAEf,KAAK,QAAU,IAChB,CACH,CAOA,MAAMe,CAAQ,CAMZ,YAAYC,EAAUC,EAAUC,EAAO,CACrC,KAAK,SAAWD,EAChB,KAAK,KAAOD,EACZ,KAAK,MAAQE,EAGb,KAAK,QAAU,OAEf,KAAK,YAAc,OAEnB,KAAK,MAAQ,OAEb,KAAK,oBAAsB,EAC3B,KAAK,qBAAuB,EAE5B,KAAK,MAAQ,OAAO,KAAK,KAAK,CAAC,GAAK,OAAO,KAAK,KAAK,KAAK,GAAK,EAC/D,KAAK,OAAS,OAAO,KAAK,KAAK,CAAC,GAAK,OAAO,KAAK,KAAK,MAAM,GAAK,EAEjE,KAAK,WAAa,GAClB,KAAK,SAAW,GAChB,KAAK,WAAa,GAElB,KAAK,MAAQpC,EAAW,KAEpB,KAAK,KAAK,KACZ,KAAK,KAAO,KAAK,KAAK,KACb,KAAK,KAAK,IACnB,KAAK,KAAO,QAEZ,KAAK,KAAO,OAGd,KAAK,SAAS,SAAS,cAAe,CAAE,QAAS,IAAI,CAAE,CACxD,CAED,mBAAoB,CACd,KAAK,aAAe,CAAC,KAAK,gBAAe,GAE3C,WAAW,IAAM,CACX,KAAK,cACP,KAAK,YAAY,UACjB,KAAK,YAAc,OAEtB,EAAE,GAAI,CAEV,CAQD,KAAKqC,EAAQC,EAAQ,CACnB,GAAI,KAAK,OAAS,KAAK,eAAc,EACnC,GAAK,KAAK,YAYH,CACL,MAAMC,EAAgB,KAAK,YAAY,QAEnCA,GAAiB,CAACA,EAAc,eAClC,KAAK,MAAM,UAAU,QAAQA,CAAa,CAE7C,KAlBsB,CACrB,MAAMC,EAAiB,KAAK,SAAS,aACnC,iBAGC,KAAK,KAAK,MAAQ,KAAK,MAAM,aAAgB,KAAK,KAAK,KAAO,GAC/D,IACV,EACQ,KAAK,YAAc,IAAIb,EACrBa,EACA,KAAK,MAAM,SACrB,CACA,CASQ,KAAK,SAAW,CAACF,GAIjB,KAAK,SAAS,SAAS,cAAe,CAAE,QAAS,KAAM,OAAAD,EAAQ,EAAE,mBAIjE,KAAK,kBACP,KAAK,QAAUlD,EAAc,YAAa,KAAK,EAG3C,KAAK,qBACP,KAAK,UAAUkD,CAAM,IAGvB,KAAK,QAAUlD,EAAc,gBAAiB,KAAK,EACnD,KAAK,QAAQ,UAAY,KAAK,KAAK,MAAQ,IAGzCmD,GAAU,KAAK,OACjB,KAAK,MAAM,kBAAkB,EAAI,EAEpC,CAOD,UAAUD,EAAQ,CAChB,GAAI,CAAC,KAAK,eAAgB,GACrB,CAAC,KAAK,SACN,KAAK,SAAS,SAAS,mBAAoB,CAAE,QAAS,KAAM,OAAAA,EAAQ,EAAE,iBACzE,OAGF,MAAMI,EAA8C,KAAK,QAEzD,KAAK,kBAAiB,EAElB,KAAK,KAAK,SACZA,EAAa,OAAS,KAAK,KAAK,QAGlCA,EAAa,IAAM,KAAK,KAAK,KAAO,GACpCA,EAAa,IAAM,KAAK,KAAK,KAAO,GAEpC,KAAK,MAAQzC,EAAW,QAEpByC,EAAa,SACf,KAAK,SAAQ,GAEbA,EAAa,OAAS,IAAM,CAC1B,KAAK,SAAQ,CACrB,EAEMA,EAAa,QAAU,IAAM,CAC3B,KAAK,QAAO,CACpB,EAEG,CAOD,SAASC,EAAO,CACd,KAAK,MAAQA,EACb,KAAK,SAAW,GAChB,KAAK,SAAWA,EAAM,IAGvB,CAKD,UAAW,CACT,KAAK,MAAQ1C,EAAW,OAEpB,KAAK,OAAS,KAAK,UACrB,KAAK,SAAS,SAAS,eAAgB,CAAE,MAAO,KAAK,MAAO,QAAS,IAAI,CAAE,EAGvE,KAAK,MAAM,UACR,KAAK,MAAM,eACX,CAAC,KAAK,QAAQ,aACnB,KAAK,OAAM,EACX,KAAK,MAAM,kBAAkB,EAAI,IAG/B,KAAK,QAAUA,EAAW,QAAU,KAAK,QAAUA,EAAW,QAChE,KAAK,kBAAiB,EAG3B,CAKD,SAAU,CACR,KAAK,MAAQA,EAAW,MAEpB,KAAK,QACP,KAAK,aAAY,EACjB,KAAK,SAAS,SAAS,eAAgB,CAAE,MAAO,KAAK,MAAO,QAAS,GAAM,QAAS,IAAM,GAC1F,KAAK,SAAS,SAAS,YAAa,CAAE,MAAO,KAAK,MAAO,QAAS,IAAI,CAAE,EAE3E,CAKD,WAAY,CACV,OAAO,KAAK,SAAS,aACnB,mBACA,KAAK,QAAUA,EAAW,QAC1B,IACN,CACG,CAKD,SAAU,CACR,OAAO,KAAK,QAAUA,EAAW,KAClC,CAKD,gBAAiB,CACf,OAAO,KAAK,OAAS,OACtB,CAQD,iBAAiB+B,EAAOC,EAAQ,CAC9B,GAAK,KAAK,UAIN,KAAK,aACP,KAAK,YAAY,iBAAiBD,EAAOC,CAAM,EAG7C,MAAK,SAAS,SAChB,gBACA,CAAE,QAAS,KAAM,MAAAD,EAAO,OAAAC,CAAM,CAAE,EAAE,mBAKpCnC,EAAe,KAAK,QAASkC,EAAOC,CAAM,EAEtC,KAAK,eAAc,GAAM,CAAC,KAAK,QAAO,IAAI,CAC5C,MAAMW,EAAuB,CAAC,KAAK,qBAAuBZ,EAE1D,KAAK,oBAAsBA,EAC3B,KAAK,qBAAuBC,EAExBW,EACF,KAAK,UAAU,EAAK,EAEpB,KAAK,kBAAiB,EAGpB,KAAK,OACP,KAAK,SAAS,SACZ,kBACA,CAAE,MAAO,KAAK,MAAO,MAAAZ,EAAO,OAAAC,EAAQ,QAAS,IAAM,CAC7D,CAEK,CACF,CAKD,YAAa,CACX,OAAO,KAAK,SAAS,aACnB,oBACA,KAAK,eAAc,GAAO,KAAK,QAAUhC,EAAW,MACpD,IACN,CACG,CAKD,mBAAoB,CAMlB,GAAI,CAAC,KAAK,eAAc,GAAM,CAAC,KAAK,SAAW,CAAC,KAAK,KAAK,OACxD,OAGF,MAAM4C,EAAuC,KAAK,QAC5CC,EAAa,KAAK,SAAS,aAC/B,mBACA,KAAK,oBACL,IACN,GAGM,CAACD,EAAM,QAAQ,iBACZC,EAAa,SAASD,EAAM,QAAQ,gBAAiB,EAAE,KAE1DA,EAAM,MAAQC,EAAa,KAC3BD,EAAM,QAAQ,gBAAkB,OAAOC,CAAU,EAEpD,CAKD,gBAAiB,CACf,OAAO,KAAK,SAAS,aACnB,wBACA,KAAK,eAAgB,EACrB,IACN,CACG,CAKD,UAAW,CACL,KAAK,SAAS,SAAS,kBAAmB,CAAE,QAAS,KAAM,EAAE,kBAIjE,KAAK,KAAK,EAAI,CACf,CAKD,iBAAkB,CAChB,OAAO,KAAK,SAAS,aACnB,uBACA,KAAK,UAAW,EAChB,IACN,CACG,CAKD,SAAU,CACR,KAAK,SAAW,GAChB,KAAK,MAAQ,OAET,MAAK,SAAS,SAAS,iBAAkB,CAAE,QAAS,KAAM,EAAE,mBAIhE,KAAK,OAAM,EAEP,KAAK,cACP,KAAK,YAAY,UACjB,KAAK,YAAc,QAGjB,KAAK,kBAAoB,KAAK,UAChC,KAAK,QAAQ,OAAS,KACtB,KAAK,QAAQ,QAAU,KACvB,KAAK,QAAU,QAElB,CAKD,cAAe,OACb,GAAI,KAAK,MAAO,CACd,IAAIC,EAAa3D,EAAc,kBAAmB,KAAK,EACvD2D,EAAW,YAAY5B,EAAA,KAAK,SAAS,UAAd,YAAAA,EAAuB,WAAY,GAC1D4B,EAA4C,KAAK,SAAS,aACxD,sBACAA,EACA,IACR,EACM,KAAK,QAAU3D,EAAc,0CAA2C,KAAK,EAC7E,KAAK,QAAQ,YAAY2D,CAAU,EACnC,KAAK,MAAM,UAAU,UAAY,GACjC,KAAK,MAAM,UAAU,YAAY,KAAK,OAAO,EAC7C,KAAK,MAAM,kBAAkB,EAAI,EACjC,KAAK,kBAAiB,CACvB,CACF,CAKD,QAAS,CACP,GAAI,KAAK,YAAc,CAAC,KAAK,QAC3B,OAKF,GAFA,KAAK,WAAa,GAEd,KAAK,QAAU9C,EAAW,MAAO,CACnC,KAAK,aAAY,EACjB,MACD,CAED,GAAI,KAAK,SAAS,SAAS,gBAAiB,CAAE,QAAS,KAAM,EAAE,iBAC7D,OAGF,MAAM+C,EAAkB,WAAY,KAAK,QAErC,KAAK,iBAaHA,GAAkB,KAAK,QAAU,CAAC,KAAK,MAAM,UAAYpC,EAAQ,IACnE,KAAK,WAAa,GAIjB,KAAK,QAAS,OAAQ,EAAC,MAAM,IAAM,CAAE,GAAE,QAAQ,IAAM,CACpD,KAAK,WAAa,GAClB,KAAK,YAAW,CAC1B,CAAS,GAED,KAAK,YAAW,EAET,KAAK,OAAS,CAAC,KAAK,QAAQ,YACrC,KAAK,MAAM,UAAU,YAAY,KAAK,OAAO,CAEhD,CAOD,UAAW,CACL,KAAK,SAAS,SAAS,kBAAmB,CAAE,QAAS,IAAM,GAAE,kBAC5D,CAAC,KAAK,QAIP,KAAK,eAAgB,GAAI,KAAK,YAAc,CAACA,IAG/C,KAAK,YAAW,EACP,KAAK,WACd,KAAK,KAAK,GAAO,EAAI,EAGnB,KAAK,MAAM,eACb,KAAK,MAAM,cAAc,aAAa,cAAe,OAAO,EAE/D,CAKD,YAAa,CACX,KAAK,SAAS,SAAS,oBAAqB,CAAE,QAAS,IAAI,CAAE,EACzD,KAAK,OAAS,KAAK,MAAM,eAC3B,KAAK,MAAM,cAAc,aAAa,cAAe,MAAM,CAE9D,CAMD,QAAS,CACP,KAAK,WAAa,GAEd,MAAK,SAAS,SAAS,gBAAiB,CAAE,QAAS,KAAM,EAAE,mBAI3D,KAAK,SAAW,KAAK,QAAQ,YAC/B,KAAK,QAAQ,SAGX,KAAK,aAAe,KAAK,YAAY,SACvC,KAAK,YAAY,QAAQ,SAE5B,CAKD,aAAc,CACP,KAAK,aAIN,KAAK,SAAS,SAAS,qBAAsB,CAAE,QAAS,KAAM,EAAE,mBAKhE,KAAK,OAAS,KAAK,SAAW,CAAC,KAAK,QAAQ,YAC9C,KAAK,MAAM,UAAU,YAAY,KAAK,OAAO,GAG3C,KAAK,QAAUX,EAAW,QAAU,KAAK,QAAUA,EAAW,QAChE,KAAK,kBAAiB,GAEzB,CACH,CAYA,SAASgD,EAAgBC,EAASC,EAAM,CACtC,GAAID,EAAQ,kBAAmB,CAC7B,MAAME,EAAkBF,EAAQ,kBAAkBA,EAASC,CAAI,EAC/D,GAAIC,EACF,OAAOA,CAEV,CAED,MAAO,CACL,EAAG,SAAS,gBAAgB,YAM5B,EAAG,OAAO,WACd,CACA,CAqCA,SAASC,EAAmBC,EAAMJ,EAASK,EAAcpB,EAAUE,EAAO,CACxE,IAAImB,EAAe,EAEnB,GAAIN,EAAQ,UACVM,EAAeN,EAAQ,UAAUK,EAAcpB,EAAUE,CAAK,EAAEiB,CAAI,UAC3DJ,EAAQ,QACjBM,EAAeN,EAAQ,QAAQI,CAAI,MAC9B,CACL,MAAMG,EAAiB,UAAYH,EAAK,CAAC,EAAE,YAAW,EAAKA,EAAK,MAAM,CAAC,EAEnEJ,EAAQO,CAAc,IAExBD,EAAeN,EAAQO,CAAc,EAExC,CAED,OAAO,OAAOD,CAAY,GAAK,CACjC,CASA,SAASE,EAAeR,EAASK,EAAcpB,EAAUE,EAAO,CAC9D,MAAO,CACL,EAAGkB,EAAa,EACZF,EAAmB,OAAQH,EAASK,EAAcpB,EAAUE,CAAK,EACjEgB,EAAmB,QAASH,EAASK,EAAcpB,EAAUE,CAAK,EACtE,EAAGkB,EAAa,EACZF,EAAmB,MAAOH,EAASK,EAAcpB,EAAUE,CAAK,EAChEgB,EAAmB,SAAUH,EAASK,EAAcpB,EAAUE,CAAK,CAC3E,CACA,CAEA,MAAMsB,EAAkB,IAaxB,MAAMC,CAAU,CAOd,YAAYV,EAASf,EAAUE,EAAOc,EAAM,CAC1C,KAAK,KAAOA,EACZ,KAAK,QAAUD,EACf,KAAK,SAAWf,EAChB,KAAK,MAAQE,EAEb,KAAK,YAAc,KAEnB,KAAK,YAAc,KACnB,KAAK,IAAM,EACX,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,QAAU,EACf,KAAK,UAAY,EACjB,KAAK,IAAM,EACX,KAAK,IAAM,CACZ,CAWD,OAAOwB,EAAUC,EAAWC,EAAa,CAEvC,MAAMC,EAAc,CAAE,EAAGH,EAAU,EAAGC,CAAS,EAC/C,KAAK,YAAcE,EACnB,KAAK,YAAcD,EAEnB,MAAME,EAASF,EAAY,EAAIC,EAAY,EACrCE,EAASH,EAAY,EAAIC,EAAY,EAE3C,KAAK,IAAM,KAAK,IAAI,EAAGC,EAASC,EAASD,EAASC,CAAM,EACxD,KAAK,KAAO,KAAK,IAAI,EAAGD,EAASC,EAASD,EAASC,CAAM,EAIzD,KAAK,MAAQ,KAAK,IAAI,EAAGA,CAAM,EAE/B,KAAK,QAAU,KAAK,cACpB,KAAK,UAAY,KAAK,gBACtB,KAAK,IAAM,KAAK,IACd,KAAK,QACL,KAAK,UACL,KAAK,QAAS,CACpB,EAEI,KAAK,IAAM,KAAK,IACd,KAAK,IACL,KAAK,QACL,KAAK,SACX,EAEQ,KAAK,MACP,KAAK,KAAK,SAAS,mBAAoB,CAAE,WAAY,KAAM,UAAW,KAAK,QAAQ,CAAE,CAExF,CASD,sBAAsBC,EAAc,CAClC,MAAMC,EACJD,EAAe,YAEXE,EAAc,KAAK,QAAQD,CAAU,EAE3C,GAAKC,EAIL,OAAI,OAAOA,GAAgB,WAClBA,EAAY,IAAI,EAGrBA,IAAgB,OACX,KAAK,KAGVA,IAAgB,MACX,KAAK,IAGP,OAAOA,CAAW,CAC1B,CAWD,eAAgB,CACd,IAAIC,EAAgB,KAAK,sBAAsB,WAAW,EAE1D,OAAIA,IAKJA,EAAgB,KAAK,IAAI,EAAG,KAAK,IAAM,CAAC,EAEpC,KAAK,aAAeA,EAAgB,KAAK,YAAY,EAAIX,IAC3DW,EAAgBX,EAAkB,KAAK,YAAY,GAG9CW,EACR,CAQD,aAAc,CACZ,OAAO,KAAK,sBAAsB,SAAS,GAAK,KAAK,GACtD,CAUD,SAAU,CAGR,OAAO,KAAK,sBAAsB,KAAK,GAAK,KAAK,IAAI,EAAG,KAAK,IAAM,CAAC,CACrE,CACH,CAYA,SAASC,EAAapC,EAAUC,EAAUC,EAAO,CAC/C,MAAMmC,EAAUpC,EAAS,sBAAsBD,EAAUE,CAAK,EAE9D,IAAIoC,EAEJ,KAAM,CAAE,QAAAvB,CAAS,EAAGd,EAIpB,GAAIc,EAAS,CACXuB,EAAY,IAAIb,EAAUV,EAASf,EAAU,EAAE,EAE/C,IAAIoB,EACAnB,EAAS,KACXmB,EAAenB,EAAS,KAAK,aAE7BmB,EAAeN,EAAgBC,EAASd,CAAQ,EAGlD,MAAM2B,EAAcL,EAAeR,EAASK,EAAcpB,EAAUE,CAAK,EACzEoC,EAAU,OAAOD,EAAQ,MAAOA,EAAQ,OAAQT,CAAW,CAC5D,CAED,OAAAS,EAAQ,SAAQ,EAEZC,GACFD,EAAQ,iBACN,KAAK,KAAKA,EAAQ,MAAQC,EAAU,OAAO,EAC3C,KAAK,KAAKD,EAAQ,OAASC,EAAU,OAAO,CAClD,EAGSD,CACT,CAcA,SAASE,EAAcrC,EAAOD,EAAU,CACtC,MAAMD,EAAWC,EAAS,YAAYC,CAAK,EAE3C,GAAI,CAAAD,EAAS,SAAS,gBAAiB,CAAE,MAAAC,EAAO,SAAAF,CAAQ,CAAE,EAAE,iBAI5D,OAAOoC,EAAapC,EAAUC,EAAUC,CAAK,CAC/C,CASA,MAAMsC,UAAuB3D,CAAU,CAMrC,aAAc,OACZ,IAAI4D,EAAW,EACf,MAAMC,GAAa1D,EAAA,KAAK,UAAL,YAAAA,EAAc,WAE7B0D,GAAc,WAAYA,EAE5BD,EAAWC,EAAW,OACbA,GAAc,YAAaA,IAE/BA,EAAW,QACdA,EAAW,MAAQ,KAAK,uBAAuBA,EAAW,OAAO,GAG/DA,EAAW,QACbD,EAAWC,EAAW,MAAM,SAKhC,MAAMlD,EAAQ,KAAK,SAAS,WAAY,CACtC,WAAAkD,EACA,SAAAD,CACN,CAAK,EACD,OAAO,KAAK,aAAa,WAAYjD,EAAM,SAAUkD,CAAU,CAChE,CAOD,sBAAsBC,EAAWzC,EAAO,CACtC,OAAO,IAAIH,EAAQ4C,EAAW,KAAMzC,CAAK,CAC1C,CAYD,YAAYA,EAAO,OACjB,MAAMwC,GAAa1D,EAAA,KAAK,UAAL,YAAAA,EAAc,WAEjC,IAAI4D,EAAiB,GACjB,MAAM,QAAQF,CAAU,EAE1BE,EAAiBF,EAAWxC,CAAK,EACxBwC,GAAc,YAAaA,IAM/BA,EAAW,QACdA,EAAW,MAAQ,KAAK,uBAAuBA,EAAW,OAAO,GAGnEE,EAAiBF,EAAW,MAAMxC,CAAK,GAGzC,IAAIF,EAAW4C,EAEX5C,aAAoB,UACtBA,EAAW,KAAK,sBAAsBA,CAAQ,GAKhD,MAAMR,EAAQ,KAAK,SAAS,WAAY,CACtC,SAAUQ,GAAY,CAAE,EACxB,MAAAE,CACN,CAAK,EAED,OAAO,KAAK,aAAa,WAAYV,EAAM,SAAUU,CAAK,CAC3D,CASD,uBAAuB2C,EAAgB,SACrC,OAAI7D,EAAA,KAAK,UAAL,MAAAA,EAAc,WAAYC,EAAA,KAAK,UAAL,MAAAA,EAAc,cACnChB,EACL,KAAK,QAAQ,SACb,KAAK,QAAQ,cACb4E,CACD,GAAI,GAGA,CAACA,CAAc,CACvB,CAQD,sBAAsBC,EAAS,CAE7B,MAAM9C,EAAW,CACf,QAAA8C,CACN,EAEUC,EACJD,EAAQ,UAAY,IAChBA,EACAA,EAAQ,cAAc,GAAG,EAG/B,GAAIC,EAAQ,CAGV/C,EAAS,IAAM+C,EAAO,QAAQ,SAAWA,EAAO,KAE5CA,EAAO,QAAQ,aACjB/C,EAAS,OAAS+C,EAAO,QAAQ,YAGnC/C,EAAS,MAAQ+C,EAAO,QAAQ,UAAY,SAASA,EAAO,QAAQ,UAAW,EAAE,EAAI,EACrF/C,EAAS,OAAS+C,EAAO,QAAQ,WAAa,SAASA,EAAO,QAAQ,WAAY,EAAE,EAAI,EAGxF/C,EAAS,EAAIA,EAAS,MACtBA,EAAS,EAAIA,EAAS,OAElB+C,EAAO,QAAQ,WACjB/C,EAAS,KAAO+C,EAAO,QAAQ,UAGjC,MAAMC,EAAcF,EAAQ,cAAc,KAAK,EAE3CE,IAGFhD,EAAS,KAAOgD,EAAY,YAAcA,EAAY,IACtDhD,EAAS,IAAMgD,EAAY,aAAa,KAAK,GAAK,KAGhDD,EAAO,QAAQ,aAAeA,EAAO,QAAQ,WAC/C/C,EAAS,aAAe,GAE3B,CAED,OAAO,KAAK,aAAa,cAAeA,EAAU8C,EAASC,CAAM,CAClE,CASD,aAAa/C,EAAUE,EAAO,CAC5B,OAAOkC,EAAapC,EAAU,KAAME,CAAK,CAC1C,CACH,CAmCA,MAAM+C,UAA2BT,CAAe,CAI9C,YAAYzB,EAAS,CACnB,QAEA,KAAK,QAAUA,GAAW,GAC1B,KAAK,KAAO,EACZ,KAAK,WAAa,GAKlB,KAAK,kBAAoB,OAEzB,KAAK,kBAAoB,KAAK,kBAAkB,KAAK,IAAI,CAC1D,CAMD,MAAO,CAEL9C,EAAsB,KAAK,QAAQ,QAAS,KAAK,QAAQ,eAAe,EACrE,QAAS4E,GAAmB,CAC3BA,EAAe,iBAAiB,QAAS,KAAK,kBAAmB,EAAK,CAC9E,CAAO,CACJ,CAKD,kBAAkB,EAAG,CAEnB,GAAI9E,EAAe,CAAC,GACb,OAAO,MACP,OAAO,UAAU,SAAW,GACjC,OAWF,IAAImF,EAAe,CAAE,EAAG,EAAE,QAAS,EAAG,EAAE,SAEpC,CAACA,EAAa,GAAK,CAACA,EAAa,IACnCA,EAAe,MAGjB,IAAIC,EAAe,KAAK,gBAAgB,CAAC,EACzCA,EAAe,KAAK,aAAa,eAAgBA,EAAc,EAAG,IAAI,EAEtE,MAAMT,EAAa,CACjB,QAAqC,EAAE,aAC7C,EAEQS,GAAgB,IAClB,EAAE,eAAc,EAChB,KAAK,YAAYA,EAAcT,EAAYQ,CAAY,EAE1D,CAQD,gBAAgB,EAAG,CAEjB,GAAI,KAAK,QAAQ,kBACf,OAAO,KAAK,QAAQ,kBAAkB,KAAK,KAAM,CAAC,EAGpD,MAAME,EAA4C,EAAE,OAM9CC,EALgBpF,EACpB,KAAK,QAAQ,SACb,KAAK,QAAQ,cACe,EAAE,aACpC,EAC4C,UACtCqF,GAASA,IAAUF,GAAiBE,EAAM,SAASF,CAAa,CACtE,EAEI,OAAIC,IAAsB,GACjBA,EACE,KAAK,QAAQ,UAAY,KAAK,QAAQ,cAExC,GAIF,CACR,CAUD,YAAYnD,EAAOwC,EAAYQ,EAAc,CAE3C,OAAI,OAAO,KACF,IAIT,KAAK,QAAQ,MAAQhD,EAGrB,KAAK,QAAQ,kBAAoBgD,EAEjC,KAAK,WAAa,GAClB,KAAK,QAAQhD,EAAOwC,CAAU,EACvB,GACR,CAQD,QAAQxC,EAAOwC,EAAY,CACzB,KAAM,CAAE,QAAA3B,CAAS,EAAG,KAEhB2B,IACF3B,EAAQ,WAAa2B,GAKvB,MAAMa,EAAe,GAEfC,EAAiB,OAAOzC,EAAQ,WACtC,GAAIxC,EAAYwC,EAAQ,UAAU,EAChCwC,EAAa,KAAK,QAAQ,QAAyCxC,EAAQ,UAAU,CAAE,MAClF,IAAIyC,IAAmB,SAC5B,MAAM,IAAI,MAAM,6CAA6C,EACxD,GAAIA,IAAmB,WAC5BD,EAAa,KAAqDxC,EAAQ,WAAa,OAEvF,OAAM,IAAI,MAAM,yBAAyB,EAIvC,OAAOA,EAAQ,aAAgB,YAEjCwC,EAAa,KAAKxC,EAAQ,YAAa,GAGrCA,EAAQ,oBAAsB,IAASb,GAAS,IAClD,KAAK,kBAAoBqC,EAAcrC,EAAO,IAAI,GAIpD,MAAMuD,EAAM,EAAE,KAAK,KACnB,QAAQ,IAAIF,CAAY,EAAE,KAAMG,GAAoB,CAClD,GAAI,KAAK,WAAY,CACnB,MAAMC,EAAaD,EAAgB,CAAC,EACpC,KAAK,gBAAgBC,EAAYF,CAAG,CACrC,CACP,CAAK,CACF,CAOD,gBAAgBG,EAAQH,EAAK,CAa3B,GAPIA,IAAQ,KAAK,MAAQ,KAAK,aAI9B,KAAK,WAAa,GAGd,OAAO,MACT,OAQF,MAAMzC,EAAO,OAAO4C,GAAW,SACzB,IAAIA,EAAO,QAAQ,KAAK,OAAO,EAC/B,IAAIA,EAAO,KAAK,OAAO,EAE7B,KAAK,KAAO5C,EACZ,OAAO,KAAOA,EAIb,OAAO,KAAK,KAAK,UAAU,EAAG,QAASlC,GAAS,QAC/CE,EAAA,KAAK,WAAWF,CAAI,IAApB,MAAAE,EAAuB,QAASR,GAAO,CACrCwC,EAAK,GAAGlC,EAAgDN,EAChE,EACA,CAAK,EAIA,OAAO,KAAK,KAAK,QAAQ,EAAG,QAASM,GAAS,QAC7CE,EAAA,KAAK,SAASF,CAAI,IAAlB,MAAAE,EAAqB,QAASK,GAAW,CACvC2B,EAAK,UAAUlC,EAAMO,EAAO,GAAIA,EAAO,QAAQ,CACvD,EACA,CAAK,EAEG,KAAK,oBACP2B,EAAK,cAAc,WAAW,KAAK,iBAAiB,EACpD,KAAK,kBAAoB,QAG3BA,EAAK,GAAG,UAAW,IAAM,CAEvB,KAAK,KAAO,OACZ,OAAO,OAAO,IACpB,CAAK,EAEDA,EAAK,KAAI,CACV,CAKD,SAAU,QACRhC,EAAA,KAAK,OAAL,MAAAA,EAAW,UAEX,KAAK,WAAa,GAClB,KAAK,WAAa,GAElBf,EAAsB,KAAK,QAAQ,QAAS,KAAK,QAAQ,eAAe,EACrE,QAAS4E,GAAmB,CAC3BA,EAAe,oBAAoB,QAAS,KAAK,kBAAmB,EAAK,CACjF,CAAO,CACJ,CACH,CC3yDK,MAAAgB,EAAU,CACb,KAAM,YACN,MAAO,CACL,OAAQ,CACN,KAAM,MACN,SAAU,EACX,EACD,iBAAkB,CAChB,KAAM,QACN,QAAS,EACX,CACD,EACD,MAAO,CAAC,QAAQ,EAChB,MAAO,CACL,MAAO,CACL,QAAS,KACT,aAAc,EACf,CACF,EACD,SAAU,CACR,OAAQ,CACN,OAAI,KAAK,iBACA,KAAK,aAAa,IAAIC,IAAQ,CACnC,IAAKA,EAAI,IACT,EAAGA,EAAI,EACP,EAAGA,EAAI,CACT,EAAE,EAEG,KAAK,OAAO,IAAIpD,GAEnB,CAAC,YAAa,aAAc,WAAW,EAAE,SAASA,EAAM,YAAY,EAE7D,CACL,IAAKA,EAAM,KACX,EAAG,KACH,EAAG,IACJ,EAEI,IACR,CACF,EACD,mBAAoB,CAClB,OAAO1C,GACD,KAAK,iBACAA,EAAE,OAGT,OAAO,UAAU,cACjB,KAAK,sCAAqC,CAGhD,CACD,EACD,SAAU,CACR,OAAO,iBAAiB,eAAgB,KAAK,SAAS,CACvD,EACD,WAAY,CACV,OAAO,oBAAoB,eAAgB,KAAK,SAAS,CAC1D,EACD,QAAS,CACP,uCAAwC,CACtC,OAAO,MAAM,KACX,SAAS,iBAAiB,uCAAuC,GACjE,OAAO,CAAC8E,EAAS5C,IAEfA,EAAQ,OAAO,UAAU,gBACxB,CAAC,CAAC4C,EAAQ,cAAc,OAAO,GAC9B,CAAC,CAACA,EAAQ,cAAc,kBAAkB,GAC1C,CAAC,CAACA,EAAQ,cAAc,yCAAyC,EAEtE,EAAE,MACJ,EACD,UAAUiB,EAAK,CACb,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,MAAMH,EAAM,IAAI,MAChBA,EAAI,OAAS,IACXE,EAAQ,CACN,IAAKD,EACL,EAAGD,EAAI,aACP,EAAGA,EAAI,aACT,CAAC,EACHA,EAAI,QAAUG,EACdH,EAAI,IAAMC,CACZ,CAAC,CACF,EACD,iBAAkB,CAChB,OAAI,KAAK,iBACA,QAAQ,IAAI,KAAK,OAAO,IAAI,KAAK,SAAS,CAAC,EAC/C,KAAKG,GAAW,CACf,KAAK,aAAeA,CACrB,GACA,MAAMC,GAAS,CACd,QAAQ,MAAMA,CAAK,CACrB,CAAC,EAEE,QAAQ,IAAI,KAAK,MAAM,CAC/B,EACD,UAAUnG,EAAG,CACX,MAAMX,EAAK,SAAS,iBAAiB,OAAO,EAAE,CAAC,EACzC+G,EAAoB,KAAK,kBAAkBpG,CAAC,EAElD,KAAK,kBAAkB,KAAK,IAAM,CAChC,KAAK,QAAU,IAAIiF,EAAmB,CACpC,QAAS5F,EACT,WAAY,KAAK,MAAM,OAAO,OAAO,EACrC,WAAY,UAAM,OAAO,8BAAY,EAAC,IACtC,UAAW,EACX,QAAS,CAAE,IAAK,GAAI,OAAQ,GAAI,KAAM,GAAI,MAAO,EAAI,EACrD,KAAM,EACR,CAAC,EACD,KAAK,QAAQ,GAAG,QAAS,IAAM,CAC7B,KAAK,MAAM,QAAQ,CACrB,CAAC,EACD,KAAK,QAAQ,KAAM,EACnB,KAAK,QAAQ,YAAY+G,CAAiB,CAC5C,CAAC,CACH,CACF,CACF","names":["createElement","className","tagName","appendToEl","el","toTransformString","x","y","scale","propValue","setWidthHeight","w","h","LOAD_STATE","specialKeyUsed","e","getElementsFromOption","option","legacySelector","parent","elements","selector","isPswpClass","fn","isSafari","PhotoSwipeEvent","type","details","Eventable","name","priority","_a","_b","f1","f2","_c","filter","args","listener","event","Placeholder","imageSrc","container","imgEl","width","height","Content","itemData","instance","index","isLazy","reload","placeholderEl","placeholderSrc","imageElement","slide","isInitialSizeUpdate","image","sizesWidth","errorMsgEl","supportsDecode","getViewportSize","options","pswp","newViewportSize","parsePaddingOption","prop","viewportSize","paddingValue","legacyPropName","getPanAreaSize","MAX_IMAGE_WIDTH","ZoomLevel","maxWidth","maxHeight","panAreaSize","elementSize","hRatio","vRatio","optionPrefix","optionName","optionValue","currZoomLevel","lazyLoadData","content","zoomLevel","lazyLoadSlide","PhotoSwipeBase","numItems","dataSource","slideData","dataSourceItem","galleryElement","element","linkEl","thumbnailEl","PhotoSwipeLightbox","initialPoint","clickedIndex","clickedTarget","clickedChildIndex","child","promiseArray","pswpModuleType","uid","iterableModules","mainModule","module","_sfc_main","img","url","resolve","reject","results","error","currentImageIndex"],"ignoreList":[0],"sources":["../../../node_modules/photoswipe/dist/photoswipe-lightbox.esm.js","../../../app/javascript/pages/ImageZoom.vue"],"sourcesContent":["/*!\n * PhotoSwipe Lightbox 5.3.7 - https://photoswipe.com\n * (c) 2023 Dmytro Semenov\n */\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\r\nfunction createElement(className, tagName, appendToEl) {\r\n const el = document.createElement(tagName);\r\n if (className) {\r\n el.className = className;\r\n }\r\n if (appendToEl) {\r\n appendToEl.appendChild(el);\r\n }\r\n return el;\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n * @returns {string}\r\n */\r\nfunction toTransformString(x, y, scale) {\r\n let propValue = `translate3d(${x}px,${y || 0}px,0)`;\r\n\r\n if (scale !== undefined) {\r\n propValue += ` scale3d(${scale},${scale},1)`;\r\n }\r\n\r\n return propValue;\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nfunction setWidthHeight(el, w, h) {\r\n el.style.width = (typeof w === 'number') ? `${w}px` : w;\r\n el.style.height = (typeof h === 'number') ? `${h}px` : h;\r\n}\r\n\r\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\r\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\r\nconst LOAD_STATE = {\r\n IDLE: 'idle',\r\n LOADING: 'loading',\r\n LOADED: 'loaded',\r\n ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n * @returns {boolean}\r\n */\r\nfunction specialKeyUsed(e) {\r\n return ('button' in e && e.button === 1) || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\r\n}\r\n\r\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} [option]\r\n * @param {string} [legacySelector]\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\r\nfunction getElementsFromOption(option, legacySelector, parent = document) {\r\n /** @type {HTMLElement[]} */\r\n let elements = [];\r\n\r\n if (option instanceof Element) {\r\n elements = [option];\r\n } else if (option instanceof NodeList || Array.isArray(option)) {\r\n elements = Array.from(option);\r\n } else {\r\n const selector = typeof option === 'string' ? option : legacySelector;\r\n if (selector) {\r\n elements = Array.from(parent.querySelectorAll(selector));\r\n }\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n * @returns {boolean}\r\n */\r\nfunction isPswpClass(fn) {\r\n return typeof fn === 'function'\r\n && fn.prototype\r\n && fn.prototype.goTo;\r\n}\r\n\r\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction isSafari() {\r\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\r\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thubmnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent : PhotoSwipeEvent & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent) => void} EventCallback\r\n */\r\n\r\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\r\nclass PhotoSwipeEvent {\r\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\r\n constructor(type, details) {\r\n this.type = type;\r\n this.defaultPrevented = false;\r\n if (details) {\r\n Object.assign(this, details);\r\n }\r\n }\r\n\r\n preventDefault() {\r\n this.defaultPrevented = true;\r\n }\r\n}\r\n\r\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\r\nclass Eventable {\r\n constructor() {\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent) => void)[] }}\r\n */\r\n this._listeners = {};\r\n\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter[] }}\r\n */\r\n this._filters = {};\r\n\r\n /** @type {PhotoSwipe | undefined} */\r\n this.pswp = undefined;\r\n\r\n /** @type {PhotoSwipeOptions | undefined} */\r\n this.options = undefined;\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\r\n addFilter(name, fn, priority = 100) {\r\n if (!this._filters[name]) {\r\n this._filters[name] = [];\r\n }\r\n\r\n this._filters[name]?.push({ fn, priority });\r\n this._filters[name]?.sort((f1, f2) => f1.priority - f2.priority);\r\n\r\n this.pswp?.addFilter(name, fn, priority);\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\r\n removeFilter(name, fn) {\r\n if (this._filters[name]) {\r\n // @ts-expect-error\r\n this._filters[name] = this._filters[name].filter(filter => (filter.fn !== fn));\r\n }\r\n\r\n if (this.pswp) {\r\n this.pswp.removeFilter(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters} args\r\n * @returns {Parameters[0]}\r\n */\r\n applyFilters(name, ...args) {\r\n this._filters[name]?.forEach((filter) => {\r\n // @ts-expect-error\r\n args[0] = filter.fn.apply(this, args);\r\n });\r\n return args[0];\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n on(name, fn) {\r\n if (!this._listeners[name]) {\r\n this._listeners[name] = [];\r\n }\r\n this._listeners[name]?.push(fn);\r\n\r\n // When binding events to lightbox,\r\n // also bind events to PhotoSwipe Core,\r\n // if it's open.\r\n this.pswp?.on(name, fn);\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n off(name, fn) {\r\n if (this._listeners[name]) {\r\n // @ts-expect-error\r\n this._listeners[name] = this._listeners[name].filter(listener => (fn !== listener));\r\n }\r\n\r\n this.pswp?.off(name, fn);\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent}\r\n */\r\n dispatch(name, details) {\r\n if (this.pswp) {\r\n return this.pswp.dispatch(name, details);\r\n }\r\n\r\n const event = /** @type {AugmentedEvent} */ (new PhotoSwipeEvent(name, details));\r\n\r\n this._listeners[name]?.forEach((listener) => {\r\n listener.call(this, event);\r\n });\r\n\r\n return event;\r\n }\r\n}\n\nclass Placeholder {\r\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\r\n constructor(imageSrc, container) {\r\n // Create placeholder\r\n // (stretched thumbnail or simple div behind the main image)\r\n /** @type {HTMLImageElement | HTMLDivElement | null} */\r\n this.element = createElement(\r\n 'pswp__img pswp__img--placeholder',\r\n imageSrc ? 'img' : 'div',\r\n container\r\n );\r\n\r\n if (imageSrc) {\r\n const imgEl = /** @type {HTMLImageElement} */ (this.element);\r\n imgEl.decoding = 'async';\r\n imgEl.alt = '';\r\n imgEl.src = imageSrc;\r\n imgEl.setAttribute('role', 'presentation');\r\n }\r\n\r\n this.element.setAttribute('aria-hidden', 'true');\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.element.tagName === 'IMG') {\r\n // Use transform scale() to modify img placeholder size\r\n // (instead of changing width/height directly).\r\n // This helps with performance, specifically in iOS15 Safari.\r\n setWidthHeight(this.element, 250, 'auto');\r\n this.element.style.transformOrigin = '0 0';\r\n this.element.style.transform = toTransformString(0, 0, width / 250);\r\n } else {\r\n setWidthHeight(this.element, width, height);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.element?.parentNode) {\r\n this.element.remove();\r\n }\r\n this.element = null;\r\n }\r\n}\n\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\r\n/** @typedef {import('../util/util.js').LoadState} LoadState */\r\n\r\nclass Content {\r\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\r\n constructor(itemData, instance, index) {\r\n this.instance = instance;\r\n this.data = itemData;\r\n this.index = index;\r\n\r\n /** @type {HTMLImageElement | HTMLDivElement | undefined} */\r\n this.element = undefined;\r\n /** @type {Placeholder | undefined} */\r\n this.placeholder = undefined;\r\n /** @type {Slide | undefined} */\r\n this.slide = undefined;\r\n\r\n this.displayedImageWidth = 0;\r\n this.displayedImageHeight = 0;\r\n\r\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\r\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\r\n\r\n this.isAttached = false;\r\n this.hasSlide = false;\r\n this.isDecoding = false;\r\n /** @type {LoadState} */\r\n this.state = LOAD_STATE.IDLE;\r\n\r\n if (this.data.type) {\r\n this.type = this.data.type;\r\n } else if (this.data.src) {\r\n this.type = 'image';\r\n } else {\r\n this.type = 'html';\r\n }\r\n\r\n this.instance.dispatch('contentInit', { content: this });\r\n }\r\n\r\n removePlaceholder() {\r\n if (this.placeholder && !this.keepPlaceholder()) {\r\n // With delay, as image might be loaded, but not rendered\r\n setTimeout(() => {\r\n if (this.placeholder) {\r\n this.placeholder.destroy();\r\n this.placeholder = undefined;\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n /**\r\n * Preload content\r\n *\r\n * @param {boolean} isLazy\r\n * @param {boolean} [reload]\r\n */\r\n load(isLazy, reload) {\r\n if (this.slide && this.usePlaceholder()) {\r\n if (!this.placeholder) {\r\n const placeholderSrc = this.instance.applyFilters(\r\n 'placeholderSrc',\r\n // use image-based placeholder only for the first slide,\r\n // as rendering (even small stretched thumbnail) is an expensive operation\r\n (this.data.msrc && this.slide.isFirstSlide) ? this.data.msrc : false,\r\n this\r\n );\r\n this.placeholder = new Placeholder(\r\n placeholderSrc,\r\n this.slide.container\r\n );\r\n } else {\r\n const placeholderEl = this.placeholder.element;\r\n // Add placeholder to DOM if it was already created\r\n if (placeholderEl && !placeholderEl.parentElement) {\r\n this.slide.container.prepend(placeholderEl);\r\n }\r\n }\r\n }\r\n\r\n if (this.element && !reload) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentLoad', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.isImageContent()) {\r\n this.element = createElement('pswp__img', 'img');\r\n // Start loading only after width is defined, as sizes might depend on it.\r\n // Due to Safari feature, we must define sizes before srcset.\r\n if (this.displayedImageWidth) {\r\n this.loadImage(isLazy);\r\n }\r\n } else {\r\n this.element = createElement('pswp__content', 'div');\r\n this.element.innerHTML = this.data.html || '';\r\n }\r\n\r\n if (reload && this.slide) {\r\n this.slide.updateContentSize(true);\r\n }\r\n }\r\n\r\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\r\n loadImage(isLazy) {\r\n if (!this.isImageContent()\r\n || !this.element\r\n || this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n const imageElement = /** @type HTMLImageElement */ (this.element);\r\n\r\n this.updateSrcsetSizes();\r\n\r\n if (this.data.srcset) {\r\n imageElement.srcset = this.data.srcset;\r\n }\r\n\r\n imageElement.src = this.data.src ?? '';\r\n imageElement.alt = this.data.alt ?? '';\r\n\r\n this.state = LOAD_STATE.LOADING;\r\n\r\n if (imageElement.complete) {\r\n this.onLoaded();\r\n } else {\r\n imageElement.onload = () => {\r\n this.onLoaded();\r\n };\r\n\r\n imageElement.onerror = () => {\r\n this.onError();\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\r\n setSlide(slide) {\r\n this.slide = slide;\r\n this.hasSlide = true;\r\n this.instance = slide.pswp;\r\n\r\n // todo: do we need to unset slide?\r\n }\r\n\r\n /**\r\n * Content load success handler\r\n */\r\n onLoaded() {\r\n this.state = LOAD_STATE.LOADED;\r\n\r\n if (this.slide && this.element) {\r\n this.instance.dispatch('loadComplete', { slide: this.slide, content: this });\r\n\r\n // if content is reloaded\r\n if (this.slide.isActive\r\n && this.slide.heavyAppended\r\n && !this.element.parentNode) {\r\n this.append();\r\n this.slide.updateContentSize(true);\r\n }\r\n\r\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\r\n this.removePlaceholder();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Content load error handler\r\n */\r\n onError() {\r\n this.state = LOAD_STATE.ERROR;\r\n\r\n if (this.slide) {\r\n this.displayError();\r\n this.instance.dispatch('loadComplete', { slide: this.slide, isError: true, content: this });\r\n this.instance.dispatch('loadError', { slide: this.slide, content: this });\r\n }\r\n }\r\n\r\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\r\n isLoading() {\r\n return this.instance.applyFilters(\r\n 'isContentLoading',\r\n this.state === LOAD_STATE.LOADING,\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * @returns {Boolean} If the content is in error state\r\n */\r\n isError() {\r\n return this.state === LOAD_STATE.ERROR;\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content is image\r\n */\r\n isImageContent() {\r\n return this.type === 'image';\r\n }\r\n\r\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.placeholder) {\r\n this.placeholder.setDisplayedSize(width, height);\r\n }\r\n\r\n if (this.instance.dispatch(\r\n 'contentResize',\r\n { content: this, width, height }).defaultPrevented\r\n ) {\r\n return;\r\n }\r\n\r\n setWidthHeight(this.element, width, height);\r\n\r\n if (this.isImageContent() && !this.isError()) {\r\n const isInitialSizeUpdate = (!this.displayedImageWidth && width);\r\n\r\n this.displayedImageWidth = width;\r\n this.displayedImageHeight = height;\r\n\r\n if (isInitialSizeUpdate) {\r\n this.loadImage(false);\r\n } else {\r\n this.updateSrcsetSizes();\r\n }\r\n\r\n if (this.slide) {\r\n this.instance.dispatch(\r\n 'imageSizeChange',\r\n { slide: this.slide, width, height, content: this }\r\n );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\r\n isZoomable() {\r\n return this.instance.applyFilters(\r\n 'isContentZoomable',\r\n this.isImageContent() && (this.state !== LOAD_STATE.ERROR),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Update image srcset sizes attribute based on width and height\r\n */\r\n updateSrcsetSizes() {\r\n // Handle srcset sizes attribute.\r\n //\r\n // Never lower quality, if it was increased previously.\r\n // Chrome does this automatically, Firefox and Safari do not,\r\n // so we store largest used size in dataset.\r\n if (!this.isImageContent() || !this.element || !this.data.srcset) {\r\n return;\r\n }\r\n\r\n const image = /** @type HTMLImageElement */ (this.element);\r\n const sizesWidth = this.instance.applyFilters(\r\n 'srcsetSizesWidth',\r\n this.displayedImageWidth,\r\n this\r\n );\r\n\r\n if (\r\n !image.dataset.largestUsedSize\r\n || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)\r\n ) {\r\n image.sizes = sizesWidth + 'px';\r\n image.dataset.largestUsedSize = String(sizesWidth);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\r\n usePlaceholder() {\r\n return this.instance.applyFilters(\r\n 'useContentPlaceholder',\r\n this.isImageContent(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Preload content with lazy-loading param\r\n */\r\n lazyLoad() {\r\n if (this.instance.dispatch('contentLazyLoad', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.load(true);\r\n }\r\n\r\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\r\n keepPlaceholder() {\r\n return this.instance.applyFilters(\r\n 'isKeepingPlaceholder',\r\n this.isLoading(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Destroy the content\r\n */\r\n destroy() {\r\n this.hasSlide = false;\r\n this.slide = undefined;\r\n\r\n if (this.instance.dispatch('contentDestroy', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.remove();\r\n\r\n if (this.placeholder) {\r\n this.placeholder.destroy();\r\n this.placeholder = undefined;\r\n }\r\n\r\n if (this.isImageContent() && this.element) {\r\n this.element.onload = null;\r\n this.element.onerror = null;\r\n this.element = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Display error message\r\n */\r\n displayError() {\r\n if (this.slide) {\r\n let errorMsgEl = createElement('pswp__error-msg', 'div');\r\n errorMsgEl.innerText = this.instance.options?.errorMsg ?? '';\r\n errorMsgEl = /** @type {HTMLDivElement} */ (this.instance.applyFilters(\r\n 'contentErrorElement',\r\n errorMsgEl,\r\n this\r\n ));\r\n this.element = createElement('pswp__content pswp__error-msg-container', 'div');\r\n this.element.appendChild(errorMsgEl);\r\n this.slide.container.innerText = '';\r\n this.slide.container.appendChild(this.element);\r\n this.slide.updateContentSize(true);\r\n this.removePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Append the content\r\n */\r\n append() {\r\n if (this.isAttached || !this.element) {\r\n return;\r\n }\r\n\r\n this.isAttached = true;\r\n\r\n if (this.state === LOAD_STATE.ERROR) {\r\n this.displayError();\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppend', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n const supportsDecode = ('decode' in this.element);\r\n\r\n if (this.isImageContent()) {\r\n // Use decode() on nearby slides\r\n //\r\n // Nearby slide images are in DOM and not hidden via display:none.\r\n // However, they are placed offscreen (to the left and right side).\r\n //\r\n // Some browsers do not composite the image until it's actually visible,\r\n // using decode() helps.\r\n //\r\n // You might ask \"why dont you just decode() and then append all images\",\r\n // that's because I want to show image before it's fully loaded,\r\n // as browser can render parts of image while it is loading.\r\n // We do not do this in Safari due to partial loading bug.\r\n if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\r\n this.isDecoding = true;\r\n // purposefully using finally instead of then,\r\n // as if srcset sizes changes dynamically - it may cause decode error\r\n /** @type {HTMLImageElement} */\r\n (this.element).decode().catch(() => {}).finally(() => {\r\n this.isDecoding = false;\r\n this.appendImage();\r\n });\r\n } else {\r\n this.appendImage();\r\n }\r\n } else if (this.slide && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n }\r\n }\r\n\r\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\r\n activate() {\r\n if (this.instance.dispatch('contentActivate', { content: this }).defaultPrevented\r\n || !this.slide) {\r\n return;\r\n }\r\n\r\n if (this.isImageContent() && this.isDecoding && !isSafari()) {\r\n // add image to slide when it becomes active,\r\n // even if it's not finished decoding\r\n this.appendImage();\r\n } else if (this.isError()) {\r\n this.load(false, true); // try to reload\r\n }\r\n\r\n if (this.slide.holderElement) {\r\n this.slide.holderElement.setAttribute('aria-hidden', 'false');\r\n }\r\n }\r\n\r\n /**\r\n * Deactivate the content\r\n */\r\n deactivate() {\r\n this.instance.dispatch('contentDeactivate', { content: this });\r\n if (this.slide && this.slide.holderElement) {\r\n this.slide.holderElement.setAttribute('aria-hidden', 'true');\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Remove the content from DOM\r\n */\r\n remove() {\r\n this.isAttached = false;\r\n\r\n if (this.instance.dispatch('contentRemove', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.element && this.element.parentNode) {\r\n this.element.remove();\r\n }\r\n\r\n if (this.placeholder && this.placeholder.element) {\r\n this.placeholder.element.remove();\r\n }\r\n }\r\n\r\n /**\r\n * Append the image content to slide container\r\n */\r\n appendImage() {\r\n if (!this.isAttached) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppendImage', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n // ensure that element exists and is not already appended\r\n if (this.slide && this.element && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n }\r\n\r\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\r\n this.removePlaceholder();\r\n }\r\n }\r\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\r\nfunction getViewportSize(options, pswp) {\r\n if (options.getViewportSizeFn) {\r\n const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n if (newViewportSize) {\r\n return newViewportSize;\r\n }\r\n }\r\n\r\n return {\r\n x: document.documentElement.clientWidth,\r\n\r\n // TODO: height on mobile is very incosistent due to toolbar\r\n // find a way to improve this\r\n //\r\n // document.documentElement.clientHeight - doesn't seem to work well\r\n y: window.innerHeight\r\n };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n let paddingValue = 0;\r\n\r\n if (options.paddingFn) {\r\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\r\n } else if (options.padding) {\r\n paddingValue = options.padding[prop];\r\n } else {\r\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1);\r\n // @ts-expect-error\r\n if (options[legacyPropName]) {\r\n // @ts-expect-error\r\n paddingValue = options[legacyPropName];\r\n }\r\n }\r\n\r\n return Number(paddingValue) || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\r\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\r\n return {\r\n x: viewportSize.x\r\n - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n y: viewportSize.y\r\n - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n };\r\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\r\n\r\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\r\nclass ZoomLevel {\r\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\r\n */\r\n constructor(options, itemData, index, pswp) {\r\n this.pswp = pswp;\r\n this.options = options;\r\n this.itemData = itemData;\r\n this.index = index;\r\n /** @type { Point | null } */\r\n this.panAreaSize = null;\r\n /** @type { Point | null } */\r\n this.elementSize = null;\r\n this.fit = 1;\r\n this.fill = 1;\r\n this.vFill = 1;\r\n this.initial = 1;\r\n this.secondary = 1;\r\n this.max = 1;\r\n this.min = 1;\r\n }\r\n\r\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {Point} panAreaSize\r\n */\r\n update(maxWidth, maxHeight, panAreaSize) {\r\n /** @type {Point} */\r\n const elementSize = { x: maxWidth, y: maxHeight };\r\n this.elementSize = elementSize;\r\n this.panAreaSize = panAreaSize;\r\n\r\n const hRatio = panAreaSize.x / elementSize.x;\r\n const vRatio = panAreaSize.y / elementSize.y;\r\n\r\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\r\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio);\r\n\r\n // zoom.vFill defines zoom level of the image\r\n // when it has 100% of viewport vertical space (height)\r\n this.vFill = Math.min(1, vRatio);\r\n\r\n this.initial = this._getInitial();\r\n this.secondary = this._getSecondary();\r\n this.max = Math.max(\r\n this.initial,\r\n this.secondary,\r\n this._getMax()\r\n );\r\n\r\n this.min = Math.min(\r\n this.fit,\r\n this.initial,\r\n this.secondary\r\n );\r\n\r\n if (this.pswp) {\r\n this.pswp.dispatch('zoomLevelsUpdate', { zoomLevels: this, slideData: this.itemData });\r\n }\r\n }\r\n\r\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n * @returns { number | undefined }\r\n */\r\n _parseZoomLevelOption(optionPrefix) {\r\n const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (\r\n optionPrefix + 'ZoomLevel'\r\n );\r\n const optionValue = this.options[optionName];\r\n\r\n if (!optionValue) {\r\n return;\r\n }\r\n\r\n if (typeof optionValue === 'function') {\r\n return optionValue(this);\r\n }\r\n\r\n if (optionValue === 'fill') {\r\n return this.fill;\r\n }\r\n\r\n if (optionValue === 'fit') {\r\n return this.fit;\r\n }\r\n\r\n return Number(optionValue);\r\n }\r\n\r\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getSecondary() {\r\n let currZoomLevel = this._parseZoomLevelOption('secondary');\r\n\r\n if (currZoomLevel) {\r\n return currZoomLevel;\r\n }\r\n\r\n // 3x of \"fit\" state, but not larger than original\r\n currZoomLevel = Math.min(1, this.fit * 3);\r\n\r\n if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\r\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\r\n }\r\n\r\n return currZoomLevel;\r\n }\r\n\r\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getInitial() {\r\n return this._parseZoomLevelOption('initial') || this.fit;\r\n }\r\n\r\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getMax() {\r\n // max zoom level is x4 from \"fit state\",\r\n // used for zoom gesture and ctrl/trackpad zoom\r\n return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\r\n }\r\n}\n\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\r\nfunction lazyLoadData(itemData, instance, index) {\r\n const content = instance.createContentFromData(itemData, index);\r\n /** @type {ZoomLevel | undefined} */\r\n let zoomLevel;\r\n\r\n const { options } = instance;\r\n\r\n // We need to know dimensions of the image to preload it,\r\n // as it might use srcset, and we need to define sizes\r\n if (options) {\r\n zoomLevel = new ZoomLevel(options, itemData, -1);\r\n\r\n let viewportSize;\r\n if (instance.pswp) {\r\n viewportSize = instance.pswp.viewportSize;\r\n } else {\r\n viewportSize = getViewportSize(options, instance);\r\n }\r\n\r\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n zoomLevel.update(content.width, content.height, panAreaSize);\r\n }\r\n\r\n content.lazyLoad();\r\n\r\n if (zoomLevel) {\r\n content.setDisplayedSize(\r\n Math.ceil(content.width * zoomLevel.initial),\r\n Math.ceil(content.height * zoomLevel.initial)\r\n );\r\n }\r\n\r\n return content;\r\n}\r\n\r\n\r\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default, it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\r\nfunction lazyLoadSlide(index, instance) {\r\n const itemData = instance.getItemData(index);\r\n\r\n if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n return lazyLoadData(itemData, instance, index);\r\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\r\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\r\n\r\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\r\nclass PhotoSwipeBase extends Eventable {\r\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\r\n getNumItems() {\r\n let numItems = 0;\r\n const dataSource = this.options?.dataSource;\r\n\r\n if (dataSource && 'length' in dataSource) {\r\n // may be an array or just object with length property\r\n numItems = dataSource.length;\r\n } else if (dataSource && 'gallery' in dataSource) {\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n if (dataSource.items) {\r\n numItems = dataSource.items.length;\r\n }\r\n }\r\n\r\n // legacy event, before filters were introduced\r\n const event = this.dispatch('numItems', {\r\n dataSource,\r\n numItems\r\n });\r\n return this.applyFilters('numItems', event.numItems, dataSource);\r\n }\r\n\r\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n * @returns {Content}\r\n */\r\n createContentFromData(slideData, index) {\r\n return new Content(slideData, this, index);\r\n }\r\n\r\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n * @returns {SlideData}\r\n */\r\n getItemData(index) {\r\n const dataSource = this.options?.dataSource;\r\n /** @type {SlideData | HTMLElement} */\r\n let dataSourceItem = {};\r\n if (Array.isArray(dataSource)) {\r\n // Datasource is an array of elements\r\n dataSourceItem = dataSource[index];\r\n } else if (dataSource && 'gallery' in dataSource) {\r\n // dataSource has gallery property,\r\n // thus it was created by Lightbox, based on\r\n // gallery and children options\r\n\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n dataSourceItem = dataSource.items[index];\r\n }\r\n\r\n let itemData = dataSourceItem;\r\n\r\n if (itemData instanceof Element) {\r\n itemData = this._domElementToItemData(itemData);\r\n }\r\n\r\n // Dispatching the itemData event,\r\n // it's a legacy verion before filters were introduced\r\n const event = this.dispatch('itemData', {\r\n itemData: itemData || {},\r\n index\r\n });\r\n\r\n return this.applyFilters('itemData', event.itemData, index);\r\n }\r\n\r\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n * @returns {HTMLElement[]}\r\n */\r\n _getGalleryDOMElements(galleryElement) {\r\n if (this.options?.children || this.options?.childSelector) {\r\n return getElementsFromOption(\r\n this.options.children,\r\n this.options.childSelector,\r\n galleryElement\r\n ) || [];\r\n }\r\n\r\n return [galleryElement];\r\n }\r\n\r\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n * @returns {SlideData}\r\n */\r\n _domElementToItemData(element) {\r\n /** @type {SlideData} */\r\n const itemData = {\r\n element\r\n };\r\n\r\n const linkEl = /** @type {HTMLAnchorElement} */ (\r\n element.tagName === 'A'\r\n ? element\r\n : element.querySelector('a')\r\n );\r\n\r\n if (linkEl) {\r\n // src comes from data-pswp-src attribute,\r\n // if it's empty link href is used\r\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\r\n\r\n if (linkEl.dataset.pswpSrcset) {\r\n itemData.srcset = linkEl.dataset.pswpSrcset;\r\n }\r\n\r\n itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\r\n itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0;\r\n\r\n // support legacy w & h properties\r\n itemData.w = itemData.width;\r\n itemData.h = itemData.height;\r\n\r\n if (linkEl.dataset.pswpType) {\r\n itemData.type = linkEl.dataset.pswpType;\r\n }\r\n\r\n const thumbnailEl = element.querySelector('img');\r\n\r\n if (thumbnailEl) {\r\n // msrc is URL to placeholder image that's displayed before large image is loaded\r\n // by default it's displayed only for the first slide\r\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\r\n itemData.alt = thumbnailEl.getAttribute('alt') ?? '';\r\n }\r\n\r\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\r\n itemData.thumbCropped = true;\r\n }\r\n }\r\n\r\n return this.applyFilters('domItemData', itemData, element, linkEl);\r\n }\r\n\r\n /**\r\n * Lazy-load by slide data\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\r\n lazyLoadData(itemData, index) {\r\n return lazyLoadData(itemData, this, index);\r\n }\r\n}\n\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Type} Type\r\n */\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('../slide/content.js').default} Content */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('../core/eventable.js').EventCallback} EventCallback\r\n */\r\n\r\n/**\r\n * PhotoSwipe Lightbox\r\n *\r\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\r\n * - Binds click event to links that should open PhotoSwipe\r\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\r\n * - Initializes PhotoSwipe\r\n *\r\n *\r\n * Loader options use the same object as PhotoSwipe, and supports such options:\r\n *\r\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\r\n * children - Element | Element[] | NodeList | string selector for the gallery children\r\n *\r\n */\r\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\r\n /**\r\n * @param {PhotoSwipeOptions} [options]\r\n */\r\n constructor(options) {\r\n super();\r\n /** @type {PhotoSwipeOptions} */\r\n this.options = options || {};\r\n this._uid = 0;\r\n this.shouldOpen = false;\r\n /**\r\n * @private\r\n * @type {Content | undefined}\r\n */\r\n this._preloadedContent = undefined;\r\n\r\n this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\r\n }\r\n\r\n /**\r\n * Initialize lightbox, should be called only once.\r\n * It's not included in the main constructor, so you may bind events before it.\r\n */\r\n init() {\r\n // Bind click events to each gallery\r\n getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n .forEach((galleryElement) => {\r\n galleryElement.addEventListener('click', this.onThumbnailsClick, false);\r\n });\r\n }\r\n\r\n /**\r\n * @param {MouseEvent} e\r\n */\r\n onThumbnailsClick(e) {\r\n // Exit and allow default browser action if:\r\n if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\r\n || window.pswp // ... if PhotoSwipe is already open\r\n || window.navigator.onLine === false) { // ... if offline\r\n return;\r\n }\r\n\r\n // If both clientX and clientY are 0 or not defined,\r\n // the event is likely triggered by keyboard,\r\n // so we do not pass the initialPoint\r\n //\r\n // Note that some screen readers emulate the mouse position,\r\n // so it's not the ideal way to detect them.\r\n //\r\n /** @type {Point | null} */\r\n let initialPoint = { x: e.clientX, y: e.clientY };\r\n\r\n if (!initialPoint.x && !initialPoint.y) {\r\n initialPoint = null;\r\n }\r\n\r\n let clickedIndex = this.getClickedIndex(e);\r\n clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\r\n /** @type {DataSource} */\r\n const dataSource = {\r\n gallery: /** @type {HTMLElement} */ (e.currentTarget)\r\n };\r\n\r\n if (clickedIndex >= 0) {\r\n e.preventDefault();\r\n this.loadAndOpen(clickedIndex, dataSource, initialPoint);\r\n }\r\n }\r\n\r\n /**\r\n * Get index of gallery item that was clicked.\r\n *\r\n * @param {MouseEvent} e click event\r\n * @returns {number}\r\n */\r\n getClickedIndex(e) {\r\n // legacy option\r\n if (this.options.getClickedIndexFn) {\r\n return this.options.getClickedIndexFn.call(this, e);\r\n }\r\n\r\n const clickedTarget = /** @type {HTMLElement} */ (e.target);\r\n const childElements = getElementsFromOption(\r\n this.options.children,\r\n this.options.childSelector,\r\n /** @type {HTMLElement} */ (e.currentTarget)\r\n );\r\n const clickedChildIndex = childElements.findIndex(\r\n child => child === clickedTarget || child.contains(clickedTarget)\r\n );\r\n\r\n if (clickedChildIndex !== -1) {\r\n return clickedChildIndex;\r\n } else if (this.options.children || this.options.childSelector) {\r\n // click wasn't on a child element\r\n return -1;\r\n }\r\n\r\n // There is only one item (which is the gallery)\r\n return 0;\r\n }\r\n\r\n /**\r\n * Load and open PhotoSwipe\r\n *\r\n * @param {number} index\r\n * @param {DataSource} dataSource\r\n * @param {Point | null} [initialPoint]\r\n * @returns {boolean}\r\n */\r\n loadAndOpen(index, dataSource, initialPoint) {\r\n // Check if the gallery is already open\r\n if (window.pswp) {\r\n return false;\r\n }\r\n\r\n // set initial index\r\n this.options.index = index;\r\n\r\n // define options for PhotoSwipe constructor\r\n this.options.initialPointerPos = initialPoint;\r\n\r\n this.shouldOpen = true;\r\n this.preload(index, dataSource);\r\n return true;\r\n }\r\n\r\n /**\r\n * Load the main module and the slide content by index\r\n *\r\n * @param {number} index\r\n * @param {DataSource} [dataSource]\r\n */\r\n preload(index, dataSource) {\r\n const { options } = this;\r\n\r\n if (dataSource) {\r\n options.dataSource = dataSource;\r\n }\r\n\r\n // Add the main module\r\n /** @type {Promise>[]} */\r\n const promiseArray = [];\r\n\r\n const pswpModuleType = typeof options.pswpModule;\r\n if (isPswpClass(options.pswpModule)) {\r\n promiseArray.push(Promise.resolve(/** @type {Type} */ (options.pswpModule)));\r\n } else if (pswpModuleType === 'string') {\r\n throw new Error('pswpModule as string is no longer supported');\r\n } else if (pswpModuleType === 'function') {\r\n promiseArray.push(/** @type {() => Promise>} */ (options.pswpModule)());\r\n } else {\r\n throw new Error('pswpModule is not valid');\r\n }\r\n\r\n // Add custom-defined promise, if any\r\n if (typeof options.openPromise === 'function') {\r\n // allow developers to perform some task before opening\r\n promiseArray.push(options.openPromise());\r\n }\r\n\r\n if (options.preloadFirstSlide !== false && index >= 0) {\r\n this._preloadedContent = lazyLoadSlide(index, this);\r\n }\r\n\r\n // Wait till all promises resolve and open PhotoSwipe\r\n const uid = ++this._uid;\r\n Promise.all(promiseArray).then((iterableModules) => {\r\n if (this.shouldOpen) {\r\n const mainModule = iterableModules[0];\r\n this._openPhotoswipe(mainModule, uid);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Type | { default: Type }} module\r\n * @param {number} uid\r\n */\r\n _openPhotoswipe(module, uid) {\r\n // Cancel opening if UID doesn't match the current one\r\n // (if user clicked on another gallery item before current was loaded).\r\n //\r\n // Or if shouldOpen flag is set to false\r\n // (developer may modify it via public API)\r\n if (uid !== this._uid && this.shouldOpen) {\r\n return;\r\n }\r\n\r\n this.shouldOpen = false;\r\n\r\n // PhotoSwipe is already open\r\n if (window.pswp) {\r\n return;\r\n }\r\n\r\n /**\r\n * Pass data to PhotoSwipe and open init\r\n *\r\n * @type {PhotoSwipe}\r\n */\r\n const pswp = typeof module === 'object'\r\n ? new module.default(this.options) // eslint-disable-line\r\n : new module(this.options); // eslint-disable-line\r\n\r\n this.pswp = pswp;\r\n window.pswp = pswp;\r\n\r\n // map listeners from Lightbox to PhotoSwipe Core\r\n /** @type {(keyof PhotoSwipeEventsMap)[]} */\r\n (Object.keys(this._listeners)).forEach((name) => {\r\n this._listeners[name]?.forEach((fn) => {\r\n pswp.on(name, /** @type {EventCallback} */(fn));\r\n });\r\n });\r\n\r\n // same with filters\r\n /** @type {(keyof PhotoSwipeFiltersMap)[]} */\r\n (Object.keys(this._filters)).forEach((name) => {\r\n this._filters[name]?.forEach((filter) => {\r\n pswp.addFilter(name, filter.fn, filter.priority);\r\n });\r\n });\r\n\r\n if (this._preloadedContent) {\r\n pswp.contentLoader.addToCache(this._preloadedContent);\r\n this._preloadedContent = undefined;\r\n }\r\n\r\n pswp.on('destroy', () => {\r\n // clean up public variables\r\n this.pswp = undefined;\r\n delete window.pswp;\r\n });\r\n\r\n pswp.init();\r\n }\r\n\r\n /**\r\n * Unbinds all events, closes PhotoSwipe if it's open.\r\n */\r\n destroy() {\r\n this.pswp?.destroy();\r\n\r\n this.shouldOpen = false;\r\n this._listeners = {};\r\n\r\n getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n .forEach((galleryElement) => {\r\n galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\r\n });\r\n }\r\n}\n\nexport { PhotoSwipeLightbox as default };\n//# sourceMappingURL=photoswipe-lightbox.esm.js.map\n","\n"],"file":"assets/ImageZoom-Bb69t-jQ.js"}