{"version":3,"sources":["jsdelivr-header.js","/projects/dnd/src/lib/dnd-utils.ts","/projects/dnd/src/lib/dnd-state.ts","/projects/dnd/src/lib/dnd-draggable.directive.ts","/projects/dnd/src/lib/dnd-dropzone.directive.ts","/projects/dnd/src/lib/dnd-handle.directive.ts","/projects/dnd/src/lib/dnd.module.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,+RCWO,MAAM,EAAe,CAAC,OAAQ,OAAQ,QAEhC,EAAmB,oBACnB,EAAiB,mBACjB,EAAiB,OAE9B,SAAS,EAAiB,GACxB,OAAO,EAAS,OAAO,EAAG,MAA6B,CACzD,CAEM,SAAU,EAAqB,GACnC,GAAI,EAAM,aAAc,CACtB,MAAM,EAAQ,EAAM,aAAa,MAGjC,IAAK,EACH,OAAO,EAGT,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,GACE,EAAM,KAAO,GACb,EAAM,KAAO,GACb,EAAiB,EAAM,IAEvB,OAAO,EAAM,E,CAKnB,OAAO,IACT,CA4DgB,SAAA,EACd,EACA,GAEA,MAAgB,QAAZ,GAAiC,kBAAZ,EAChB,EAGF,EAAQ,QAAO,SAAU,GAC9B,OAAkD,IAA3C,EAAQ,cAAc,QAAQ,EACvC,GACF,CAoCgB,SAAA,EACd,EACA,GAEA,MAAM,EAAyB,OAAO,iBAAiB,GACjD,EAAa,WAAW,EAAuB,aAAe,EAC9D,EAAc,WAAW,EAAuB,cAAgB,EAChE,EAAY,WAAW,EAAuB,iBAAmB,EACjE,EAAa,WAAW,EAAuB,kBAAoB,EAEzE,MAAO,CACL,EAAG,EAAM,QAAU,EAAc,EACjC,EAAG,EAAM,QAAU,EAAa,EAEpC,CCxJA,MAAM,EAAsB,CAC1B,YAAY,EACZ,WAAY,OACZ,cAAe,MACf,UAAM,GAkBQ,SAAA,IACd,EAAU,YAAa,EACvB,EAAU,gBAAa,EACvB,EAAU,mBAAgB,EAC1B,EAAU,UAAO,CACnB,CAEgB,SAAA,EAAc,EAAkB,IACjB,IAAzB,EAAU,aACZ,EAAU,WAAa,GAGrB,EAAM,eACR,EAAM,aAAa,WAAa,EAEpC,CAEgB,SAAA,EACd,EACA,GAEA,MAAM,EAA2C,EAAM,aAClD,EAAM,aAAa,cACpB,gBAEJ,IAAI,EAAU,EAAc,EAAc,GAY1C,OAV6B,IAAzB,EAAU,aACZ,EAAU,EAAc,EAAS,EAAU,gBAGzC,IACF,EAAU,EAAc,EAAS,IAKZ,IAAnB,EAAQ,OACH,OAGL,EAAM,UAAwC,IAA7B,EAAQ,QAAQ,QAC5B,OAGL,EAAM,SAAuC,IAA7B,EAAQ,QAAQ,QAC3B,OAGF,EAAQ,EACjB,CAEM,SAAU,EAAW,GACzB,IAA6B,IAAzB,EAAU,WACZ,OAAO,EAAU,KAGnB,MAAM,EAAW,EAAqB,GAEtC,OAAiB,OAAb,GAIA,IAAa,GAAkB,IAAa,GAIzC,EAAS,OAAO,UARvB,CASF,CAEgB,SAAA,IACd,OAAgC,IAAzB,EAAU,UACnB,CAEO,MAAM,EAA+B,ECrF/B,MAAA,EACX,sBAAwB,EAAO,GAAW,IAAM,KAChD,WAAsC,EAAO,GAE7C,QAAA,GACE,KAAK,sBAAsB,kBAAkB,KAAK,W,CALzC,aAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,EAAwB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAxB,aAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,EAAwB,cAAA,EAAA,SAAA,oBAAA,SAAA,I,iFAAxB,EAAwB,WAAA,E,KADpC,EAAU,KAAA,EAAE,SAAU,oBAAqB,YAAY,QAW3C,MAAA,EACF,aACA,iBAAkC,OAClC,QACA,iBAAmB,cACnB,uBAAyB,oBACzB,0BAA4B,uBAC5B,2BACP,EAEiB,SACjB,IAAI,EACa,QACjB,IAAI,EACa,OACjB,IAAI,EACa,SACjB,IAAI,EACa,UACjB,IAAI,EACa,UACjB,IAAI,EACa,YACjB,IAAI,EAEyB,WAAY,EAEnC,UACA,uBACA,UACA,eAAyB,EAEzB,WAAsC,EAAO,GAC7C,SAAW,EAAO,GAClB,OAAS,EAAO,GAExB,gBAAa,CAAa,GACxB,KAAK,WAAa,EAEd,KAAK,UACP,KAAK,SAAS,YACZ,KAAK,WAAW,cAChB,KAAK,2BAGP,KAAK,SAAS,SACZ,KAAK,WAAW,cAChB,KAAK,0B,CAKX,oBAAa,CAAiB,GAC5B,KAAK,aAAe,C,CAGtB,eAAA,GACE,KAAK,OAAO,mBAAkB,KAC5B,KAAK,WAAW,cAAc,iBAC5B,OACA,KAAK,iBACN,G,CAIL,WAAA,GACE,KAAK,WAAW,cAAc,oBAC5B,OACA,KAAK,kBAEH,KAAK,eACP,G,CAImC,WAAA,CAAY,GACjD,IAAK,KAAK,UACR,OAAO,EAIT,GAAsB,MAAlB,KAAK,WAA8C,MAAzB,EAAM,gBAElC,OADA,EAAM,mBACC,GDjGG,SACd,EACA,EACA,GAEA,EAAU,YAAa,EACvB,EAAU,WAAa,OACvB,EAAU,cAAgB,EAC1B,EAAU,KAAO,EAEb,EAAM,eACR,EAAM,aAAa,cAAgB,EAEvC,CCwFI,CAAU,EAAO,KAAK,iBAAkB,KAAK,SAE7C,KAAK,eAAgB,EF7ET,SACd,EACA,EACA,GAIA,MAAM,EAAW,GAAoB,EAAK,KAAO,IAAM,EAAK,KAAO,IAE7D,EAAa,KAAK,UAAU,GAElC,IACE,EAAM,cAAc,QAAQ,EAAU,E,CACtC,MAAO,GAEP,IACE,EAAM,cAAc,QAAQ,EAAgB,E,CAC5C,MAAO,GAIP,MAAM,EAAiB,EAAc,EAAc,GAC/C,EAAM,eACR,EAAM,aAAa,cAAgB,EAAe,IAGpD,EAAM,cAAc,QAAQ,EAAgB,E,EAGlD,CEkDI,CACE,EACA,CAAE,KAAM,KAAK,aAAc,KAAM,KAAK,SACtC,EAAS,eAGX,KAAK,UAAY,KAAK,qBAItB,KAAK,SAAS,SAAS,KAAK,UAAW,KAAK,kBAIT,MAA/B,KAAK,wBAA2D,MAAzB,EAAM,iBF4BrC,SACd,EACA,EACA,GAEA,MAAM,EAAS,EAAe,EAAO,IAAc,CAAE,EAAG,EAAG,EAAG,GAE7D,EAAM,aAAqB,aAAa,EAAW,EAAO,EAAG,EAAO,EACvE,CEnCM,CAAa,EAAO,KAAK,UAAW,KAAK,4BAI3C,MAAM,EAAa,KAAK,SAAS,OAC/B,KAAK,WAAW,cAChB,QACA,KACE,KAAK,SAAS,SACZ,KAAK,WAAW,cAChB,KAAK,wBAEP,GAAY,IAchB,OAVA,KAAK,SAAS,KAAK,GAEnB,EAAM,kBAEN,YAAW,KACN,KAAK,eACN,KAAK,SAAS,SAAS,KAAK,UAAW,iBAAkB,O,GAE1D,MAEI,C,CAGT,MAAA,CAAO,GACL,KAAK,QAAQ,KAAK,E,CAGiB,SAAA,CAAU,GAC7C,IAAK,KAAK,YAAc,KAAK,cAC3B,OAGF,MAAM,EAAa,EAAS,WAI5B,IAAI,EAEJ,OAJA,KAAK,SAAS,SAAS,KAAK,UAAW,iBAAkB,SAIjD,GACN,IAAK,OACH,EAAoB,KAAK,UACzB,MAEF,IAAK,OACH,EAAoB,KAAK,UACzB,MAEF,IAAK,OACH,EAAoB,KAAK,SACzB,MAEF,QACE,EAAoB,KAAK,YAI7B,EAAkB,KAAK,GACvB,KAAK,OAAO,KAAK,GAGjB,IAEA,KAAK,eAAgB,EAErB,KAAK,SAAS,YAAY,KAAK,UAAW,KAAK,kBAG/C,OAAO,YAAW,KAChB,KAAK,SAAS,YACZ,KAAK,WAAW,cAChB,KAAK,uBACN,GACA,GAEH,EAAM,iB,CAGR,kBAAA,CAAmB,GACjB,KAAK,UAAY,C,CAGnB,iBAAA,CAAkB,GAChB,KAAK,uBAAyB,C,CAGf,iBACf,GACG,KAAK,OAAO,GAET,kBAAA,GAEN,YAA2C,IAAhC,KAAK,uBACP,KAAK,uBAAuB,cAE5B,KAAK,WAAW,a,CA9MhB,aAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,EAAqB,KAAA,GAAA,OAAA,EAAA,gBAAA,Y,+EAArB,EAAqB,cAAA,EAAA,SAAA,iBAAA,OAAA,CAAA,aAAA,eAAA,iBAAA,mBAAA,QAAA,UAAA,iBAAA,mBAAA,uBAAA,yBAAA,0BAAA,4BAAA,2BAAA,6BAAA,aAAA,eAAA,iBAAA,oBAAA,QAAA,CAAA,SAAA,WAAA,QAAA,UAAA,OAAA,SAAA,SAAA,WAAA,UAAA,YAAA,UAAA,YAAA,YAAA,eAAA,KAAA,CAAA,UAAA,CAAA,UAAA,sBAAA,QAAA,qBAAA,WAAA,qCAAA,SAAA,I,iFAArB,EAAqB,WAAA,E,KADjC,EAAU,KAAA,EAAE,SAAU,iBAAkB,YAAY,MAE1C,eAAA,CAAA,aAAY,EAApB,KAAA,IACQ,iBAAgB,EAAxB,KAAA,IACQ,QAAO,EAAf,KAAA,IACQ,iBAAgB,EAAxB,KAAA,IACQ,uBAAsB,EAA9B,KAAA,IACQ,0BAAyB,EAAjC,KAAA,IACQ,2BAA0B,EAAlC,KAAA,IAGkB,SAAQ,EAA1B,KAAA,IAEkB,QAAO,EAAzB,KAAA,IAEkB,OAAM,EAAxB,KAAA,IAEkB,SAAQ,EAA1B,KAAA,IAEkB,UAAS,EAA3B,KAAA,IAEkB,UAAS,EAA3B,KAAA,IAEkB,YAAW,EAA7B,KAAA,IAG8B,UAAS,E,KAAvC,E,MAAY,oBAWA,aAAY,EAAxB,KAAA,IAgBY,iBAAgB,EAA5B,KAAA,IAuBsC,YAAW,E,KAAjD,E,MAAa,YAAa,CAAC,aAgES,UAAS,E,KAA7C,E,MAAa,UAAW,CAAC,gBC1If,MAAA,EACiB,WAA5B,WAAA,CAA4B,GAAA,KAAU,WAAV,C,CAE5B,QAAA,GAEE,KAAK,WAAW,cAAc,MAAM,cAAgB,M,yFAL3C,EAA0B,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,YAA1B,aAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,EAA0B,cAAA,EAAA,SAAA,sBAAA,SAAA,I,iFAA1B,EAA0B,WAAA,E,KADtC,EAAU,KAAA,EAAE,SAAU,sBAAuB,YAAY,M,2CAW7C,MAAA,EA2BD,OACA,WACA,SA5BD,YAA8B,GAE9B,iBAAkC,gBAElC,kBAA4B,EAE5B,eAAyB,EAEzB,iBAA2B,cAE3B,yBAA2B,sBAEjB,YACjB,IAAI,EAEa,QACjB,IAAI,EAGW,kBAET,YAA8B,KAE9B,UAAoB,EAE5B,WAAA,CACU,EACA,EACA,GAFA,KAAM,OAAN,EACA,KAAU,WAAV,EACA,KAAQ,SAAR,C,CAGV,gBAAa,CAAa,GACxB,KAAK,SAAW,EAEZ,KAAK,SACP,KAAK,SAAS,SACZ,KAAK,WAAW,cAChB,KAAK,0BAGP,KAAK,SAAS,YACZ,KAAK,WAAW,cAChB,KAAK,yB,CAKX,oBAAa,CAAiB,GAC5B,KAAK,aAAe,C,CAGtB,eAAA,GACE,KAAK,YAAc,KAAK,oBAExB,KAAK,2BAEL,KAAK,OAAO,mBAAkB,KAC5B,KAAK,WAAW,cAAc,iBAC5B,YACA,KAAK,uBAEP,KAAK,WAAW,cAAc,iBAC5B,WACA,KAAK,sBAEP,KAAK,WAAW,cAAc,iBAC5B,YACA,KAAK,sBACN,G,CAIL,WAAA,GACE,KAAK,WAAW,cAAc,oBAC5B,YACA,KAAK,uBAEP,KAAK,WAAW,cAAc,oBAC5B,WACA,KAAK,sBAEP,KAAK,WAAW,cAAc,oBAC5B,YACA,KAAK,sB,CAIT,WAAA,CAAY,GAEV,IAAiC,IAA7B,EAAM,mBAER,YADA,KAAK,uBAKP,GAAgC,MAA5B,EAAM,mBAA4B,CACpC,MAAM,EAAY,SAAS,iBAAiB,EAAM,QAAS,EAAM,SAE7D,KAAK,WAAW,cAAc,SAAS,KACzC,EAAM,oBAAqB,E,CAK/B,MAAM,EAAO,EAAW,GACnB,KAAK,cAAc,IAKxB,EAAM,gB,CAGR,UAAA,CAAW,GAMT,GAAI,EAAM,iBACR,OAIF,MAAM,EAAO,EAAW,GACxB,IAAK,KAAK,cAAc,GACtB,OAGF,KAAK,kCAAkC,GAEvC,MAAM,EAAa,EAAc,EAAO,KAAK,kBAE1B,SAAf,GAMJ,EAAM,iBAGN,EAAc,EAAO,GAErB,KAAK,YAAY,KAAK,GAEtB,KAAK,SAAS,SACZ,KAAK,WAAW,cAChB,KAAK,mBAdL,KAAK,sB,CAkByB,MAAA,CAAO,GACvC,IAEE,MAAM,EAAO,EAAW,GACxB,IAAK,KAAK,cAAc,GACtB,OAGF,MAAM,EHjII,SACd,EACA,GAGA,MAAM,EAAW,EAAqB,GAGtC,OAAuB,IAAnB,EACe,OAAb,GAAqB,EAAiB,GAEjC,KAAK,MAAM,EAAM,cAAc,QAAQ,IAAa,MAItD,GAGQ,OAAb,EAEK,KAAK,MAAM,EAAM,cAAc,QAAQ,IAAa,MAItD,EACT,CGwGiC,CAAY,EAAO,KAE9C,IAAK,KAAK,cAAc,EAAK,MAC3B,OAIF,EAAM,iBAEN,MAAM,EAAa,EAAc,GAIjC,GAFA,EAAc,EAAO,GAEF,SAAf,EACF,OAGF,MAAM,EAAY,KAAK,sBAKvB,IAAmB,IAAf,EACF,OAGF,KAAK,QAAQ,KAAK,CAChB,MAAO,EACP,WAAY,EACZ,WAAY,IACZ,KAAM,EAAK,KACX,MAAO,EACP,KAAM,IAGR,EAAM,iB,CACE,QACR,KAAK,sB,EAIT,WAAA,CAAY,GACV,EAAM,iBACN,EAAM,kBAG0B,MAA5B,EAAM,oBACJ,KAAK,WAAW,cAAc,SAAS,EAAM,eAC/C,EAAM,oBAAqB,GAK/B,KAAK,uBAGL,EAAc,EAAO,Q,CAGN,sBACf,GACG,KAAK,YAAY,GAEL,qBACf,GACG,KAAK,WAAW,GAEJ,sBACf,GACG,KAAK,YAAY,GAEd,aAAA,CAAc,GAEpB,GAAI,KAAK,SACP,OAAO,EAKT,GAAI,MAAqB,KAAK,iBAC5B,OAAO,EAIT,IAAK,KAAK,YACR,OAAO,EAIT,IAAK,EACH,OAAO,EAGT,IAAK,MAAM,QAAQ,KAAK,aACtB,MAAM,IAAI,MACR,+DAKJ,OAA2C,IAApC,KAAK,YAAY,QAAQ,E,CAG1B,iBAAA,GACN,YAAsC,IAA3B,KAAK,kBACP,KAAK,kBAAkB,WAAW,cAKpC,KAAK,WAAW,cAAc,cAAc,sB,CAG7C,wBAAA,GACmB,OAArB,KAAK,aAAwD,OAAhC,KAAK,YAAY,YAChD,KAAK,YAAY,WAAW,YAAY,KAAK,Y,CAIzC,iCAAA,CAAkC,GACxC,GAAyB,OAArB,KAAK,YACP,OAIE,KAAK,YAAY,aAAe,KAAK,WAAW,eAClD,KAAK,SAAS,YACZ,KAAK,WAAW,cAChB,KAAK,aAKT,MAAM,EH9NM,SACd,EACA,GAEA,IAAI,EAAoB,EAExB,KAAO,EAAY,aAAe,GAAe,CAE/C,IAAK,EAAY,WACf,OAAO,KAGT,EAAc,EAAY,U,CAG5B,OAAO,CACT,CG8MwB,CAClB,KAAK,WAAW,cAChB,EAAM,QAIR,GAAoB,OAAhB,GAAwB,IAAgB,KAAK,YAC/C,OAGF,MAAM,EHtNM,SACd,EACA,EACA,GAEA,MAAM,EAAS,EAAQ,wBAIvB,OAAI,EACK,EAAM,QAAU,EAAO,KAAO,EAAO,MAAQ,EAG/C,EAAM,QAAU,EAAO,IAAM,EAAO,OAAS,CACtD,CGyMM,CACE,EACA,EACA,KAAK,eAGL,EAEE,EAAY,kBAAoB,KAAK,aACvC,KAAK,SAAS,aACZ,KAAK,WAAW,cAChB,KAAK,YACL,GAKA,EAAY,cAAgB,KAAK,aACnC,KAAK,SAAS,aACZ,KAAK,WAAW,cAChB,KAAK,YACL,EAAY,Y,CAMZ,mBAAA,GACN,GAAyB,OAArB,KAAK,YACP,OAGF,MAAM,EAAU,KAAK,WAAW,cAEhC,OAAO,MAAM,UAAU,QAAQ,KAAK,EAAQ,SAAU,KAAK,Y,CAGrD,oBAAA,GACN,KAAK,SAAS,YACZ,KAAK,WAAW,cAChB,KAAK,kBAGP,KAAK,0B,CA5VI,aAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,EAAoB,KAAA,EAAA,MAAA,EAAA,QAAA,CAAA,MAAA,EAAA,YAAA,CAAA,MAAA,EAAA,YAAA,OAAA,EAAA,gBAAA,YAApB,aAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,EAAoB,cAAA,EAAA,SAAA,gBAAA,OAAA,CAAA,YAAA,cAAA,iBAAA,mBAAA,iBAAA,mBAAA,cAAA,gBAAA,iBAAA,mBAAA,yBAAA,2BAAA,aAAA,eAAA,iBAAA,oBAAA,QAAA,CAAA,YAAA,cAAA,QAAA,WAAA,KAAA,CAAA,UAAA,CAAA,KAAA,mBAAA,QAAA,EAAA,aAAA,oBAAA,OAAA,EAAA,UAmBjB,EAA0B,aAAA,IAAA,SAAA,I,iFAnB7B,EAAoB,WAAA,E,KADhC,EAAU,KAAA,EAAE,SAAU,gBAAiB,YAAY,MAEzC,eAAA,MAAA,KAAA,EAAA,QAAA,CAAA,KAAA,EAAA,YAAA,CAAA,KAAA,EAAA,YAAA,eAAA,CAAA,YAAW,EAAnB,KAAA,IAEQ,iBAAgB,EAAxB,KAAA,IAEQ,iBAAgB,EAAxB,KAAA,IAEQ,cAAa,EAArB,KAAA,IAEQ,iBAAgB,EAAxB,KAAA,IAEQ,yBAAwB,EAAhC,KAAA,IAEkB,YAAW,EAA7B,KAAA,IAGkB,QAAO,EAAzB,KAAA,IAIgB,kBAAiB,E,KADjC,E,MAAa,KAaD,aAAY,EAAxB,KAAA,IAgBY,iBAAgB,EAA5B,KAAA,IAyGiC,OAAM,E,KAAvC,E,MAAa,OAAQ,CAAC,gBC9LZ,MAAA,EACoB,WAAY,EAE3C,sBAAwB,EAAO,GAE/B,QAAA,GACE,KAAK,sBAAsB,mBAAmB,K,CAGhD,WAAA,GACE,KAAK,sBAAsB,wBAAmB,E,CAKhD,WAAA,CAAY,GACV,EAAM,iBAAkB,C,CAhBf,aAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,EAAkB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAlB,aAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,EAAkB,cAAA,EAAA,SAAA,cAAA,KAAA,CAAA,UAAA,CAAA,UAAA,sBAAA,QAAA,uBAAA,WAAA,qCAAA,SAAA,I,iFAAlB,EAAkB,WAAA,E,KAD9B,EAAU,KAAA,EAAE,SAAU,cAAe,YAAY,MAEjB,eAAA,CAAA,UAAS,E,KAAvC,E,MAAY,oBAcb,YAAW,E,KAFV,E,MAAa,YAAa,CAAC,Y,MAC3B,E,MAAa,UAAW,CAAC,gBCCf,MAAA,EAAA,aAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,EAAS,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAT,aAAA,EAAA,qBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,EAAS,QAAA,CAPlB,EACA,EACA,EACA,EACA,GAAqB,QAAA,CAXrB,EACA,EACA,EACA,EACA,KAUS,aAAA,EAAA,qBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,I,iFAAA,EAAS,WAAA,E,KAhBrB,EAAS,KAAA,EACR,QAAS,CACP,EACA,EACA,EACA,EACA,GAEF,QAAS,CACP,EACA,EACA,EACA,EACA,gB","file":"/npm/ngx-drag-drop@19.0.0/fesm2022/ngx-drag-drop.mjs/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/ngx-drag-drop@19.0.0/fesm2022/ngx-drag-drop.mjs\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { DropEffect, EffectAllowed } from './dnd-types';\n\nexport interface DragDropData {\n  data?: any;\n  type?: string;\n}\n\nexport interface DndEvent extends DragEvent {\n  _dndUsingHandle?: boolean;\n  _dndDropzoneActive?: true;\n}\n\nexport type DndDragImageOffsetFunction = (\n  event: DragEvent,\n  dragImage: Element\n) => { x: number; y: number };\n\nexport const DROP_EFFECTS = ['move', 'copy', 'link'] as DropEffect[];\n\nexport const CUSTOM_MIME_TYPE = 'application/x-dnd';\nexport const JSON_MIME_TYPE = 'application/json';\nexport const MSIE_MIME_TYPE = 'Text';\n\nfunction mimeTypeIsCustom(mimeType: string) {\n  return mimeType.substr(0, CUSTOM_MIME_TYPE.length) === CUSTOM_MIME_TYPE;\n}\n\nexport function getWellKnownMimeType(event: DragEvent): string | null {\n  if (event.dataTransfer) {\n    const types = event.dataTransfer.types;\n\n    // IE 9 workaround.\n    if (!types) {\n      return MSIE_MIME_TYPE;\n    }\n\n    for (let i = 0; i < types.length; i++) {\n      if (\n        types[i] === MSIE_MIME_TYPE ||\n        types[i] === JSON_MIME_TYPE ||\n        mimeTypeIsCustom(types[i])\n      ) {\n        return types[i];\n      }\n    }\n  }\n\n  return null;\n}\n\nexport function setDragData(\n  event: DragEvent,\n  data: DragDropData,\n  effectAllowed: EffectAllowed\n): void {\n  // Internet Explorer and Microsoft Edge don't support custom mime types, see design doc:\n  // https://github.com/marceljuenemann/angular-drag-and-drop-lists/wiki/Data-Transfer-Design\n  const mimeType = CUSTOM_MIME_TYPE + (data.type ? '-' + data.type : '');\n\n  const dataString = JSON.stringify(data);\n\n  try {\n    event.dataTransfer?.setData(mimeType, dataString);\n  } catch (e) {\n    //   Setting a custom MIME type did not work, we are probably in IE or Edge.\n    try {\n      event.dataTransfer?.setData(JSON_MIME_TYPE, dataString);\n    } catch (e) {\n      //   We are in Internet Explorer and can only use the Text MIME type. Also note that IE\n      //   does not allow changing the cursor in the dragover event, therefore we have to choose\n      //   the one we want to display now by setting effectAllowed.\n      const effectsAllowed = filterEffects(DROP_EFFECTS, effectAllowed);\n      if (event.dataTransfer) {\n        event.dataTransfer.effectAllowed = effectsAllowed[0];\n      }\n\n      event.dataTransfer?.setData(MSIE_MIME_TYPE, dataString);\n    }\n  }\n}\n\nexport function getDropData(\n  event: DragEvent,\n  dragIsExternal: boolean\n): DragDropData {\n  // check if the mime type is well known\n  const mimeType = getWellKnownMimeType(event);\n\n  // drag did not originate from [dndDraggable]\n  if (dragIsExternal === true) {\n    if (mimeType !== null && mimeTypeIsCustom(mimeType)) {\n      // the type of content is well known and safe to handle\n      return JSON.parse(event.dataTransfer?.getData(mimeType) ?? '{}');\n    }\n\n    // the contained data is unknown, let user handle it\n    return {};\n  }\n\n  if (mimeType !== null) {\n    // the type of content is well known and safe to handle\n    return JSON.parse(event.dataTransfer?.getData(mimeType) ?? '{}');\n  }\n\n  // the contained data is unknown, let user handle it\n  return {};\n}\n\nexport function filterEffects(\n  effects: DropEffect[],\n  allowed: EffectAllowed | DropEffect\n): DropEffect[] {\n  if (allowed === 'all' || allowed === 'uninitialized') {\n    return effects;\n  }\n\n  return effects.filter(function (effect) {\n    return allowed.toLowerCase().indexOf(effect) !== -1;\n  });\n}\n\nexport function getDirectChildElement(\n  parentElement: Element,\n  childElement: Element\n): Element | null {\n  let directChild: Node = childElement;\n\n  while (directChild.parentNode !== parentElement) {\n    // reached root node without finding given parent\n    if (!directChild.parentNode) {\n      return null;\n    }\n\n    directChild = directChild.parentNode;\n  }\n\n  return directChild as Element;\n}\n\nexport function shouldPositionPlaceholderBeforeElement(\n  event: DragEvent,\n  element: Element,\n  horizontal: boolean\n) {\n  const bounds = element.getBoundingClientRect();\n\n  // If the pointer is in the upper half of the list item element,\n  // we position the placeholder before the list item, otherwise after it.\n  if (horizontal) {\n    return event.clientX < bounds.left + bounds.width / 2;\n  }\n\n  return event.clientY < bounds.top + bounds.height / 2;\n}\n\nexport function calculateDragImageOffset(\n  event: DragEvent,\n  dragImage: Element\n): { x: number; y: number } {\n  const dragImageComputedStyle = window.getComputedStyle(dragImage);\n  const paddingTop = parseFloat(dragImageComputedStyle.paddingTop) || 0;\n  const paddingLeft = parseFloat(dragImageComputedStyle.paddingLeft) || 0;\n  const borderTop = parseFloat(dragImageComputedStyle.borderTopWidth) || 0;\n  const borderLeft = parseFloat(dragImageComputedStyle.borderLeftWidth) || 0;\n\n  return {\n    x: event.offsetX + paddingLeft + borderLeft,\n    y: event.offsetY + paddingTop + borderTop,\n  };\n}\n\nexport function setDragImage(\n  event: DragEvent,\n  dragImage: Element,\n  offsetFunction: DndDragImageOffsetFunction\n): void {\n  const offset = offsetFunction(event, dragImage) || { x: 0, y: 0 };\n\n  (event.dataTransfer as any).setDragImage(dragImage, offset.x, offset.y);\n}\n","import { DropEffect, EffectAllowed } from './dnd-types';\nimport {\n  CUSTOM_MIME_TYPE,\n  DROP_EFFECTS,\n  filterEffects,\n  getWellKnownMimeType,\n  JSON_MIME_TYPE,\n  MSIE_MIME_TYPE,\n} from './dnd-utils';\n\nexport interface DndState {\n  isDragging: boolean;\n  dropEffect?: DropEffect;\n  effectAllowed?: EffectAllowed;\n  type?: string;\n}\n\nconst _dndState: DndState = {\n  isDragging: false,\n  dropEffect: 'none',\n  effectAllowed: 'all',\n  type: undefined,\n};\n\nexport function startDrag(\n  event: DragEvent,\n  effectAllowed: EffectAllowed,\n  type: string | undefined\n) {\n  _dndState.isDragging = true;\n  _dndState.dropEffect = 'none';\n  _dndState.effectAllowed = effectAllowed;\n  _dndState.type = type;\n\n  if (event.dataTransfer) {\n    event.dataTransfer.effectAllowed = effectAllowed;\n  }\n}\n\nexport function endDrag() {\n  _dndState.isDragging = false;\n  _dndState.dropEffect = undefined;\n  _dndState.effectAllowed = undefined;\n  _dndState.type = undefined;\n}\n\nexport function setDropEffect(event: DragEvent, dropEffect: DropEffect) {\n  if (_dndState.isDragging === true) {\n    _dndState.dropEffect = dropEffect;\n  }\n\n  if (event.dataTransfer) {\n    event.dataTransfer.dropEffect = dropEffect;\n  }\n}\n\nexport function getDropEffect(\n  event: DragEvent,\n  effectAllowed?: EffectAllowed | DropEffect\n): DropEffect {\n  const dataTransferEffectAllowed: EffectAllowed = event.dataTransfer\n    ? (event.dataTransfer.effectAllowed as EffectAllowed)\n    : 'uninitialized';\n\n  let effects = filterEffects(DROP_EFFECTS, dataTransferEffectAllowed);\n\n  if (_dndState.isDragging === true) {\n    effects = filterEffects(effects, _dndState.effectAllowed!);\n  }\n\n  if (effectAllowed) {\n    effects = filterEffects(effects, effectAllowed);\n  }\n\n  // MacOS automatically filters dataTransfer.effectAllowed depending on the modifier keys,\n  // therefore the following modifier keys will only affect other operating systems.\n  if (effects.length === 0) {\n    return 'none';\n  }\n\n  if (event.ctrlKey && effects.indexOf('copy') !== -1) {\n    return 'copy';\n  }\n\n  if (event.altKey && effects.indexOf('link') !== -1) {\n    return 'link';\n  }\n\n  return effects[0] as DropEffect;\n}\n\nexport function getDndType(event: DragEvent): string | undefined {\n  if (_dndState.isDragging === true) {\n    return _dndState.type;\n  }\n\n  const mimeType = getWellKnownMimeType(event);\n\n  if (mimeType === null) {\n    return undefined;\n  }\n\n  if (mimeType === MSIE_MIME_TYPE || mimeType === JSON_MIME_TYPE) {\n    return undefined;\n  }\n\n  return mimeType.substr(CUSTOM_MIME_TYPE.length + 1) || undefined;\n}\n\nexport function isExternalDrag(): boolean {\n  return _dndState.isDragging === false;\n}\n\nexport const dndState: Readonly<DndState> = _dndState as Readonly<DndState>;\n","import {\n  AfterViewInit,\n  Directive,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  HostBinding,\n  HostListener,\n  inject,\n  Input,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Output,\n  Renderer2,\n} from '@angular/core';\nimport { DndHandleDirective } from './dnd-handle.directive';\nimport { dndState, endDrag, startDrag } from './dnd-state';\nimport { EffectAllowed } from './dnd-types';\nimport {\n  calculateDragImageOffset,\n  DndDragImageOffsetFunction,\n  DndEvent,\n  setDragData,\n  setDragImage,\n} from './dnd-utils';\n\n@Directive({ selector: '[dndDragImageRef]', standalone: true })\nexport class DndDragImageRefDirective implements OnInit {\n  dndDraggableDirective = inject(forwardRef(() => DndDraggableDirective));\n  elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n  ngOnInit() {\n    this.dndDraggableDirective.registerDragImage(this.elementRef);\n  }\n}\n\n@Directive({ selector: '[dndDraggable]', standalone: true })\nexport class DndDraggableDirective implements AfterViewInit, OnDestroy {\n  @Input() dndDraggable: any;\n  @Input() dndEffectAllowed: EffectAllowed = 'copy';\n  @Input() dndType?: string;\n  @Input() dndDraggingClass = 'dndDragging';\n  @Input() dndDraggingSourceClass = 'dndDraggingSource';\n  @Input() dndDraggableDisabledClass = 'dndDraggableDisabled';\n  @Input() dndDragImageOffsetFunction: DndDragImageOffsetFunction =\n    calculateDragImageOffset;\n\n  @Output() readonly dndStart: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndDrag: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndEnd: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndMoved: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndCopied: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndLinked: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndCanceled: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n\n  @HostBinding('attr.draggable') draggable = true;\n\n  private dndHandle?: DndHandleDirective;\n  private dndDragImageElementRef?: ElementRef;\n  private dragImage: Element | undefined;\n  private isDragStarted: boolean = false;\n\n  private elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n  private renderer = inject(Renderer2);\n  private ngZone = inject(NgZone);\n\n  @Input() set dndDisableIf(value: boolean) {\n    this.draggable = !value;\n\n    if (this.draggable) {\n      this.renderer.removeClass(\n        this.elementRef.nativeElement,\n        this.dndDraggableDisabledClass\n      );\n    } else {\n      this.renderer.addClass(\n        this.elementRef.nativeElement,\n        this.dndDraggableDisabledClass\n      );\n    }\n  }\n\n  @Input() set dndDisableDragIf(value: boolean) {\n    this.dndDisableIf = value;\n  }\n\n  ngAfterViewInit(): void {\n    this.ngZone.runOutsideAngular(() => {\n      this.elementRef.nativeElement.addEventListener(\n        'drag',\n        this.dragEventHandler\n      );\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.elementRef.nativeElement.removeEventListener(\n      'drag',\n      this.dragEventHandler\n    );\n    if (this.isDragStarted) {\n      endDrag();\n    }\n  }\n\n  @HostListener('dragstart', ['$event']) onDragStart(event: DndEvent): boolean {\n    if (!this.draggable) {\n      return false;\n    }\n\n    // check if there is dnd handle and if the dnd handle was used to start the drag\n    if (this.dndHandle != null && event._dndUsingHandle == null) {\n      event.stopPropagation();\n      return false;\n    }\n\n    // initialize global state\n    startDrag(event, this.dndEffectAllowed, this.dndType);\n\n    this.isDragStarted = true;\n\n    setDragData(\n      event,\n      { data: this.dndDraggable, type: this.dndType },\n      dndState.effectAllowed!\n    );\n\n    this.dragImage = this.determineDragImage();\n\n    // set dragging css class prior to setDragImage so styles are applied before\n    // TODO breaking change: add class to elementRef rather than drag image which could be another element\n    this.renderer.addClass(this.dragImage, this.dndDraggingClass);\n\n    // set custom dragimage if present\n    // set dragimage if drag is started from dndHandle\n    if (this.dndDragImageElementRef != null || event._dndUsingHandle != null) {\n      setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);\n    }\n\n    // add dragging source css class on first drag event\n    const unregister = this.renderer.listen(\n      this.elementRef.nativeElement,\n      'drag',\n      () => {\n        this.renderer.addClass(\n          this.elementRef.nativeElement,\n          this.dndDraggingSourceClass\n        );\n        unregister();\n      }\n    );\n\n    this.dndStart.emit(event);\n\n    event.stopPropagation();\n\n    setTimeout(() => {\n      if(this.isDragStarted) {\n        this.renderer.setStyle(this.dragImage, 'pointer-events', 'none');\n      }\n    }, 100);\n\n    return true;\n  }\n\n  onDrag(event: DragEvent) {\n    this.dndDrag.emit(event);\n  }\n\n  @HostListener('dragend', ['$event']) onDragEnd(event: DragEvent) {\n    if (!this.draggable || !this.isDragStarted) {\n      return;\n    }\n    // get drop effect from custom stored state as its not reliable across browsers\n    const dropEffect = dndState.dropEffect;\n\n    this.renderer.setStyle(this.dragImage, 'pointer-events', 'unset');\n\n    let dropEffectEmitter: EventEmitter<DragEvent>;\n\n    switch (dropEffect) {\n      case 'copy':\n        dropEffectEmitter = this.dndCopied;\n        break;\n\n      case 'link':\n        dropEffectEmitter = this.dndLinked;\n        break;\n\n      case 'move':\n        dropEffectEmitter = this.dndMoved;\n        break;\n\n      default:\n        dropEffectEmitter = this.dndCanceled;\n        break;\n    }\n\n    dropEffectEmitter.emit(event);\n    this.dndEnd.emit(event);\n\n    // reset global state\n    endDrag();\n\n    this.isDragStarted = false;\n\n    this.renderer.removeClass(this.dragImage, this.dndDraggingClass);\n\n    // IE9 special hammering\n    window.setTimeout(() => {\n      this.renderer.removeClass(\n        this.elementRef.nativeElement,\n        this.dndDraggingSourceClass\n      );\n    }, 0);\n\n    event.stopPropagation();\n  }\n\n  registerDragHandle(handle: DndHandleDirective | undefined) {\n    this.dndHandle = handle;\n  }\n\n  registerDragImage(elementRef: ElementRef | undefined) {\n    this.dndDragImageElementRef = elementRef;\n  }\n\n  private readonly dragEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDrag(event);\n\n  private determineDragImage(): Element {\n    // evaluate custom drag image existence\n    if (typeof this.dndDragImageElementRef !== 'undefined') {\n      return this.dndDragImageElementRef.nativeElement as Element;\n    } else {\n      return this.elementRef.nativeElement;\n    }\n  }\n}\n","import {\n  AfterViewInit,\n  ContentChild,\n  Directive,\n  ElementRef,\n  EventEmitter,\n  HostListener,\n  Input,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Output,\n  Renderer2,\n} from '@angular/core';\nimport {\n  getDndType,\n  getDropEffect,\n  isExternalDrag,\n  setDropEffect,\n} from './dnd-state';\nimport { DropEffect, EffectAllowed } from './dnd-types';\nimport {\n  DndEvent,\n  DragDropData,\n  getDirectChildElement,\n  getDropData,\n  shouldPositionPlaceholderBeforeElement,\n} from './dnd-utils';\n\nexport interface DndDropEvent {\n  event: DragEvent;\n  dropEffect: DropEffect;\n  isExternal: boolean;\n  data?: any;\n  index?: number;\n  type?: any;\n}\n\n@Directive({ selector: '[dndPlaceholderRef]', standalone: true })\nexport class DndPlaceholderRefDirective implements OnInit {\n  constructor(public readonly elementRef: ElementRef<HTMLElement>) {}\n\n  ngOnInit() {\n    // placeholder has to be \"invisible\" to the cursor, or it would interfere with the dragover detection for the same dropzone\n    this.elementRef.nativeElement.style.pointerEvents = 'none';\n  }\n}\n\n@Directive({ selector: '[dndDropzone]', standalone: true })\nexport class DndDropzoneDirective implements AfterViewInit, OnDestroy {\n  @Input() dndDropzone?: string[] | '' = '';\n\n  @Input() dndEffectAllowed: EffectAllowed = 'uninitialized';\n\n  @Input() dndAllowExternal: boolean = false;\n\n  @Input() dndHorizontal: boolean = false;\n\n  @Input() dndDragoverClass: string = 'dndDragover';\n\n  @Input() dndDropzoneDisabledClass = 'dndDropzoneDisabled';\n\n  @Output() readonly dndDragover: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n\n  @Output() readonly dndDrop: EventEmitter<DndDropEvent> =\n    new EventEmitter<DndDropEvent>();\n\n  @ContentChild(DndPlaceholderRefDirective)\n  private readonly dndPlaceholderRef?: DndPlaceholderRefDirective;\n\n  private placeholder: Element | null = null;\n\n  private disabled: boolean = false;\n\n  constructor(\n    private ngZone: NgZone,\n    private elementRef: ElementRef,\n    private renderer: Renderer2\n  ) {}\n\n  @Input() set dndDisableIf(value: boolean) {\n    this.disabled = value;\n\n    if (this.disabled) {\n      this.renderer.addClass(\n        this.elementRef.nativeElement,\n        this.dndDropzoneDisabledClass\n      );\n    } else {\n      this.renderer.removeClass(\n        this.elementRef.nativeElement,\n        this.dndDropzoneDisabledClass\n      );\n    }\n  }\n\n  @Input() set dndDisableDropIf(value: boolean) {\n    this.dndDisableIf = value;\n  }\n\n  ngAfterViewInit(): void {\n    this.placeholder = this.tryGetPlaceholder();\n\n    this.removePlaceholderFromDOM();\n\n    this.ngZone.runOutsideAngular(() => {\n      this.elementRef.nativeElement.addEventListener(\n        'dragenter',\n        this.dragEnterEventHandler\n      );\n      this.elementRef.nativeElement.addEventListener(\n        'dragover',\n        this.dragOverEventHandler\n      );\n      this.elementRef.nativeElement.addEventListener(\n        'dragleave',\n        this.dragLeaveEventHandler\n      );\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.elementRef.nativeElement.removeEventListener(\n      'dragenter',\n      this.dragEnterEventHandler\n    );\n    this.elementRef.nativeElement.removeEventListener(\n      'dragover',\n      this.dragOverEventHandler\n    );\n    this.elementRef.nativeElement.removeEventListener(\n      'dragleave',\n      this.dragLeaveEventHandler\n    );\n  }\n\n  onDragEnter(event: DndEvent) {\n    // check if another dropzone is activated\n    if (event._dndDropzoneActive === true) {\n      this.cleanupDragoverState();\n      return;\n    }\n\n    // set as active if the target element is inside this dropzone\n    if (event._dndDropzoneActive == null) {\n      const newTarget = document.elementFromPoint(event.clientX, event.clientY);\n\n      if (this.elementRef.nativeElement.contains(newTarget)) {\n        event._dndDropzoneActive = true;\n      }\n    }\n\n    // check if this drag event is allowed to drop on this dropzone\n    const type = getDndType(event);\n    if (!this.isDropAllowed(type)) {\n      return;\n    }\n\n    // allow the dragenter\n    event.preventDefault();\n  }\n\n  onDragOver(event: DragEvent) {\n    // With nested dropzones, we want to ignore this event if a child dropzone\n    // has already handled a dragover.  Historically, event.stopPropagation() was\n    // used to prevent this bubbling, but that prevents any dragovers outside the\n    // ngx-drag-drop component, and stops other use cases such as scrolling on drag.\n    // Instead, we can check if the event was already prevented by a child and bail early.\n    if (event.defaultPrevented) {\n      return;\n    }\n\n    // check if this drag event is allowed to drop on this dropzone\n    const type = getDndType(event);\n    if (!this.isDropAllowed(type)) {\n      return;\n    }\n\n    this.checkAndUpdatePlaceholderPosition(event);\n\n    const dropEffect = getDropEffect(event, this.dndEffectAllowed);\n\n    if (dropEffect === 'none') {\n      this.cleanupDragoverState();\n      return;\n    }\n\n    // allow the dragover\n    event.preventDefault();\n\n    // set the drop effect\n    setDropEffect(event, dropEffect);\n\n    this.dndDragover.emit(event);\n\n    this.renderer.addClass(\n      this.elementRef.nativeElement,\n      this.dndDragoverClass\n    );\n  }\n\n  @HostListener('drop', ['$event']) onDrop(event: DragEvent) {\n    try {\n      // check if this drag event is allowed to drop on this dropzone\n      const type = getDndType(event);\n      if (!this.isDropAllowed(type)) {\n        return;\n      }\n\n      const data: DragDropData = getDropData(event, isExternalDrag());\n\n      if (!this.isDropAllowed(data.type)) {\n        return;\n      }\n\n      // signal custom drop handling\n      event.preventDefault();\n\n      const dropEffect = getDropEffect(event);\n\n      setDropEffect(event, dropEffect);\n\n      if (dropEffect === 'none') {\n        return;\n      }\n\n      const dropIndex = this.getPlaceholderIndex();\n\n      // if for whatever reason the placeholder is not present in the DOM but it should be there\n      // we don't allow/emit the drop event since it breaks the contract\n      // seems to only happen if drag and drop is executed faster than the DOM updates\n      if (dropIndex === -1) {\n        return;\n      }\n\n      this.dndDrop.emit({\n        event: event,\n        dropEffect: dropEffect,\n        isExternal: isExternalDrag(),\n        data: data.data,\n        index: dropIndex,\n        type: type,\n      });\n\n      event.stopPropagation();\n    } finally {\n      this.cleanupDragoverState();\n    }\n  }\n\n  onDragLeave(event: DndEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    // check if still inside this dropzone and not yet handled by another dropzone\n    if (event._dndDropzoneActive == null) {\n      if (this.elementRef.nativeElement.contains(event.relatedTarget)) {\n        event._dndDropzoneActive = true;\n        return;\n      }\n    }\n\n    this.cleanupDragoverState();\n\n    // cleanup drop effect when leaving dropzone\n    setDropEffect(event, 'none');\n  }\n\n  private readonly dragEnterEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDragEnter(event);\n\n  private readonly dragOverEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDragOver(event);\n\n  private readonly dragLeaveEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDragLeave(event);\n\n  private isDropAllowed(type?: string): boolean {\n    // dropzone is disabled -> deny it\n    if (this.disabled) {\n      return false;\n    }\n\n    // if drag did not start from our directive\n    // and external drag sources are not allowed -> deny it\n    if (isExternalDrag() && !this.dndAllowExternal) {\n      return false;\n    }\n\n    // no filtering by types -> allow it\n    if (!this.dndDropzone) {\n      return true;\n    }\n\n    // no type set -> allow it\n    if (!type) {\n      return true;\n    }\n\n    if (!Array.isArray(this.dndDropzone)) {\n      throw new Error(\n        'dndDropzone: bound value to [dndDropzone] must be an array!'\n      );\n    }\n\n    // if dropzone contains type -> allow it\n    return this.dndDropzone.indexOf(type) !== -1;\n  }\n\n  private tryGetPlaceholder(): Element | null {\n    if (typeof this.dndPlaceholderRef !== 'undefined') {\n      return this.dndPlaceholderRef.elementRef.nativeElement as Element;\n    }\n\n    // TODO nasty workaround needed because if ng-container / template is used @ContentChild() or DI will fail because\n    // of wrong context see angular bug https://github.com/angular/angular/issues/13517\n    return this.elementRef.nativeElement.querySelector('[dndPlaceholderRef]');\n  }\n\n  private removePlaceholderFromDOM() {\n    if (this.placeholder !== null && this.placeholder.parentNode !== null) {\n      this.placeholder.parentNode.removeChild(this.placeholder);\n    }\n  }\n\n  private checkAndUpdatePlaceholderPosition(event: DragEvent): void {\n    if (this.placeholder === null) {\n      return;\n    }\n\n    // make sure the placeholder is in the DOM\n    if (this.placeholder.parentNode !== this.elementRef.nativeElement) {\n      this.renderer.appendChild(\n        this.elementRef.nativeElement,\n        this.placeholder\n      );\n    }\n\n    // update the position if the event originates from a child element of the dropzone\n    const directChild = getDirectChildElement(\n      this.elementRef.nativeElement,\n      event.target as Element\n    );\n\n    // early exit if no direct child or direct child is placeholder\n    if (directChild === null || directChild === this.placeholder) {\n      return;\n    }\n\n    const positionPlaceholderBeforeDirectChild =\n      shouldPositionPlaceholderBeforeElement(\n        event,\n        directChild,\n        this.dndHorizontal\n      );\n\n    if (positionPlaceholderBeforeDirectChild) {\n      // do insert before only if necessary\n      if (directChild.previousSibling !== this.placeholder) {\n        this.renderer.insertBefore(\n          this.elementRef.nativeElement,\n          this.placeholder,\n          directChild\n        );\n      }\n    } else {\n      // do insert after only if necessary\n      if (directChild.nextSibling !== this.placeholder) {\n        this.renderer.insertBefore(\n          this.elementRef.nativeElement,\n          this.placeholder,\n          directChild.nextSibling\n        );\n      }\n    }\n  }\n\n  private getPlaceholderIndex(): number | undefined {\n    if (this.placeholder === null) {\n      return undefined;\n    }\n\n    const element = this.elementRef.nativeElement as HTMLElement;\n\n    return Array.prototype.indexOf.call(element.children, this.placeholder);\n  }\n\n  private cleanupDragoverState() {\n    this.renderer.removeClass(\n      this.elementRef.nativeElement,\n      this.dndDragoverClass\n    );\n\n    this.removePlaceholderFromDOM();\n  }\n}\n","import {\n  Directive,\n  HostBinding,\n  HostListener,\n  inject,\n  OnDestroy,\n  OnInit,\n} from '@angular/core';\nimport { DndDraggableDirective } from './dnd-draggable.directive';\nimport { DndEvent } from './dnd-utils';\n\n@Directive({ selector: '[dndHandle]', standalone: true })\nexport class DndHandleDirective implements OnInit, OnDestroy {\n  @HostBinding('attr.draggable') draggable = true;\n\n  dndDraggableDirective = inject(DndDraggableDirective);\n\n  ngOnInit() {\n    this.dndDraggableDirective.registerDragHandle(this);\n  }\n\n  ngOnDestroy(): void {\n    this.dndDraggableDirective.registerDragHandle(undefined);\n  }\n\n  @HostListener('dragstart', ['$event'])\n  @HostListener('dragend', ['$event'])\n  onDragEvent(event: DndEvent) {\n    event._dndUsingHandle = true;\n  }\n}\n","import { NgModule } from '@angular/core';\nimport {\n  DndDraggableDirective,\n  DndDragImageRefDirective,\n} from './dnd-draggable.directive';\nimport {\n  DndDropzoneDirective,\n  DndPlaceholderRefDirective,\n} from './dnd-dropzone.directive';\nimport { DndHandleDirective } from './dnd-handle.directive';\n\n@NgModule({\n  exports: [\n    DndDraggableDirective,\n    DndDropzoneDirective,\n    DndHandleDirective,\n    DndPlaceholderRefDirective,\n    DndDragImageRefDirective,\n  ],\n  imports: [\n    DndDragImageRefDirective,\n    DndDropzoneDirective,\n    DndHandleDirective,\n    DndPlaceholderRefDirective,\n    DndDraggableDirective,\n  ],\n})\nexport class DndModule {}\n"]}