Changeset 3185975
- Timestamp:
- 11/11/2024 07:13:18 PM (17 months ago)
- Location:
- flexi-flick
- Files:
-
- 36 added
- 11 edited
-
tags/0.1.2 (added)
-
tags/0.1.2/assets (added)
-
tags/0.1.2/assets/arrow-iconsvg.svg (added)
-
tags/0.1.2/assets/css (added)
-
tags/0.1.2/assets/css/flickity.css (added)
-
tags/0.1.2/assets/css/flickity.min.css (added)
-
tags/0.1.2/assets/js (added)
-
tags/0.1.2/assets/js/flickity.pkgd.js (added)
-
tags/0.1.2/assets/js/flickity.pkgd.min.js (added)
-
tags/0.1.2/assets/screenshot-1.png (added)
-
tags/0.1.2/assets/screenshot-2.png (added)
-
tags/0.1.2/assets/screenshot-3.png (added)
-
tags/0.1.2/build (added)
-
tags/0.1.2/build/block.json (added)
-
tags/0.1.2/build/index-rtl.css (added)
-
tags/0.1.2/build/index.asset.php (added)
-
tags/0.1.2/build/index.css (added)
-
tags/0.1.2/build/index.css.map (added)
-
tags/0.1.2/build/index.js (added)
-
tags/0.1.2/build/index.js.map (added)
-
tags/0.1.2/build/style-index-rtl.css (added)
-
tags/0.1.2/build/style-index.css (added)
-
tags/0.1.2/build/style-index.css.map (added)
-
tags/0.1.2/build/view.asset.php (added)
-
tags/0.1.2/build/view.js (added)
-
tags/0.1.2/build/view.js.map (added)
-
tags/0.1.2/flexiflick.php (added)
-
tags/0.1.2/readme.txt (added)
-
tags/0.1.2/src (added)
-
tags/0.1.2/src/block.json (added)
-
tags/0.1.2/src/edit.js (added)
-
tags/0.1.2/src/editor.scss (added)
-
tags/0.1.2/src/index.js (added)
-
tags/0.1.2/src/save.js (added)
-
tags/0.1.2/src/style.scss (added)
-
tags/0.1.2/src/view.js (added)
-
trunk/build/index.asset.php (modified) (1 diff)
-
trunk/build/index.js (modified) (3 diffs)
-
trunk/build/index.js.map (modified) (1 diff)
-
trunk/build/style-index-rtl.css (modified) (5 diffs)
-
trunk/build/style-index.css (modified) (5 diffs)
-
trunk/build/style-index.css.map (modified) (1 diff)
-
trunk/flexiflick.php (modified) (4 diffs)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/src/editor.scss (modified) (1 diff)
-
trunk/src/index.js (modified) (3 diffs)
-
trunk/src/style.scss (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
flexi-flick/trunk/build/index.asset.php
r3148783 r3185975 1 <?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => ' b13c703956af4633a37a');1 <?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'd691d0ec5ee72c677241'); -
flexi-flick/trunk/build/index.js
r3148783 r3185975 73 73 // Number input for autoPlay 74 74 default: 0 75 }, 76 minHeight: { 77 type: 'number', 78 // Number input for autoPlay 79 default: 450 75 80 } 76 81 }, … … 118 123 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, { 119 124 label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Show Arrows', 'flexiflick'), 120 help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick'),125 help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enter the autoPlay speed in milliseconds. For example 1500 will advance cells every 1.5 seconds. Set to 0 for no autoPlay.', 'flexiflick'), 121 126 checked: attributes.showArrows, 122 127 onChange: value => setAttributes({ … … 164 169 onChange: autoPlay => setAttributes({ 165 170 autoPlay: parseInt(autoPlay) || 0 171 }), 172 type: "number" 173 }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.TextControl, { 174 label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Min Height (px)', 'flexiflick'), 175 help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enter the minimum height in pixels for slider', 'flexiflick'), 176 value: attributes.minHeight, 177 onChange: minHeight => setAttributes({ 178 minHeight: parseInt(minHeight) || 450 166 179 }), 167 180 type: "number" -
flexi-flick/trunk/build/index.js.map
r3148783 r3185975 1 {"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB;AACU;AACQ;AACe;AACX;AAC+B;AACI;AAC1C;AACD;AAEpC,MAAM;EAAEW;AAAkB,CAAC,GAAGC,EAAE,CAACC,MAAM;AAGvCF,iBAAiB,CAACD,6CAAa,EAAE;EAC7BK,KAAK,EAAEN,mDAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;EAC5CO,IAAI,EAAE,QAAQ;EACdC,QAAQ,EAAE,SAAS;EACnBC,UAAU,EAAE;IACRC,UAAU,EAAE;MACRC,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDC,SAAS,EAAE;MACPF,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDE,SAAS,EAAE;MACPH,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDG,UAAU,EAAE;MACRJ,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDI,UAAU,EAAE;MACRL,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDK,oBAAoB,EAAE;MAClBN,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDM,QAAQ,EAAE;MACNP,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb ;EACJ,CAAC;EACLO,IAAIA,CAAC;IAAEV,UAAU;IAAEW;EAAc,CAAC,EAAE;IAChC,MAAMC,UAAU,GAAGzB,sEAAa,CAAC,CAAC;IAClC,MAAM0B,SAAS,GAAG7B,0DAAM,CAAC,CAAC;;IAE1B;IACA,MAAM8B,KAAK,GAAG7B,0DAAS,CAAE8B,MAAM,IAAK;MAChC,MAAMC,YAAY,GAAGD,MAAM,CAAC,MAAM,CAAC,CAACE,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,EAAE;QACrFC,QAAQ,EAAE,CAAC;QAAE;QACbC,MAAM,EAAE,IAAI,CAAE;MAClB,CAAC,CAAC;MAEF,IAAIH,YAAY,EAAE;QACd,OAAOA,YAAY,CAACI,GAAG,CAAEC,IAAI,KAAM;UAC/BC,EAAE,EAAED,IAAI,CAACC,EAAE;UACXzB,KAAK,EAAEwB,IAAI,CAACxB,KAAK,CAAC0B,QAAQ;UAC1BC,OAAO,EAAEH,IAAI,CAACG,OAAO,CAACD,QAAQ;UAAE;UAChCE,kBAAkB,EAAEJ,IAAI,CAACK,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAEC,UAAU,IAAI;QACjF,CAAC,CAAC,CAAC;MACP;MAEA,OAAO,EAAE;IACb,CAAC,EAAE,EAAE,CAAC;IAEN5C,6DAAS,CAAC,MAAM;MACR;MACA,IAAI+B,KAAK,CAACc,MAAM,GAAG,CAAC,IAAIf,SAAS,CAACgB,OAAO,EAAE;QACvC,MAAMC,gBAAgB,GAAG,IAAIhD,iDAAQ,CAAC+B,SAAS,CAACgB,OAAO,EAAE;UACrDE,eAAe,EAAE/B,UAAU,CAACC,UAAU;UACtC+B,QAAQ,EAAEhC,UAAU,CAACI;QACzB,CAAC,CAAC;QAEF,OAAO,MAAM;UACT0B,gBAAgB,CAACG,OAAO,CAAC,CAAC;QAC9B,CAAC;MACL;IACJ,CAAC,EAAE,CAACjC,UAAU,CAACC,UAAU,EAAED,UAAU,CAACI,SAAS,EAAEU,KAAK,CAAC,CAAC;IAG5D,OACIoB,oDAAA;MAAA,GAAStB;IAAU,GACXsB,oDAAA,CAAChD,sEAAiB,QACdgD,oDAAA,CAAC9C,4DAAS;MAACS,KAAK,EAAEN,mDAAE,CAAC,iBAAiB,EAAE,YAAY;IAAE,GAClD2C,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC6C,IAAI,EAAE7C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9F8C,OAAO,EAAErC,UAAU,CAACC,UAAW;MAC/BqC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEV,UAAU,EAAEsC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,YAAY,EAAE,YAAY,CAAE;MACtC6C,IAAI,EAAE7C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9F8C,OAAO,EAAErC,UAAU,CAACI,SAAU;MAC9BkC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEP,SAAS,EAAEmC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC6C,IAAI,EAAE7C,mDAAE,CAAC,2EAA2E,EAAE,YAAY,CAAE;MACpG8C,OAAO,EAAErC,UAAU,CAACM,UAAW;MAC/BgC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEL,UAAU,EAAEiC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,WAAW,EAAE,YAAY,CAAE;MACrC6C,IAAI,EAAE7C,mDAAE,CAAC,2JAA2J,EAAE,YAAY,CAAE;MACpL8C,OAAO,EAAErC,UAAU,CAACK,SAAU;MAC9BiC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEN,SAAS,EAAEkC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC6C,IAAI,EAAE7C,mDAAE,CAAC,8FAA8F,EAAE,YAAY,CAAE;MAEvH8C,OAAO,EAAErC,UAAU,CAACO,UAAW;MAC/B+B,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEJ,UAAU,EAAEgC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,0BAA0B,EAAE,YAAY,CAAE;MACpD6C,IAAI,EAAE7C,mDAAE,CAAC,iEAAiE,EAAE,YAAY,CAAE;MAC1F8C,OAAO,EAAErC,UAAU,CAACQ,oBAAqB;MACzC8B,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEH,oBAAoB,EAAE+B;MAAM,CAAC;IAAE,CACvE,CAAC,EACFL,oDAAA,CAAC5C,8DAAW;MACR6C,KAAK,EAAE5C,mDAAE,CAAC,qBAAqB,EAAE,YAAY,CAAE;MAC/C6C,IAAI,EAAE7C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9FgD,KAAK,EAAEvC,UAAU,CAACS,QAAS;MAC3B6B,QAAQ,EAAG7B,QAAQ,IAAKE,aAAa,CAAC;QAAEF,QAAQ,EAAE+B,QAAQ,CAAC/B,QAAQ,CAAC,IAAI;MAAE,CAAC,CAAE;MAC7EP,IAAI,EAAC;IAAQ,CAChB,CACM,CACI,CAAC,EACpBgC,oDAAA;MAAKO,SAAS,EAAC;IAAsB,GACjCP,oDAAA;MAAMQ,GAAG,EAAE7B;IAAU,GACbqB,oDAAA;MAAKO,SAAS,EAAC;IAA8B,GACzCP,oDAAA,aAAI,qCAAuC,CAAC,EAC5CA,oDAAA,YAAG,sCAAuC,CAAC,EAC3CA,oDAAA,YAAI,iBAAiBlC,UAAU,CAACC,UAAU,GAAG,MAAM,GAAG,OAAO,IAAQ,CAAC,EACtEiC,oDAAA,YAAI,gBAAgBlC,UAAU,CAACI,SAAS,GAAG,MAAM,GAAG,OAAO,IAAQ,CAClE,CACR,CACJ,CACJ,CAAC;EAEd,CAAC;EACDuC,IAAIA,CAAA,EAAG;IACH,OAAO,IAAI,CAAC,CAAC;EACjB;AACJ,CAAC,CAAC;;;;;;;;;;ACvJF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnGF;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,SAAS;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0CAA0C,UAAU,KAAK,eAAe,IAAI,MAAM;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN,IAAI;AACJ;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnMF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACzIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,8DAAgB;AACtD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW,uBAAuB,WAAW;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7KF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,qDAAU;AAChD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACtDF;AACA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,qDAAU;AAC1B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,oDAAS;AACzB,QAAQ,mBAAO,CAAC,wDAAW;AAC3B;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;AACA;;AAEA;AACA,QAAQ,4BAA4B;AACpC,MAAM,SAAS;;AAEf;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D,wBAAwB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAgC;AACxC;AACA;AACA,kCAAkC;AAClC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,gCAAgC;AAC3C,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAQ,yBAAyB;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,yBAAyB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,OAAO;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;;AAEA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,yCAAyC,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA,uBAAuB,qBAAqB;AAC5C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,MAAM,gBAAgB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACt3BF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,8CAA8C;AAC9C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,QAAQ,aAAa;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ,IAAI,WAAW,OAAO,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnSF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,iEAAc;AAC9B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACrCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAyB;AAC9B,mBAAmB,mBAAO,CAAC,kDAAQ;AACnC,EAAE,mBAAO,CAAC,kDAAQ;AAClB,EAAE,mBAAO,CAAC,0EAAoB;AAC9B,EAAE,mBAAO,CAAC,4DAAa;AACvB,EAAE,mBAAO,CAAC,sDAAU;AACpB,EAAE,mBAAO,CAAC,wEAAmB;AAC7B,EAAE,mBAAO,CAAC,0DAAY;AACtB,EAAE,mBAAO,CAAC,kEAAgB;;AAE1B;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA,uBAAuB,SAAS;AAChC,0BAA0B,SAAS;AACnC,2BAA2B,SAAS,SAAS,YAAY;AACzD,SAAS,eAAe,YAAY,eAAe;;AAEnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACjKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,eAAe;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ,yBAAyB;;AAEjC;AACA,cAAc,GAAG;AACjB,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG;AACX,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;;AAEA,QAAQ,0BAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7DF;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,sCAAsC,mBAAO,CAAC,2DAAY;AAC1D,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;AACF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oBAAoB;AAC/B,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;;AC9UF;;;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;AChSF;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC7BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UEnDA;UACA;UACA;UACA;UACA","sources":["webpack://flexiflick/./src/index.js","webpack://flexiflick/./node_modules/ev-emitter/ev-emitter.js","webpack://flexiflick/./node_modules/fizzy-ui-utils/utils.js","webpack://flexiflick/./node_modules/flickity/js/add-remove-cell.js","webpack://flexiflick/./node_modules/flickity/js/animate.js","webpack://flexiflick/./node_modules/flickity/js/cell.js","webpack://flexiflick/./node_modules/flickity/js/core.js","webpack://flexiflick/./node_modules/flickity/js/drag.js","webpack://flexiflick/./node_modules/flickity/js/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/js/index.js","webpack://flexiflick/./node_modules/flickity/js/lazyload.js","webpack://flexiflick/./node_modules/flickity/js/page-dots.js","webpack://flexiflick/./node_modules/flickity/js/player.js","webpack://flexiflick/./node_modules/flickity/js/prev-next-button.js","webpack://flexiflick/./node_modules/flickity/js/slide.js","webpack://flexiflick/./node_modules/get-size/get-size.js","webpack://flexiflick/./node_modules/imagesloaded/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/dist/flickity.min.css","webpack://flexiflick/./src/style.scss?75bd","webpack://flexiflick/./node_modules/unidragger/unidragger.js","webpack://flexiflick/external window \"React\"","webpack://flexiflick/external window [\"wp\",\"blockEditor\"]","webpack://flexiflick/external window [\"wp\",\"components\"]","webpack://flexiflick/external window [\"wp\",\"data\"]","webpack://flexiflick/external window [\"wp\",\"element\"]","webpack://flexiflick/external window [\"wp\",\"i18n\"]","webpack://flexiflick/webpack/bootstrap","webpack://flexiflick/webpack/runtime/chunk loaded","webpack://flexiflick/webpack/runtime/compat get default export","webpack://flexiflick/webpack/runtime/define property getters","webpack://flexiflick/webpack/runtime/hasOwnProperty shorthand","webpack://flexiflick/webpack/runtime/make namespace object","webpack://flexiflick/webpack/runtime/jsonp chunk loading","webpack://flexiflick/webpack/before-startup","webpack://flexiflick/webpack/startup","webpack://flexiflick/webpack/after-startup"],"sourcesContent":["import './style.scss';\nimport Flickity from 'flickity';\nimport 'flickity/dist/flickity.min.css';\nimport { useEffect, useRef } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { InspectorControls, useBlockProps } from '@wordpress/block-editor';\nimport { PanelBody, ToggleControl, TextControl } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport metadata from './block.json';\n\nconst { registerBlockType } = wp.blocks;\n\n\nregisterBlockType(metadata.name, {\n title: __('FlexiFlick Slider', 'flexiflick'),\n icon: 'slides',\n category: 'widgets',\n attributes: {\n showArrows: {\n type: 'boolean',\n default: true,\n },\n showPager: {\n type: 'boolean',\n default: true,\n },\n draggable: {\n type: 'boolean',\n default: false,\n },\n wrapAround: {\n type: 'boolean',\n default: false,\n },\n freeScroll: {\n type: 'boolean',\n default: true,\n },\n pauseAutoPlayOnHover: {\n type: 'boolean',\n default: false,\n },\n autoPlay: {\n type: 'number', // Number input for autoPlay\n default: 0,\n },\n },\nedit({ attributes, setAttributes }) {\n const blockProps = useBlockProps();\n const sliderRef = useRef();\n\n // Fetch the custom post type content\n const posts = useSelect((select) => {\n const fetchedPosts = select('core').getEntityRecords('postType', 'flexiflick_slide_cpt', {\n per_page: 3, // Limit the number of posts for the preview\n _embed: true, // Embed related resources, such as the featured media\n });\n\n if (fetchedPosts) {\n return fetchedPosts.map((post) => ({\n id: post.id,\n title: post.title.rendered,\n content: post.content.rendered, // Use the body content instead of the excerpt\n featured_media_url: post._embedded?.['wp:featuredmedia']?.[0]?.source_url || '',\n }));\n }\n\n return [];\n }, []);\n\n useEffect(() => {\n // Initialize Flickity only if posts are loaded\n if (posts.length > 0 && sliderRef.current) {\n const flickityInstance = new Flickity(sliderRef.current, {\n prevNextButtons: attributes.showArrows,\n pageDots: attributes.showPager,\n });\n\n return () => {\n flickityInstance.destroy();\n };\n }\n }, [attributes.showArrows, attributes.showPager, posts]);\n\n\n return (\n <div {...blockProps}>\n <InspectorControls>\n <PanelBody title={__('Slider Settings', 'flexiflick')}>\n <ToggleControl\n label={__('Show Arrows', 'flexiflick')}\n help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n checked={attributes.showArrows}\n onChange={(value) => setAttributes({ showArrows: value })}\n />\n <ToggleControl\n label={__('Show Pager', 'flexiflick')}\n help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n checked={attributes.showPager}\n onChange={(value) => setAttributes({ showPager: value })}\n />\n <ToggleControl\n label={__('Wrap Around', 'flexiflick')}\n help={__('At the end of cells, wrap-around to the other end for infinite scrolling.', 'flexiflick')}\n checked={attributes.wrapAround}\n onChange={(value) => setAttributes({ wrapAround: value })}\n />\n <ToggleControl\n label={__('Draggable', 'flexiflick')}\n help={__('Enables dragging and flicking. Enabled by default when carousel has 2 or more slides. more detail can be found here https://flickity.metafizzy.co/options', 'flexiflick')}\n checked={attributes.draggable}\n onChange={(value) => setAttributes({ draggable: value })}\n />\n <ToggleControl\n label={__('Free Scroll', 'flexiflick')}\n help={__('Enables content to be freely scrolled and flicked without aligning cells to an end position.', 'flexiflick')}\n\n checked={attributes.freeScroll}\n onChange={(value) => setAttributes({ freeScroll: value })}\n />\n <ToggleControl\n label={__('Pause Auto Play On Hover', 'flexiflick')}\n help={__('Auto-playing will pause when the user hovers over the carousel.', 'flexiflick')}\n checked={attributes.pauseAutoPlayOnHover}\n onChange={(value) => setAttributes({ pauseAutoPlayOnHover: value })}\n />\n <TextControl\n label={__('AutoPlay Speed (ms)', 'flexiflick')}\n help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n value={attributes.autoPlay}\n onChange={(autoPlay) => setAttributes({ autoPlay: parseInt(autoPlay) || 0 })}\n type=\"number\"\n />\n </PanelBody>\n </InspectorControls>\n <div className=\"flickity-placeholder\">\n <div ref={sliderRef}>\n <div className=\"flickity-placeholder-content\">\n <h3>Flickity Responsive Slider/Carousel</h3>\n <p>....................................</p>\n <p>{`{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`}</p>\n <p>{`{ showPager: ${attributes.showPager ? 'True' : 'False'} }`}</p>\n </div>\n </div>\n </div>\n </div>\n );\n },\n save() {\n return null; // Rendered on the server.\n },\n});\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // set events hash\n let events = this._events = this._events || {};\n // set listeners array\n let listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( !listeners.includes( listener ) ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n let onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n let index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice( 0 );\n args = args || [];\n // once stuff\n let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( let listener of listeners ) {\n let isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( global );\n } else {\n // browser global\n global.fizzyUIUtils = factory( global );\n }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n // use object if already an array\n if ( Array.isArray( obj ) ) return obj;\n\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) return [];\n\n let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n // convert nodeList to array\n if ( isArrayLike ) return [ ...obj ];\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n let index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( elem.matches( selector ) ) return elem;\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n\n return elems\n // check that elem is an actual element\n .filter( ( elem ) => elem instanceof HTMLElement )\n .reduce( ( ffElems, elem ) => {\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return ffElems;\n }\n // filter & find items if we have a selector\n // filter\n if ( elem.matches( selector ) ) {\n ffElems.push( elem );\n }\n // find children\n let childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n ffElems = ffElems.concat( ...childElems );\n return ffElems;\n }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n let method = _class.prototype[ methodName ];\n let timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n clearTimeout( this[ timeoutName ] );\n\n let args = arguments;\n this[ timeoutName ] = setTimeout( () => {\n method.apply( this, args );\n delete this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n let readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( onDocReady );\n } else {\n document.addEventListener( 'DOMContentLoaded', onDocReady );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n let dashedNamespace = utils.toDashed( namespace );\n let dataAttr = 'data-' + dashedNamespace;\n let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n let jQuery = global.jQuery;\n\n [ ...dataAttrElems ].forEach( ( elem ) => {\n let attr = elem.getAttribute( dataAttr );\n let options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n }\n return;\n }\n // initialize\n let instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n } );\n\n } );\n};\n\n// ----- ----- //\n\nreturn utils;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n let fragment = document.createDocumentFragment();\n cells.forEach( ( cell ) => fragment.appendChild( cell.element ) );\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nlet proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n let cells = this._makeCells( elems );\n if ( !cells || !cells.length ) return;\n\n let len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n let fragment = getCellsFragment( cells );\n // append to slider\n let isAppend = index === len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n let insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n let endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index );\n this.positionSliderAtSelected();\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n let cells = this.getCells( elems );\n if ( !cells || !cells.length ) return;\n\n let minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( ( cell ) => {\n cell.remove();\n let index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n } );\n\n this.cellChange( minCellIndex );\n this.positionSliderAtSelected();\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n let cell = this.getCell( elem );\n if ( !cell ) return;\n\n cell.getSize();\n\n let index = this.cells.indexOf( cell );\n this.cellChange( index );\n // do not position slider after lazy load\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex ) {\n let prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._updateWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex, try to maintain position & select previous selected element\n let cell = this.getCell( prevSelectedElem );\n if ( cell ) this.selectedIndex = this.getCellSlideIndex( cell );\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('fizzy-ui-utils') );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory( window.fizzyUIUtils );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( utils ) {\n\n// -------------------------- animate -------------------------- //\n\nlet proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) return;\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n let previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) requestAnimationFrame( () => this.animate() );\n};\n\nproto.positionSlider = function() {\n let x = this.x;\n // wrap position around\n if ( this.isWrapping ) {\n x = utils.modulo( x, this.slideableWidth ) - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n if ( this.options.rightToLeft ) x = -x;\n let translateX = this.getPositionValue( x );\n // use 3D transforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n `translate3d(${translateX},0,0)` : `translateX(${translateX})`;\n};\n\nproto.dispatchScrollEvent = function() {\n let firstSlide = this.slides[0];\n if ( !firstSlide ) return;\n\n let positionX = -this.x - firstSlide.target;\n let progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) return;\n\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n let isResting = !this.isPointerDown &&\n Math.round( this.x * 100 ) === Math.round( previousX * 100 );\n if ( isResting ) this.restingFrames++;\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n let beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n let afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n cells.forEach( ( cell ) => {\n let cellShift = gap > 0 ? shift : 0;\n this._wrapShiftCell( cell, cellShift );\n gap -= cell.size.outerWidth;\n } );\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) return;\n\n cells.forEach( ( cell ) => this._wrapShiftCell( cell, 0 ) );\n};\n\n// @param {Integer} shift - 0, 1, or -1\nproto._wrapShiftCell = function( cell, shift ) {\n this._renderCellPosition( cell, cell.x + this.slideableWidth * shift );\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) return;\n\n // change the position to drag position by applying force\n let dragVelocity = this.dragX - this.x;\n let dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n let dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) return;\n\n let distance = this.selectedSlide.target * -1 - this.x;\n let force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('get-size') );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory( window.getSize );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( getSize ) {\n\nconst cellClassName = 'flickity-cell';\n\nfunction Cell( elem ) {\n this.element = elem;\n this.element.classList.add( cellClassName );\n\n this.x = 0;\n this.unselect();\n}\n\nlet proto = Cell.prototype;\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.classList.remove( cellClassName );\n this.element.style.transform = '';\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\nproto.remove = function() {\n this.element.remove();\n};\n\nreturn Cell;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./cell'),\n require('./slide'),\n require('./animate'),\n );\n } else {\n // browser global\n let _Flickity = window.Flickity;\n\n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype,\n );\n }\n\n}( typeof window != 'undefined' ? window : this,\n function factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n/* eslint-enable max-params */\n\n// vars\nconst { getComputedStyle, console } = window;\nlet { jQuery } = window;\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;\n// internal store of all Flickity intances\nlet instances = {};\n\nfunction Flickity( element, options ) {\n let queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) console.error(`Bad element for Flickity: ${queryElement || element}`);\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n let instance = instances[ this.element.flickityGUID ];\n if ( instance ) instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = { ...this.constructor.defaults };\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true,\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.create = {};\n\nlet proto = Flickity.prototype;\n// inherit EventEmitter\nObject.assign( proto, EvEmitter.prototype );\n\nproto._create = function() {\n let { resize, watchCSS, rightToLeft } = this.options;\n // add id for Flickity.data\n let id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.beginMargin = rightToLeft ? 'marginRight' : 'marginLeft';\n this.endMargin = rightToLeft ? 'marginLeft' : 'marginRight';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n // used for keyboard navigation\n this.focusableElems = [ this.element ];\n\n if ( resize || watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( let eventName in this.options.on ) {\n let listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n for ( let method in Flickity.create ) {\n Flickity.create[ method ].call( this );\n }\n\n if ( watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n Object.assign( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) return;\n\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n let cellElems = this._filterFindCellElements( this.element.children );\n this.slider.append( ...cellElems );\n this.viewport.append( this.slider );\n this.element.append( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n let slider = document.createElement('div');\n slider.className = 'flickity-slider';\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._updateWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n let cellElems = this._filterFindCellElements( elems );\n\n // create new Cells for collection\n return cellElems.map( ( cellElem ) => new Cell( cellElem ) );\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n let cellX = 0;\n // get cellX\n if ( index > 0 ) {\n let startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n\n this.cells.slice( index ).forEach( ( cell ) => {\n cell.x = cellX;\n this._renderCellPosition( cell, cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n } );\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = this.cells.length ?\n this.getLastSlide().target - this.slides[0].target : 0;\n};\n\nproto._renderCellPosition = function( cell, x ) {\n // render position of cell with in slider\n let sideOffset = this.options.rightToLeft ? -1 : 1;\n let renderX = x * sideOffset;\n if ( this.options.percentPosition ) renderX *= this.size.innerWidth / cell.size.width;\n let positionValue = this.getPositionValue( renderX );\n cell.element.style.transform = `translateX( ${positionValue} )`;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( ( cell ) => cell.getSize() );\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) return;\n\n let { beginMargin, endMargin } = this;\n let slide = new Slide( beginMargin, endMargin, this.cellAlign );\n this.slides.push( slide );\n\n let canCellFit = this._getCanCellFit();\n\n this.cells.forEach( ( cell, i ) => {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n let slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ endMargin ] );\n\n if ( canCellFit( i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( beginMargin, endMargin, this.cellAlign );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n } );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n let { groupCells } = this.options;\n if ( !groupCells ) return () => false;\n\n if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n let number = parseInt( groupCells, 10 );\n return ( i ) => ( i % number ) !== 0;\n }\n // default, group by width of slide\n let percent = 1;\n // parse '75%\n let percentMatch = typeof groupCells == 'string' && groupCells.match( /^(\\d+)%$/ );\n if ( percentMatch ) percent = parseInt( percentMatch[1], 10 ) / 100;\n let groupWidth = ( this.size.innerWidth + 1 ) * percent;\n return ( i, slideWidth ) => slideWidth <= groupWidth;\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nlet cellAlignShorthands = {\n left: 0,\n center: 0.5,\n right: 1,\n};\n\nproto.setCellAlign = function() {\n let { cellAlign, rightToLeft } = this.options;\n let shorthand = cellAlignShorthands[ cellAlign ];\n this.cellAlign = shorthand !== undefined ? shorthand : cellAlign;\n if ( rightToLeft ) this.cellAlign = 1 - this.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( !this.options.setGallerySize ) return;\n\n let height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = `${height}px`;\n};\n\nproto._updateWrapShiftCells = function() {\n // update isWrapping\n this.isWrapping = this.getIsWrapping();\n // only for wrap-around\n if ( !this.isWrapping ) return;\n\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n let beforeGapX = this.cursorPosition;\n let lastIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( beforeGapX, lastIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n let afterGapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( afterGapX, 0, 1 );\n};\n\nproto.getIsWrapping = function() {\n let { wrapAround } = this.options;\n if ( !wrapAround || this.slides.length < 2 ) return false;\n\n if ( wrapAround !== 'fill' ) return true;\n // check that slides can fit\n\n let gapWidth = this.slideableWidth - this.size.innerWidth;\n if ( gapWidth > this.size.innerWidth ) return true; // gap * 2x big, all good\n // check that content width - shifting cell is bigger than viewport width\n for ( let cell of this.cells ) {\n if ( cell.size.outerWidth > gapWidth ) return false;\n }\n return true;\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n let cells = [];\n while ( gapX > 0 ) {\n let cell = this.cells[ cellIndex ];\n if ( !cell ) break;\n\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain & wrap ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n let isContaining = this.options.contain && !this.isWrapping &&\n this.cells.length;\n if ( !isContaining ) return;\n\n let contentWidth = this.slideableWidth - this.getLastCell().size[ this.endMargin ];\n // content is less than gallery size\n let isContentSmaller = contentWidth < this.size.innerWidth;\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n this.slides.forEach( ( slide ) => {\n slide.target = contentWidth * this.cellAlign;\n } );\n } else {\n // contain to bounds\n let beginBound = this.cursorPosition + this.cells[0].size[ this.beginMargin ];\n let endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n this.slides.forEach( ( slide ) => {\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n } );\n }\n};\n\n// ----- events ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n let emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n let $event = type;\n if ( event ) {\n // create jQuery event\n let jQEvent = new jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\nconst unidraggerEvents = [\n 'dragStart',\n 'dragMove',\n 'dragEnd',\n 'pointerDown',\n 'pointerMove',\n 'pointerEnd',\n 'staticClick',\n];\n\nlet _emitEvent = proto.emitEvent;\nproto.emitEvent = function( eventName, args ) {\n if ( eventName === 'staticClick' ) {\n // add cellElem and cellIndex args to staticClick\n let clickedCell = this.getParentCell( args[0].target );\n let cellElem = clickedCell && clickedCell.element;\n let cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n args = args.concat( cellElem, cellIndex );\n }\n // do regular thing\n _emitEvent.call( this, eventName, args );\n // duck-punch in jQuery events for Unidragger events\n let isUnidraggerEvent = unidraggerEvents.includes( eventName );\n if ( !isUnidraggerEvent || !jQuery || !this.$element ) return;\n\n eventName += this.options.namespaceJQueryEvents ? '.flickity' : '';\n let event = args.shift( 0 );\n let jQEvent = new jQuery.Event( event );\n jQEvent.type = eventName;\n this.$element.trigger( jQEvent, args );\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) return;\n\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.isWrapping || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) return;\n\n let prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index !== prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n if ( !this.isWrapping ) return;\n\n const { selectedIndex, slideableWidth, slides: { length } } = this;\n // shift index for wrap, do not wrap dragSelect\n if ( !this.isDragSelect ) {\n let wrapIndex = utils.modulo( index, length );\n // go to shortest\n let delta = Math.abs( wrapIndex - selectedIndex );\n let backWrapDelta = Math.abs( ( wrapIndex + length ) - selectedIndex );\n let forewardWrapDelta = Math.abs( ( wrapIndex - length ) - selectedIndex );\n if ( backWrapDelta < delta ) {\n index += length;\n } else if ( forewardWrapDelta < delta ) {\n index -= length;\n }\n }\n\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= slideableWidth;\n } else if ( index >= length ) {\n this.x += slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n let slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) return;\n\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) this.selectedSlide.unselect();\n};\n\nproto.selectInitialIndex = function() {\n let initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n let cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n let index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n let cell = this.queryCell( value );\n if ( !cell ) return;\n\n let index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slide that has cell\n let cellSlide = this.slides.find( ( slide ) => slide.cells.includes( cell ) );\n return this.slides.indexOf( cellSlide );\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( let cell of this.cells ) {\n if ( cell.element === elem ) return cell;\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n return elems.map( ( elem ) => this.getCell( elem ) ).filter( Boolean );\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( ( cell ) => cell.element );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n let cell = this.getCell( elem );\n if ( cell ) return cell;\n\n // try to get parent cell elem\n let closest = elem.closest('.flickity-slider > *');\n return this.getCell( closest );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) return this.selectedSlide.getCellElements();\n\n index = index === undefined ? this.selectedIndex : index;\n\n let len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements(); // get all\n }\n\n let cellElems = [];\n for ( let i = index - adjCount; i <= index + adjCount; i++ ) {\n let slideIndex = this.isWrapping ? utils.modulo( i, len ) : i;\n let slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n // do not select invalid selectors from hash: #123, #/. #791\n let isSelectorString = typeof selector == 'string' && !selector.match( /^[#.]?[\\d/]/ );\n if ( isSelectorString ) {\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n // #1177 disable resize behavior when animating or dragging for iOS 15\n if ( !this.isActive || this.isAnimating || this.isDragging ) return;\n this.getSize();\n // wrap values\n if ( this.isWrapping ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._updateWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n let selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n if ( !this.options.watchCSS ) return;\n\n let afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.includes('flickity') ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n let { activeElement } = document;\n let handler = Flickity.keyboardHandlers[ event.key ];\n // only work if element is in focus\n if ( !this.options.accessibility || !activeElement || !handler ) return;\n\n let isFocused = this.focusableElems.some( ( elem ) => activeElement === elem );\n if ( isFocused ) handler.call( this );\n};\n\nFlickity.keyboardHandlers = {\n ArrowLeft: function() {\n this.uiChange();\n let leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this[ leftMethod ]();\n },\n ArrowRight: function() {\n this.uiChange();\n let rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n this.element.focus({ preventScroll: true });\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) return;\n\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( ( cell ) => cell.destroy() );\n this.viewport.remove();\n // move child elements back into element\n this.element.append( ...this.slider.children );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nObject.assign( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n if ( elem ) return instances[ elem.flickityGUID ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n jQueryBridget( 'flickity', Flickity, jQuery );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","// drag\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./core'),\n require('unidragger'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this,\n function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nObject.assign( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n} );\n\n// -------------------------- drag prototype -------------------------- //\n\nlet proto = Flickity.prototype;\nObject.assign( proto, Unidragger.prototype ); // inherit Unidragger\nproto.touchActionValue = '';\n\n// -------------------------- -------------------------- //\n\nFlickity.create.drag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n this.on( 'pointerDown', this.handlePointerDown );\n this.on( 'pointerUp', this.handlePointerUp );\n this.on( 'pointerDown', this.handlePointerDone );\n this.on( 'dragStart', this.handleDragStart );\n this.on( 'dragMove', this.handleDragMove );\n this.on( 'dragEnd', this.handleDragEnd );\n this.on( 'staticClick', this.handleStaticClick );\n // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable === '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n this.element.classList.toggle( 'is-draggable', this.isDraggable );\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.handlePointerDown = function( event ) {\n if ( !this.isDraggable ) {\n // proceed for staticClick\n this.bindActivePointerEvents( event );\n return;\n }\n\n let isTouchStart = event.type === 'touchstart';\n let isTouchPointer = event.pointerType === 'touch';\n let isFocusNode = event.target.matches('input, textarea, select');\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) event.preventDefault();\n if ( !isFocusNode ) this.focus();\n // blur\n if ( document.activeElement !== this.element ) document.activeElement.blur();\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n this.bindActivePointerEvents( event );\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.handlePointerUp = function() {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n};\n\nproto.handlePointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.handleDragStart = function() {\n if ( !this.isDraggable ) return;\n\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n};\n\nproto.handleDragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) return;\n\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n let direction = this.options.rightToLeft ? -1 : 1;\n // wrap around move. #589\n if ( this.isWrapping ) moveVector.x %= this.slideableWidth;\n let dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.isWrapping ) {\n // slow drag\n let originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n let endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n this.dragMoveTime = new Date();\n};\n\nproto.handleDragEnd = function() {\n if ( !this.isDraggable ) return;\n\n let { freeScroll } = this.options;\n if ( freeScroll ) this.isFreeScrolling = true;\n // set selectedIndex based on where flick will end up\n let index = this.dragEndRestingSelect();\n\n if ( freeScroll && !this.isWrapping ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n let restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !freeScroll && index === this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.isWrapping;\n this.select( index );\n delete this.isDragSelect;\n};\n\nproto.dragEndRestingSelect = function() {\n let restingX = this.getRestingPosition();\n // how far away from selected slide\n let distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n let positiveResting = this._getClosestResting( restingX, distance, 1 );\n let negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n return positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n let index = this.selectedIndex;\n let minDistance = Infinity;\n let condition = this.options.contain && !this.isWrapping ?\n // if containing, keep going if distance is equal to minDistance\n ( dist, minDist ) => dist <= minDist :\n ( dist, minDist ) => dist < minDist;\n\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) break;\n\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment,\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n let len = this.slides.length;\n // wrap around if at least 2 slides\n let isWrapAround = this.options.wrapAround && len > 1;\n let slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n let slide = this.slides[ slideIndex ];\n if ( !slide ) return null;\n\n // add distance for wrap-around slides\n let wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n let distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n let delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n let scroll = getScrollPosition();\n let scrollMoveX = this.pointerDownScroll.x - scroll.x;\n let scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this.pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset,\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n","// imagesloaded\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('imagesloaded'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.imagesLoaded,\n );\n }\n\n}( typeof window != 'undefined' ? window : this,\n function factory( Flickity, imagesLoaded ) {\n\nFlickity.create.imagesLoaded = function() {\n this.on( 'activate', this.imagesLoaded );\n};\n\nFlickity.prototype.imagesLoaded = function() {\n if ( !this.options.imagesLoaded ) return;\n\n let onImagesLoadedProgress = ( instance, image ) => {\n let cell = this.getParentCell( image.img );\n this.cellSizeChange( cell && cell.element );\n if ( !this.options.freeScroll ) this.positionSliderAtSelected();\n };\n imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v3.0.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2022 Metafizzy\n */\n\nif ( typeof module == 'object' && module.exports ) {\n const Flickity = require('./core');\n require('./drag');\n require('./prev-next-button');\n require('./page-dots');\n require('./player');\n require('./add-remove-cell');\n require('./lazyload');\n require('./imagesloaded');\n\n module.exports = Flickity;\n}\n","// lazyload\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\nconst lazyAttr = 'data-flickity-lazyload';\nconst lazySrcAttr = `${lazyAttr}-src`;\nconst lazySrcsetAttr = `${lazyAttr}-srcset`;\nconst imgSelector = `img[${lazyAttr}], img[${lazySrcAttr}], ` +\n `img[${lazySrcsetAttr}], source[${lazySrcsetAttr}]`;\n\nFlickity.create.lazyLoad = function() {\n this.on( 'select', this.lazyLoad );\n\n this.handleLazyLoadComplete = this.onLazyLoadComplete.bind( this );\n};\n\nlet proto = Flickity.prototype;\n\nproto.lazyLoad = function() {\n let { lazyLoad } = this.options;\n if ( !lazyLoad ) return;\n\n // get adjacent cells, use lazyLoad option for adjacent count\n let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n // lazy load images\n this.getAdjacentCellElements( adjCount )\n .map( getCellLazyImages )\n .flat()\n .forEach( ( img ) => new LazyLoader( img, this.handleLazyLoadComplete ) );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.matches('img') ) {\n let cellAttr = cellElem.getAttribute( lazyAttr );\n let cellSrcAttr = cellElem.getAttribute( lazySrcAttr );\n let cellSrcsetAttr = cellElem.getAttribute( lazySrcsetAttr );\n if ( cellAttr || cellSrcAttr || cellSrcsetAttr ) {\n return cellElem;\n }\n }\n // select lazy images in cell\n return [ ...cellElem.querySelectorAll( imgSelector ) ];\n}\n\nproto.onLazyLoadComplete = function( img, event ) {\n let cell = this.getParentCell( img );\n let cellElem = cell && cell.element;\n this.cellSizeChange( cellElem );\n\n this.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Function} onComplete - callback function\n */\nfunction LazyLoader( img, onComplete ) {\n this.img = img;\n this.onComplete = onComplete;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n let src = this.img.getAttribute( lazyAttr ) ||\n this.img.getAttribute( lazySrcAttr );\n let srcset = this.img.getAttribute( lazySrcsetAttr );\n // set src & serset\n this.img.src = src;\n if ( srcset ) this.img.setAttribute( 'srcset', srcset );\n // remove attr\n this.img.removeAttribute( lazyAttr );\n this.img.removeAttribute( lazySrcAttr );\n this.img.removeAttribute( lazySrcsetAttr );\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n let mediaElem = this.img.parentNode.matches('picture') ? this.img.parentNode : this.img;\n mediaElem.classList.add( className );\n\n this.onComplete( this.img, event );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\nfunction PageDots() {\n // create holder element\n this.holder = document.createElement('div');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n}\n\nPageDots.prototype.setDots = function( slidesLength ) {\n // get difference between number of slides and number of dots\n let delta = slidesLength - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n let newDots = new Array( count ).fill()\n .map( ( item, i ) => {\n let dot = document.createElement('button');\n dot.setAttribute( 'type', 'button' );\n let num = i + 1 + this.dots.length;\n dot.className = 'flickity-page-dot';\n dot.textContent = `View slide ${num}`;\n return dot;\n } );\n\n this.holder.append( ...newDots );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n let removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( ( dot ) => dot.remove() );\n};\n\nPageDots.prototype.updateSelected = function( index ) {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.classList.remove('is-selected');\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) return;\n\n this.selectedDot = this.dots[ index ];\n this.selectedDot.classList.add('is-selected');\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n pageDots: true,\n} );\n\nFlickity.create.pageDots = function() {\n if ( !this.options.pageDots ) return;\n\n this.pageDots = new PageDots();\n this.handlePageDotsClick = this.onPageDotsClick.bind( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePageDots = function() {\n this.pageDots.setDots( this.slides.length );\n this.focusableElems.push( ...this.pageDots.dots );\n this.pageDots.holder.addEventListener( 'click', this.handlePageDotsClick );\n this.element.append( this.pageDots.holder );\n};\n\nproto.onPageDotsClick = function( event ) {\n let index = this.pageDots.dots.indexOf( event.target );\n if ( index === -1 ) return; // only dot clicks\n\n this.uiChange();\n this.select( index );\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected( this.selectedIndex );\n};\n\nproto.updatePageDots = function() {\n this.pageDots.dots.forEach( ( dot ) => {\n utils.removeFrom( this.focusableElems, dot );\n } );\n this.pageDots.setDots( this.slides.length );\n this.focusableElems.push( ...this.pageDots.dots );\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.holder.remove();\n this.pageDots.holder.removeEventListener( 'click', this.handlePageDotsClick );\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('./core') );\n } else {\n // browser global\n factory( window.Flickity );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( autoPlay, onTick ) {\n this.autoPlay = autoPlay;\n this.onTick = onTick;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state === 'playing' ) return;\n\n // do not play if page is hidden, start playing when page is visible\n let isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state !== 'playing' ) return;\n\n // default to 3 seconds\n let time = typeof this.autoPlay == 'number' ? this.autoPlay : 3000;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( () => {\n this.onTick();\n this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state === 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state === 'paused' ) this.play();\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n let isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n pauseAutoPlayOnHover: true,\n} );\n\nFlickity.create.player = function() {\n this.player = new Player( this.options.autoPlay, () => {\n this.next( true );\n } );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) return;\n\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) return;\n\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('./core') );\n } else {\n // browser global\n factory( window.Flickity );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\nconst svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( increment, direction, arrowShape ) {\n this.increment = increment;\n this.direction = direction;\n this.isPrevious = increment === 'previous';\n this.isLeft = direction === 'left';\n this._create( arrowShape );\n}\n\nPrevNextButton.prototype._create = function( arrowShape ) {\n // properties\n let element = this.element = document.createElement('button');\n element.className = `flickity-button flickity-prev-next-button ${this.increment}`;\n let label = this.isPrevious ? 'Previous' : 'Next';\n // prevent button from submitting form https://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n element.setAttribute( 'aria-label', label );\n // init as disabled\n this.disable();\n // create arrow\n let svg = this.createSVG( label, arrowShape );\n element.append( svg );\n};\n\nPrevNextButton.prototype.createSVG = function( label, arrowShape ) {\n let svg = document.createElementNS( svgURI, 'svg' );\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n // add title #1189\n let title = document.createElementNS( svgURI, 'title' );\n title.append( label );\n // add path\n let path = document.createElementNS( svgURI, 'path' );\n let pathMovements = getArrowMovements( arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180)' );\n }\n svg.append( title, path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) return shape;\n\n let { x0, x1, x2, x3, y1, y2 } = shape;\n\n // create movement string\n return `M ${x0}, 50\n L ${x1}, ${y1 + 50}\n L ${x2}, ${y2 + 50}\n L ${x3}, 50\n L ${x2}, ${50 - y2}\n L ${x1}, ${50 - y1}\n Z`;\n}\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n this.element.removeAttribute('disabled');\n};\n\nPrevNextButton.prototype.disable = function() {\n this.element.setAttribute( 'disabled', true );\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nObject.assign( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30,\n },\n} );\n\nFlickity.create.prevNextButtons = function() {\n if ( !this.options.prevNextButtons ) return;\n\n let { rightToLeft, arrowShape } = this.options;\n let prevDirection = rightToLeft ? 'right' : 'left';\n let nextDirection = rightToLeft ? 'left' : 'right';\n this.prevButton = new PrevNextButton( 'previous', prevDirection, arrowShape );\n this.nextButton = new PrevNextButton( 'next', nextDirection, arrowShape );\n this.focusableElems.push( this.prevButton.element );\n this.focusableElems.push( this.nextButton.element );\n\n this.handlePrevButtonClick = () => {\n this.uiChange();\n this.previous();\n };\n\n this.handleNextButtonClick = () => {\n this.uiChange();\n this.next();\n };\n\n this.on( 'activate', this.activatePrevNextButtons );\n this.on( 'select', this.updatePrevNextButtons );\n};\n\nlet proto = Flickity.prototype;\n\nproto.updatePrevNextButtons = function() {\n let lastIndex = this.slides.length ? this.slides.length - 1 : 0;\n this.updatePrevNextButton( this.prevButton, 0 );\n this.updatePrevNextButton( this.nextButton, lastIndex );\n};\n\nproto.updatePrevNextButton = function( button, disabledIndex ) {\n // enable is wrapAround and at least 2 slides\n if ( this.isWrapping && this.slides.length > 1 ) {\n button.enable();\n return;\n }\n\n let isEnabled = this.selectedIndex !== disabledIndex;\n button[ isEnabled ? 'enable' : 'disable' ]();\n // if disabling button that is focused,\n // shift focus to element to maintain keyboard accessibility\n let isDisabledFocused = !isEnabled && document.activeElement === button.element;\n if ( isDisabledFocused ) this.focus();\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.element.addEventListener( 'click', this.handlePrevButtonClick );\n this.nextButton.element.addEventListener( 'click', this.handleNextButtonClick );\n this.element.append( this.prevButton.element, this.nextButton.element );\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.element.remove();\n this.nextButton.element.remove();\n this.prevButton.element.removeEventListener( 'click', this.handlePrevButtonClick );\n this.nextButton.element.removeEventListener( 'click', this.handleNextButtonClick );\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function factory() {\n\nfunction Slide( beginMargin, endMargin, cellAlign ) {\n this.beginMargin = beginMargin;\n this.endMargin = endMargin;\n this.cellAlign = cellAlign;\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nlet proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length === 1 ) {\n this.x = cell.x; // x comes from first cell\n this.firstMargin = cell.size[ this.beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n let lastCell = this.getLastCell();\n let lastMargin = lastCell ? lastCell.size[ this.endMargin ] : 0;\n let slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( ( cell ) => cell.select() );\n};\n\nproto.unselect = function() {\n this.cells.forEach( ( cell ) => cell.unselect() );\n};\n\nproto.getCellElements = function() {\n return this.cells.map( ( cell ) => cell.element );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * Infinite Scroll v2.0.4\n * measure size of elements\n * MIT license\n */\n\n( function( window, factory ) {\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n} )( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n let num = parseFloat( value );\n // not a percent like '100%', and a number\n let isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\n// -------------------------- measurements -------------------------- //\n\nlet measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth',\n];\n\nlet measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n let size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0,\n };\n measurements.forEach( ( measurement ) => {\n size[ measurement ] = 0;\n } );\n return size;\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) elem = document.querySelector( elem );\n\n // do not proceed on non-objects\n let isElement = elem && typeof elem == 'object' && elem.nodeType;\n if ( !isElement ) return;\n\n let style = getComputedStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) return getZeroSize();\n\n let size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n measurements.forEach( ( measurement ) => {\n let value = style[ measurement ];\n let num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n } );\n\n let paddingWidth = size.paddingLeft + size.paddingRight;\n let paddingHeight = size.paddingTop + size.paddingBottom;\n let marginWidth = size.marginLeft + size.marginRight;\n let marginHeight = size.marginTop + size.marginBottom;\n let borderWidth = size.borderLeftWidth + size.borderRightWidth;\n let borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n // overwrite width and height if we can get it from style\n let styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBox ? 0 : paddingWidth + borderWidth );\n }\n\n let styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBox ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n} );\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( window, require('ev-emitter') );\n } else {\n // browser global\n window.imagesLoaded = factory( window, window.EvEmitter );\n }\n\n} )( typeof window !== 'undefined' ? window : this,\n function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n // use object if already an array\n if ( Array.isArray( obj ) ) return obj;\n\n let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n // convert nodeList to array\n if ( isArrayLike ) return [ ...obj ];\n\n // array of single index\n return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n if ( !( this instanceof ImagesLoaded ) ) {\n return new ImagesLoaded( elem, options, onAlways );\n }\n // use elem as selector string\n let queryElem = elem;\n if ( typeof elem == 'string' ) {\n queryElem = document.querySelectorAll( elem );\n }\n // bail if bad element\n if ( !queryElem ) {\n console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n return;\n }\n\n this.elements = makeArray( queryElem );\n this.options = {};\n // shift arguments if no options set\n if ( typeof options == 'function' ) {\n onAlways = options;\n } else {\n Object.assign( this.options, options );\n }\n\n if ( onAlways ) this.on( 'always', onAlways );\n\n this.getImages();\n // add jQuery Deferred object\n if ( $ ) this.jqDeferred = new $.Deferred();\n\n // HACK check async to allow time to bind listeners\n setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n this.images = [];\n\n // filter & find items if we have an item selector\n this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n // filter siblings\n if ( elem.nodeName === 'IMG' ) {\n this.addImage( elem );\n }\n // get background image on element\n if ( this.options.background === true ) {\n this.addElementBackgroundImages( elem );\n }\n\n // find children\n // no non-element nodes, #143\n let { nodeType } = elem;\n if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n let childImgs = elem.querySelectorAll('img');\n // concat childElems to filterFound array\n for ( let img of childImgs ) {\n this.addImage( img );\n }\n\n // get child background images\n if ( typeof this.options.background == 'string' ) {\n let children = elem.querySelectorAll( this.options.background );\n for ( let child of children ) {\n this.addElementBackgroundImages( child );\n }\n }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n let style = getComputedStyle( elem );\n // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n if ( !style ) return;\n\n // get url inside url(\"...\")\n let matches = reURL.exec( style.backgroundImage );\n while ( matches !== null ) {\n let url = matches && matches[2];\n if ( url ) {\n this.addBackground( url, elem );\n }\n matches = reURL.exec( style.backgroundImage );\n }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n let loadingImage = new LoadingImage( img );\n this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n let background = new Background( url, elem );\n this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n this.progressedCount = 0;\n this.hasAnyBroken = false;\n // complete if no images\n if ( !this.images.length ) {\n this.complete();\n return;\n }\n\n /* eslint-disable-next-line func-style */\n let onProgress = ( image, elem, message ) => {\n // HACK - Chrome triggers event before object properties have changed. #83\n setTimeout( () => {\n this.progress( image, elem, message );\n } );\n };\n\n this.images.forEach( function( loadingImage ) {\n loadingImage.once( 'progress', onProgress );\n loadingImage.check();\n } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n this.progressedCount++;\n this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n // progress event\n this.emitEvent( 'progress', [ this, image, elem ] );\n if ( this.jqDeferred && this.jqDeferred.notify ) {\n this.jqDeferred.notify( this, image );\n }\n // check if completed\n if ( this.progressedCount === this.images.length ) {\n this.complete();\n }\n\n if ( this.options.debug && console ) {\n console.log( `progress: ${message}`, image, elem );\n }\n};\n\nImagesLoaded.prototype.complete = function() {\n let eventName = this.hasAnyBroken ? 'fail' : 'done';\n this.isComplete = true;\n this.emitEvent( eventName, [ this ] );\n this.emitEvent( 'always', [ this ] );\n if ( this.jqDeferred ) {\n let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n this.jqDeferred[ jqMethod ]( this );\n }\n};\n\n// -------------------------- -------------------------- //\n\nfunction LoadingImage( img ) {\n this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n // If complete is true and browser supports natural sizes,\n // try to check for image status manually.\n let isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n // report based on naturalWidth\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n return;\n }\n\n // If none of the checks above matched, simulate loading on detached element.\n this.proxyImage = new Image();\n // add crossOrigin attribute. #204\n if ( this.img.crossOrigin ) {\n this.proxyImage.crossOrigin = this.img.crossOrigin;\n }\n this.proxyImage.addEventListener( 'load', this );\n this.proxyImage.addEventListener( 'error', this );\n // bind to image as well for Firefox. #191\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n // check for non-zero, non-undefined naturalWidth\n // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n let { parentNode } = this.img;\n // emit progress with parent <picture> or self <img>\n let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nLoadingImage.prototype.onload = function() {\n this.confirm( true, 'onload' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n this.confirm( false, 'onerror' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n this.proxyImage.removeEventListener( 'load', this );\n this.proxyImage.removeEventListener( 'error', this );\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n this.url = url;\n this.element = element;\n this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.img.src = this.url;\n // check if image is already complete\n let isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n this.unbindEvents();\n }\n};\n\nBackground.prototype.unbindEvents = function() {\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n jQuery = jQuery || window.jQuery;\n if ( !jQuery ) return;\n\n // set local variable\n $ = jQuery;\n // $().imagesLoaded()\n $.fn.imagesLoaded = function( options, onAlways ) {\n let instance = new ImagesLoaded( this, options, onAlways );\n return instance.jqDeferred.promise( $( this ) );\n };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// -------------------------- -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*!\n * Unidragger v3.0.1\n * Draggable base class\n * MIT license\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.EvEmitter,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) {\n\nfunction Unidragger() {}\n\n// inherit EvEmitter\nlet proto = Unidragger.prototype = Object.create( EvEmitter.prototype );\n\n// ----- bind start ----- //\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nlet startEvent, activeEvents;\nif ( 'ontouchstart' in window ) {\n // HACK prefer Touch Events as you can preventDefault on touchstart to\n // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n startEvent = 'touchstart';\n activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ];\n} else if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ];\n} else {\n // mouse events\n startEvent = 'mousedown';\n activeEvents = [ 'mousemove', 'mouseup' ];\n}\n\n// prototype so it can be overwriteable by Flickity\nproto.touchActionValue = 'none';\n\nproto.bindHandles = function() {\n this._bindHandles( 'addEventListener', this.touchActionValue );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( 'removeEventListener', '' );\n};\n\n/**\n * Add or remove start event\n * @param {String} bindMethod - addEventListener or removeEventListener\n * @param {String} touchAction - value for touch-action CSS property\n */\nproto._bindHandles = function( bindMethod, touchAction ) {\n this.handles.forEach( ( handle ) => {\n handle[ bindMethod ]( startEvent, this );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) handle.style.touchAction = touchAction;\n } );\n};\n\nproto.bindActivePointerEvents = function() {\n activeEvents.forEach( ( eventName ) => {\n window.addEventListener( eventName, this );\n } );\n};\n\nproto.unbindActivePointerEvents = function() {\n activeEvents.forEach( ( eventName ) => {\n window.removeEventListener( eventName, this );\n } );\n};\n\n// ----- event handler helpers ----- //\n\n// trigger method with matching pointer\nproto.withPointer = function( methodName, event ) {\n if ( event.pointerId === this.pointerIdentifier ) {\n this[ methodName ]( event, event );\n }\n};\n\n// trigger method with matching touch\nproto.withTouch = function( methodName, event ) {\n let touch;\n for ( let changedTouch of event.changedTouches ) {\n if ( changedTouch.identifier === this.pointerIdentifier ) {\n touch = changedTouch;\n }\n }\n if ( touch ) this[ methodName ]( event, touch );\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n this.pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this.pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this.pointerDown( event, event );\n};\n\n// nodes that have text fields\nconst cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ];\n// input types that do not have text fields\nconst clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ];\n\n/**\n * any time you set `event, pointer` it refers to:\n * @param {Event} event\n * @param {Event | Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n // dismiss multi-touch taps, right clicks, and clicks on text fields\n let isCursorNode = cursorNodes.includes( event.target.nodeName );\n let isClickType = clickTypes.includes( event.target.type );\n let isOkayElement = !isCursorNode || isClickType;\n let isOkay = !this.isPointerDown && !event.button && isOkayElement;\n if ( !isOkay ) return;\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n // track position for move\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n\n this.bindActivePointerEvents();\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// ----- move ----- //\n\nproto.onmousemove = function( event ) {\n this.pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n this.withPointer( 'pointerMove', event );\n};\n\nproto.ontouchmove = function( event ) {\n this.withTouch( 'pointerMove', event );\n};\n\nproto.pointerMove = function( event, pointer ) {\n let moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY,\n };\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n // start drag if pointer has moved far enough to start drag\n let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector );\n if ( isDragStarting ) this.dragStart( event, pointer );\n if ( this.isDragging ) this.dragMove( event, pointer, moveVector );\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- drag ----- //\n\nproto.dragStart = function( event, pointer ) {\n this.isDragging = true;\n this.isPreventingClicks = true; // set flag to prevent clicks\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// ----- end ----- //\n\nproto.onmouseup = function( event ) {\n this.pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n this.withPointer( 'pointerUp', event );\n};\n\nproto.ontouchend = function( event ) {\n this.withTouch( 'pointerUp', event );\n};\n\nproto.pointerUp = function( event, pointer ) {\n this.pointerDone();\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n\n if ( this.isDragging ) {\n this.dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this.staticClick( event, pointer );\n }\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.isDragging = false; // reset flag\n // re-enable clicking async\n setTimeout( () => delete this.isPreventingClicks );\n\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// triggered on pointer up & pointer cancel\nproto.pointerDone = function() {\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n this.unbindActivePointerEvents();\n this.emitEvent('pointerDone');\n};\n\n// ----- cancel ----- //\n\nproto.onpointercancel = function( event ) {\n this.withPointer( 'pointerCancel', event );\n};\n\nproto.ontouchcancel = function( event ) {\n this.withTouch( 'pointerCancel', event );\n};\n\nproto.pointerCancel = function( event, pointer ) {\n this.pointerDone();\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- click ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) event.preventDefault();\n};\n\n// triggered after pointer down & up with no/tiny movement\nproto.staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n let isMouseup = event.type === 'mouseup';\n if ( isMouseup && this.isIgnoringMouseUp ) return;\n\n this.emitEvent( 'staticClick', [ event, pointer ] );\n\n // set flag for emulated clicks 300ms after touchend\n if ( isMouseup ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 400ms\n setTimeout( () => {\n delete this.isIgnoringMouseUp;\n }, 400 );\n }\n};\n\n// ----- ----- //\n\nreturn Unidragger;\n\n} ) );\n","module.exports = window[\"React\"];","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0,\n\t\"./style-index\": 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkflexiflick\"] = self[\"webpackChunkflexiflick\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [\"./style-index\"], () => (__webpack_require__(\"./src/index.js\")))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["Flickity","useEffect","useRef","useSelect","InspectorControls","useBlockProps","PanelBody","ToggleControl","TextControl","__","metadata","registerBlockType","wp","blocks","name","title","icon","category","attributes","showArrows","type","default","showPager","draggable","wrapAround","freeScroll","pauseAutoPlayOnHover","autoPlay","edit","setAttributes","blockProps","sliderRef","posts","select","fetchedPosts","getEntityRecords","per_page","_embed","map","post","id","rendered","content","featured_media_url","_embedded","source_url","length","current","flickityInstance","prevNextButtons","pageDots","destroy","createElement","label","help","checked","onChange","value","parseInt","className","ref","save"],"sourceRoot":""}1 {"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB;AACU;AACQ;AACe;AACX;AAC+B;AACI;AAC1C;AACD;AAEpC,MAAM;EAAEW;AAAkB,CAAC,GAAGC,EAAE,CAACC,MAAM;AAGvCF,iBAAiB,CAACD,6CAAa,EAAE;EAC7BK,KAAK,EAAEN,mDAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;EAC5CO,IAAI,EAAE,QAAQ;EACdC,QAAQ,EAAE,SAAS;EACnBC,UAAU,EAAE;IACRC,UAAU,EAAE;MACRC,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDC,SAAS,EAAE;MACPF,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDE,SAAS,EAAE;MACPH,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDG,UAAU,EAAE;MACRJ,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDI,UAAU,EAAE;MACRL,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDK,oBAAoB,EAAE;MAClBN,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDM,QAAQ,EAAE;MACNP,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb,CAAC;IACDO,SAAS,EAAE;MACPR,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb;EACJ,CAAC;EACLQ,IAAIA,CAAC;IAAEX,UAAU;IAAEY;EAAc,CAAC,EAAE;IAChC,MAAMC,UAAU,GAAG1B,sEAAa,CAAC,CAAC;IAClC,MAAM2B,SAAS,GAAG9B,0DAAM,CAAC,CAAC;;IAE1B;IACA,MAAM+B,KAAK,GAAG9B,0DAAS,CAAE+B,MAAM,IAAK;MAChC,MAAMC,YAAY,GAAGD,MAAM,CAAC,MAAM,CAAC,CAACE,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,EAAE;QACrFC,QAAQ,EAAE,CAAC;QAAE;QACbC,MAAM,EAAE,IAAI,CAAE;MAClB,CAAC,CAAC;MAEF,IAAIH,YAAY,EAAE;QACd,OAAOA,YAAY,CAACI,GAAG,CAAEC,IAAI,KAAM;UAC/BC,EAAE,EAAED,IAAI,CAACC,EAAE;UACX1B,KAAK,EAAEyB,IAAI,CAACzB,KAAK,CAAC2B,QAAQ;UAC1BC,OAAO,EAAEH,IAAI,CAACG,OAAO,CAACD,QAAQ;UAAE;UAChCE,kBAAkB,EAAEJ,IAAI,CAACK,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAEC,UAAU,IAAI;QACjF,CAAC,CAAC,CAAC;MACP;MAEA,OAAO,EAAE;IACb,CAAC,EAAE,EAAE,CAAC;IAEN7C,6DAAS,CAAC,MAAM;MACR;MACA,IAAIgC,KAAK,CAACc,MAAM,GAAG,CAAC,IAAIf,SAAS,CAACgB,OAAO,EAAE;QACvC,MAAMC,gBAAgB,GAAG,IAAIjD,iDAAQ,CAACgC,SAAS,CAACgB,OAAO,EAAE;UACrDE,eAAe,EAAEhC,UAAU,CAACC,UAAU;UACtCgC,QAAQ,EAAEjC,UAAU,CAACI;QACzB,CAAC,CAAC;QAEF,OAAO,MAAM;UACT2B,gBAAgB,CAACG,OAAO,CAAC,CAAC;QAC9B,CAAC;MACL;IACJ,CAAC,EAAE,CAAClC,UAAU,CAACC,UAAU,EAAED,UAAU,CAACI,SAAS,EAAEW,KAAK,CAAC,CAAC;IAG5D,OACIoB,oDAAA;MAAA,GAAStB;IAAU,GACXsB,oDAAA,CAACjD,sEAAiB,QACdiD,oDAAA,CAAC/C,4DAAS;MAACS,KAAK,EAAEN,mDAAE,CAAC,iBAAiB,EAAE,YAAY;IAAE,GAClD4C,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC8C,IAAI,EAAE9C,mDAAE,CAAC,4HAA4H,EAAE,YAAY,CAAE;MACrJ+C,OAAO,EAAEtC,UAAU,CAACC,UAAW;MAC/BsC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEX,UAAU,EAAEuC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,YAAY,EAAE,YAAY,CAAE;MACtC8C,IAAI,EAAE9C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9F+C,OAAO,EAAEtC,UAAU,CAACI,SAAU;MAC9BmC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAER,SAAS,EAAEoC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC8C,IAAI,EAAE9C,mDAAE,CAAC,2EAA2E,EAAE,YAAY,CAAE;MACpG+C,OAAO,EAAEtC,UAAU,CAACM,UAAW;MAC/BiC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEN,UAAU,EAAEkC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,WAAW,EAAE,YAAY,CAAE;MACrC8C,IAAI,EAAE9C,mDAAE,CAAC,2JAA2J,EAAE,YAAY,CAAE;MACpL+C,OAAO,EAAEtC,UAAU,CAACK,SAAU;MAC9BkC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEP,SAAS,EAAEmC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC8C,IAAI,EAAE9C,mDAAE,CAAC,8FAA8F,EAAE,YAAY,CAAE;MAEvH+C,OAAO,EAAEtC,UAAU,CAACO,UAAW;MAC/BgC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEL,UAAU,EAAEiC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,0BAA0B,EAAE,YAAY,CAAE;MACpD8C,IAAI,EAAE9C,mDAAE,CAAC,iEAAiE,EAAE,YAAY,CAAE;MAC1F+C,OAAO,EAAEtC,UAAU,CAACQ,oBAAqB;MACzC+B,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEJ,oBAAoB,EAAEgC;MAAM,CAAC;IAAE,CACvE,CAAC,EACFL,oDAAA,CAAC7C,8DAAW;MACR8C,KAAK,EAAE7C,mDAAE,CAAC,qBAAqB,EAAE,YAAY,CAAE;MAC/C8C,IAAI,EAAE9C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9FiD,KAAK,EAAExC,UAAU,CAACS,QAAS;MAC3B8B,QAAQ,EAAG9B,QAAQ,IAAKG,aAAa,CAAC;QAAEH,QAAQ,EAAEgC,QAAQ,CAAChC,QAAQ,CAAC,IAAI;MAAE,CAAC,CAAE;MAC7EP,IAAI,EAAC;IAAQ,CAChB,CAAC,EACFiC,oDAAA,CAAC7C,8DAAW;MACR8C,KAAK,EAAE7C,mDAAE,CAAC,iBAAiB,EAAE,YAAY,CAAE;MAC3C8C,IAAI,EAAE9C,mDAAE,CAAC,+CAA+C,EAAE,YAAY,CAAE;MACxEiD,KAAK,EAAExC,UAAU,CAACU,SAAU;MAC5B6B,QAAQ,EAAG7B,SAAS,IAAKE,aAAa,CAAC;QAAEF,SAAS,EAAE+B,QAAQ,CAAC/B,SAAS,CAAC,IAAI;MAAI,CAAC,CAAE;MAClFR,IAAI,EAAC;IAAQ,CAChB,CACM,CACI,CAAC,EACpBiC,oDAAA;MAAKO,SAAS,EAAC;IAAsB,GACjCP,oDAAA;MAAMQ,GAAG,EAAE7B;IAAU,GACbqB,oDAAA;MAAKO,SAAS,EAAC;IAA8B,GACzCP,oDAAA,aAAI,qCAAuC,CAAC,EAC5CA,oDAAA,YAAG,sCAAuC,CAAC,EAC3CA,oDAAA,YAAI,iBAAiBnC,UAAU,CAACC,UAAU,GAAG,MAAM,GAAG,OAAO,IAAQ,CAAC,EACtEkC,oDAAA,YAAI,gBAAgBnC,UAAU,CAACI,SAAS,GAAG,MAAM,GAAG,OAAO,IAAQ,CAClE,CACR,CACJ,CACJ,CAAC;EAEd,CAAC;EACDwC,IAAIA,CAAA,EAAG;IACH,OAAO,IAAI,CAAC,CAAC;EACjB;AACJ,CAAC,CAAC;;;;;;;;;;AClKF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnGF;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,SAAS;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0CAA0C,UAAU,KAAK,eAAe,IAAI,MAAM;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN,IAAI;AACJ;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnMF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACzIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,8DAAgB;AACtD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW,uBAAuB,WAAW;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7KF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,qDAAU;AAChD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACtDF;AACA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,qDAAU;AAC1B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,oDAAS;AACzB,QAAQ,mBAAO,CAAC,wDAAW;AAC3B;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;AACA;;AAEA;AACA,QAAQ,4BAA4B;AACpC,MAAM,SAAS;;AAEf;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D,wBAAwB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAgC;AACxC;AACA;AACA,kCAAkC;AAClC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,gCAAgC;AAC3C,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAQ,yBAAyB;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,yBAAyB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,OAAO;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;;AAEA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,yCAAyC,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA,uBAAuB,qBAAqB;AAC5C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,MAAM,gBAAgB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACt3BF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,8CAA8C;AAC9C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,QAAQ,aAAa;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ,IAAI,WAAW,OAAO,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnSF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,iEAAc;AAC9B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACrCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAyB;AAC9B,mBAAmB,mBAAO,CAAC,kDAAQ;AACnC,EAAE,mBAAO,CAAC,kDAAQ;AAClB,EAAE,mBAAO,CAAC,0EAAoB;AAC9B,EAAE,mBAAO,CAAC,4DAAa;AACvB,EAAE,mBAAO,CAAC,sDAAU;AACpB,EAAE,mBAAO,CAAC,wEAAmB;AAC7B,EAAE,mBAAO,CAAC,0DAAY;AACtB,EAAE,mBAAO,CAAC,kEAAgB;;AAE1B;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA,uBAAuB,SAAS;AAChC,0BAA0B,SAAS;AACnC,2BAA2B,SAAS,SAAS,YAAY;AACzD,SAAS,eAAe,YAAY,eAAe;;AAEnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACjKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,eAAe;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ,yBAAyB;;AAEjC;AACA,cAAc,GAAG;AACjB,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG;AACX,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;;AAEA,QAAQ,0BAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7DF;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,sCAAsC,mBAAO,CAAC,2DAAY;AAC1D,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;AACF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oBAAoB;AAC/B,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;;AC9UF;;;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;AChSF;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC7BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UEnDA;UACA;UACA;UACA;UACA","sources":["webpack://flexiflick/./src/index.js","webpack://flexiflick/./node_modules/ev-emitter/ev-emitter.js","webpack://flexiflick/./node_modules/fizzy-ui-utils/utils.js","webpack://flexiflick/./node_modules/flickity/js/add-remove-cell.js","webpack://flexiflick/./node_modules/flickity/js/animate.js","webpack://flexiflick/./node_modules/flickity/js/cell.js","webpack://flexiflick/./node_modules/flickity/js/core.js","webpack://flexiflick/./node_modules/flickity/js/drag.js","webpack://flexiflick/./node_modules/flickity/js/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/js/index.js","webpack://flexiflick/./node_modules/flickity/js/lazyload.js","webpack://flexiflick/./node_modules/flickity/js/page-dots.js","webpack://flexiflick/./node_modules/flickity/js/player.js","webpack://flexiflick/./node_modules/flickity/js/prev-next-button.js","webpack://flexiflick/./node_modules/flickity/js/slide.js","webpack://flexiflick/./node_modules/get-size/get-size.js","webpack://flexiflick/./node_modules/imagesloaded/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/dist/flickity.min.css","webpack://flexiflick/./src/style.scss","webpack://flexiflick/./node_modules/unidragger/unidragger.js","webpack://flexiflick/external window \"React\"","webpack://flexiflick/external window [\"wp\",\"blockEditor\"]","webpack://flexiflick/external window [\"wp\",\"components\"]","webpack://flexiflick/external window [\"wp\",\"data\"]","webpack://flexiflick/external window [\"wp\",\"element\"]","webpack://flexiflick/external window [\"wp\",\"i18n\"]","webpack://flexiflick/webpack/bootstrap","webpack://flexiflick/webpack/runtime/chunk loaded","webpack://flexiflick/webpack/runtime/compat get default export","webpack://flexiflick/webpack/runtime/define property getters","webpack://flexiflick/webpack/runtime/hasOwnProperty shorthand","webpack://flexiflick/webpack/runtime/make namespace object","webpack://flexiflick/webpack/runtime/jsonp chunk loading","webpack://flexiflick/webpack/before-startup","webpack://flexiflick/webpack/startup","webpack://flexiflick/webpack/after-startup"],"sourcesContent":["import './style.scss';\nimport Flickity from 'flickity';\nimport 'flickity/dist/flickity.min.css';\nimport { useEffect, useRef } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { InspectorControls, useBlockProps } from '@wordpress/block-editor';\nimport { PanelBody, ToggleControl, TextControl } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport metadata from './block.json';\n\nconst { registerBlockType } = wp.blocks;\n\n\nregisterBlockType(metadata.name, {\n title: __('FlexiFlick Slider', 'flexiflick'),\n icon: 'slides',\n category: 'widgets',\n attributes: {\n showArrows: {\n type: 'boolean',\n default: true,\n },\n showPager: {\n type: 'boolean',\n default: true,\n },\n draggable: {\n type: 'boolean',\n default: false,\n },\n wrapAround: {\n type: 'boolean',\n default: false,\n },\n freeScroll: {\n type: 'boolean',\n default: true,\n },\n pauseAutoPlayOnHover: {\n type: 'boolean',\n default: false,\n },\n autoPlay: {\n type: 'number', // Number input for autoPlay\n default: 0,\n },\n minHeight: {\n type: 'number', // Number input for autoPlay\n default: 450,\n },\n },\nedit({ attributes, setAttributes }) {\n const blockProps = useBlockProps();\n const sliderRef = useRef();\n\n // Fetch the custom post type content\n const posts = useSelect((select) => {\n const fetchedPosts = select('core').getEntityRecords('postType', 'flexiflick_slide_cpt', {\n per_page: 3, // Limit the number of posts for the preview\n _embed: true, // Embed related resources, such as the featured media\n });\n\n if (fetchedPosts) {\n return fetchedPosts.map((post) => ({\n id: post.id,\n title: post.title.rendered,\n content: post.content.rendered, // Use the body content instead of the excerpt\n featured_media_url: post._embedded?.['wp:featuredmedia']?.[0]?.source_url || '',\n }));\n }\n\n return [];\n }, []);\n\n useEffect(() => {\n // Initialize Flickity only if posts are loaded\n if (posts.length > 0 && sliderRef.current) {\n const flickityInstance = new Flickity(sliderRef.current, {\n prevNextButtons: attributes.showArrows,\n pageDots: attributes.showPager,\n });\n\n return () => {\n flickityInstance.destroy();\n };\n }\n }, [attributes.showArrows, attributes.showPager, posts]);\n\n\n return (\n <div {...blockProps}>\n <InspectorControls>\n <PanelBody title={__('Slider Settings', 'flexiflick')}>\n <ToggleControl\n label={__('Show Arrows', 'flexiflick')}\n help={__('Enter the autoPlay speed in milliseconds. For example 1500 will advance cells every 1.5 seconds. Set to 0 for no autoPlay.', 'flexiflick')}\n checked={attributes.showArrows}\n onChange={(value) => setAttributes({ showArrows: value })}\n />\n <ToggleControl\n label={__('Show Pager', 'flexiflick')}\n help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n checked={attributes.showPager}\n onChange={(value) => setAttributes({ showPager: value })}\n />\n <ToggleControl\n label={__('Wrap Around', 'flexiflick')}\n help={__('At the end of cells, wrap-around to the other end for infinite scrolling.', 'flexiflick')}\n checked={attributes.wrapAround}\n onChange={(value) => setAttributes({ wrapAround: value })}\n />\n <ToggleControl\n label={__('Draggable', 'flexiflick')}\n help={__('Enables dragging and flicking. Enabled by default when carousel has 2 or more slides. more detail can be found here https://flickity.metafizzy.co/options', 'flexiflick')}\n checked={attributes.draggable}\n onChange={(value) => setAttributes({ draggable: value })}\n />\n <ToggleControl\n label={__('Free Scroll', 'flexiflick')}\n help={__('Enables content to be freely scrolled and flicked without aligning cells to an end position.', 'flexiflick')}\n\n checked={attributes.freeScroll}\n onChange={(value) => setAttributes({ freeScroll: value })}\n />\n <ToggleControl\n label={__('Pause Auto Play On Hover', 'flexiflick')}\n help={__('Auto-playing will pause when the user hovers over the carousel.', 'flexiflick')}\n checked={attributes.pauseAutoPlayOnHover}\n onChange={(value) => setAttributes({ pauseAutoPlayOnHover: value })}\n />\n <TextControl\n label={__('AutoPlay Speed (ms)', 'flexiflick')}\n help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n value={attributes.autoPlay}\n onChange={(autoPlay) => setAttributes({ autoPlay: parseInt(autoPlay) || 0 })}\n type=\"number\"\n />\n <TextControl\n label={__('Min Height (px)', 'flexiflick')}\n help={__('Enter the minimum height in pixels for slider', 'flexiflick')}\n value={attributes.minHeight}\n onChange={(minHeight) => setAttributes({ minHeight: parseInt(minHeight) || 450 })}\n type=\"number\"\n />\n </PanelBody>\n </InspectorControls>\n <div className=\"flickity-placeholder\">\n <div ref={sliderRef}>\n <div className=\"flickity-placeholder-content\">\n <h3>Flickity Responsive Slider/Carousel</h3>\n <p>....................................</p>\n <p>{`{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`}</p>\n <p>{`{ showPager: ${attributes.showPager ? 'True' : 'False'} }`}</p>\n </div>\n </div>\n </div>\n </div>\n );\n },\n save() {\n return null; // Rendered on the server.\n },\n});\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // set events hash\n let events = this._events = this._events || {};\n // set listeners array\n let listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( !listeners.includes( listener ) ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n let onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n let index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice( 0 );\n args = args || [];\n // once stuff\n let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( let listener of listeners ) {\n let isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( global );\n } else {\n // browser global\n global.fizzyUIUtils = factory( global );\n }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n // use object if already an array\n if ( Array.isArray( obj ) ) return obj;\n\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) return [];\n\n let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n // convert nodeList to array\n if ( isArrayLike ) return [ ...obj ];\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n let index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( elem.matches( selector ) ) return elem;\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n\n return elems\n // check that elem is an actual element\n .filter( ( elem ) => elem instanceof HTMLElement )\n .reduce( ( ffElems, elem ) => {\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return ffElems;\n }\n // filter & find items if we have a selector\n // filter\n if ( elem.matches( selector ) ) {\n ffElems.push( elem );\n }\n // find children\n let childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n ffElems = ffElems.concat( ...childElems );\n return ffElems;\n }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n let method = _class.prototype[ methodName ];\n let timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n clearTimeout( this[ timeoutName ] );\n\n let args = arguments;\n this[ timeoutName ] = setTimeout( () => {\n method.apply( this, args );\n delete this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n let readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( onDocReady );\n } else {\n document.addEventListener( 'DOMContentLoaded', onDocReady );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n let dashedNamespace = utils.toDashed( namespace );\n let dataAttr = 'data-' + dashedNamespace;\n let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n let jQuery = global.jQuery;\n\n [ ...dataAttrElems ].forEach( ( elem ) => {\n let attr = elem.getAttribute( dataAttr );\n let options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n }\n return;\n }\n // initialize\n let instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n } );\n\n } );\n};\n\n// ----- ----- //\n\nreturn utils;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n let fragment = document.createDocumentFragment();\n cells.forEach( ( cell ) => fragment.appendChild( cell.element ) );\n return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nlet proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n let cells = this._makeCells( elems );\n if ( !cells || !cells.length ) return;\n\n let len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n let fragment = getCellsFragment( cells );\n // append to slider\n let isAppend = index === len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n let insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n let endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n\n this._sizeCells( cells );\n this.cellChange( index );\n this.positionSliderAtSelected();\n};\n\nproto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n let cells = this.getCells( elems );\n if ( !cells || !cells.length ) return;\n\n let minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( ( cell ) => {\n cell.remove();\n let index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n } );\n\n this.cellChange( minCellIndex );\n this.positionSliderAtSelected();\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n let cell = this.getCell( elem );\n if ( !cell ) return;\n\n cell.getSize();\n\n let index = this.cells.indexOf( cell );\n this.cellChange( index );\n // do not position slider after lazy load\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex ) {\n let prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._updateWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex, try to maintain position & select previous selected element\n let cell = this.getCell( prevSelectedElem );\n if ( cell ) this.selectedIndex = this.getCellSlideIndex( cell );\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n};\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('fizzy-ui-utils') );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory( window.fizzyUIUtils );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( utils ) {\n\n// -------------------------- animate -------------------------- //\n\nlet proto = {};\n\nproto.startAnimation = function() {\n if ( this.isAnimating ) return;\n\n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n};\n\nproto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n\n let previousX = this.x;\n\n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) requestAnimationFrame( () => this.animate() );\n};\n\nproto.positionSlider = function() {\n let x = this.x;\n // wrap position around\n if ( this.isWrapping ) {\n x = utils.modulo( x, this.slideableWidth ) - this.slideableWidth;\n this.shiftWrapCells( x );\n }\n\n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n if ( this.options.rightToLeft ) x = -x;\n let translateX = this.getPositionValue( x );\n // use 3D transforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n `translate3d(${translateX},0,0)` : `translateX(${translateX})`;\n};\n\nproto.dispatchScrollEvent = function() {\n let firstSlide = this.slides[0];\n if ( !firstSlide ) return;\n\n let positionX = -this.x - firstSlide.target;\n let progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) return;\n\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n};\n\nproto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n let isResting = !this.isPointerDown &&\n Math.round( this.x * 100 ) === Math.round( previousX * 100 );\n if ( isResting ) this.restingFrames++;\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n }\n};\n\nproto.shiftWrapCells = function( x ) {\n // shift before cells\n let beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n let afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n cells.forEach( ( cell ) => {\n let cellShift = gap > 0 ? shift : 0;\n this._wrapShiftCell( cell, cellShift );\n gap -= cell.size.outerWidth;\n } );\n};\n\nproto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) return;\n\n cells.forEach( ( cell ) => this._wrapShiftCell( cell, 0 ) );\n};\n\n// @param {Integer} shift - 0, 1, or -1\nproto._wrapShiftCell = function( cell, shift ) {\n this._renderCellPosition( cell, cell.x + this.slideableWidth * shift );\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) return;\n\n // change the position to drag position by applying force\n let dragVelocity = this.dragX - this.x;\n let dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n let dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) return;\n\n let distance = this.selectedSlide.target * -1 - this.x;\n let force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('get-size') );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory( window.getSize );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( getSize ) {\n\nconst cellClassName = 'flickity-cell';\n\nfunction Cell( elem ) {\n this.element = elem;\n this.element.classList.add( cellClassName );\n\n this.x = 0;\n this.unselect();\n}\n\nlet proto = Cell.prototype;\n\nproto.destroy = function() {\n // reset style\n this.unselect();\n this.element.classList.remove( cellClassName );\n this.element.style.transform = '';\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\nproto.remove = function() {\n this.element.remove();\n};\n\nreturn Cell;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./cell'),\n require('./slide'),\n require('./animate'),\n );\n } else {\n // browser global\n let _Flickity = window.Flickity;\n\n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype,\n );\n }\n\n}( typeof window != 'undefined' ? window : this,\n function factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n/* eslint-enable max-params */\n\n// vars\nconst { getComputedStyle, console } = window;\nlet { jQuery } = window;\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;\n// internal store of all Flickity intances\nlet instances = {};\n\nfunction Flickity( element, options ) {\n let queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) console.error(`Bad element for Flickity: ${queryElement || element}`);\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n let instance = instances[ this.element.flickityGUID ];\n if ( instance ) instance.option( options );\n return instance;\n }\n\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = { ...this.constructor.defaults };\n this.option( options );\n\n // kick things off\n this._create();\n}\n\nFlickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true,\n // watchCSS: false,\n // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.create = {};\n\nlet proto = Flickity.prototype;\n// inherit EventEmitter\nObject.assign( proto, EvEmitter.prototype );\n\nproto._create = function() {\n let { resize, watchCSS, rightToLeft } = this.options;\n // add id for Flickity.data\n let id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.beginMargin = rightToLeft ? 'marginRight' : 'marginLeft';\n this.endMargin = rightToLeft ? 'marginLeft' : 'marginRight';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n // used for keyboard navigation\n this.focusableElems = [ this.element ];\n\n if ( resize || watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n\n // add listeners from on option\n for ( let eventName in this.options.on ) {\n let listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n\n for ( let method in Flickity.create ) {\n Flickity.create[ method ].call( this );\n }\n\n if ( watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n Object.assign( this.options, opts );\n};\n\nproto.activate = function() {\n if ( this.isActive ) return;\n\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n\n this.getSize();\n // move initial cell elements so they can be loaded as cells\n let cellElems = this._filterFindCellElements( this.element.children );\n this.slider.append( ...cellElems );\n this.viewport.append( this.slider );\n this.element.append( this.viewport );\n // get cells from children\n this.reloadCells();\n\n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n\n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n // slider element does all the positioning\n let slider = document.createElement('div');\n slider.className = 'flickity-slider';\n this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._updateWrapShiftCells();\n this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n let cellElems = this._filterFindCellElements( elems );\n\n // create new Cells for collection\n return cellElems.map( ( cellElem ) => new Cell( cellElem ) );\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n let cellX = 0;\n // get cellX\n if ( index > 0 ) {\n let startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n\n this.cells.slice( index ).forEach( ( cell ) => {\n cell.x = cellX;\n this._renderCellPosition( cell, cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n } );\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = this.cells.length ?\n this.getLastSlide().target - this.slides[0].target : 0;\n};\n\nproto._renderCellPosition = function( cell, x ) {\n // render position of cell with in slider\n let sideOffset = this.options.rightToLeft ? -1 : 1;\n let renderX = x * sideOffset;\n if ( this.options.percentPosition ) renderX *= this.size.innerWidth / cell.size.width;\n let positionValue = this.getPositionValue( renderX );\n cell.element.style.transform = `translateX( ${positionValue} )`;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n cells.forEach( ( cell ) => cell.getSize() );\n};\n\n// -------------------------- -------------------------- //\n\nproto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) return;\n\n let { beginMargin, endMargin } = this;\n let slide = new Slide( beginMargin, endMargin, this.cellAlign );\n this.slides.push( slide );\n\n let canCellFit = this._getCanCellFit();\n\n this.cells.forEach( ( cell, i ) => {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n\n let slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ endMargin ] );\n\n if ( canCellFit( i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n\n slide = new Slide( beginMargin, endMargin, this.cellAlign );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n } );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n let { groupCells } = this.options;\n if ( !groupCells ) return () => false;\n\n if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n let number = parseInt( groupCells, 10 );\n return ( i ) => ( i % number ) !== 0;\n }\n // default, group by width of slide\n let percent = 1;\n // parse '75%\n let percentMatch = typeof groupCells == 'string' && groupCells.match( /^(\\d+)%$/ );\n if ( percentMatch ) percent = parseInt( percentMatch[1], 10 ) / 100;\n let groupWidth = ( this.size.innerWidth + 1 ) * percent;\n return ( i, slideWidth ) => slideWidth <= groupWidth;\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nlet cellAlignShorthands = {\n left: 0,\n center: 0.5,\n right: 1,\n};\n\nproto.setCellAlign = function() {\n let { cellAlign, rightToLeft } = this.options;\n let shorthand = cellAlignShorthands[ cellAlign ];\n this.cellAlign = shorthand !== undefined ? shorthand : cellAlign;\n if ( rightToLeft ) this.cellAlign = 1 - this.cellAlign;\n};\n\nproto.setGallerySize = function() {\n if ( !this.options.setGallerySize ) return;\n\n let height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = `${height}px`;\n};\n\nproto._updateWrapShiftCells = function() {\n // update isWrapping\n this.isWrapping = this.getIsWrapping();\n // only for wrap-around\n if ( !this.isWrapping ) return;\n\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n let beforeGapX = this.cursorPosition;\n let lastIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( beforeGapX, lastIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n let afterGapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( afterGapX, 0, 1 );\n};\n\nproto.getIsWrapping = function() {\n let { wrapAround } = this.options;\n if ( !wrapAround || this.slides.length < 2 ) return false;\n\n if ( wrapAround !== 'fill' ) return true;\n // check that slides can fit\n\n let gapWidth = this.slideableWidth - this.size.innerWidth;\n if ( gapWidth > this.size.innerWidth ) return true; // gap * 2x big, all good\n // check that content width - shifting cell is bigger than viewport width\n for ( let cell of this.cells ) {\n if ( cell.size.outerWidth > gapWidth ) return false;\n }\n return true;\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n let cells = [];\n while ( gapX > 0 ) {\n let cell = this.cells[ cellIndex ];\n if ( !cell ) break;\n\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n};\n\n// ----- contain & wrap ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n let isContaining = this.options.contain && !this.isWrapping &&\n this.cells.length;\n if ( !isContaining ) return;\n\n let contentWidth = this.slideableWidth - this.getLastCell().size[ this.endMargin ];\n // content is less than gallery size\n let isContentSmaller = contentWidth < this.size.innerWidth;\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n this.slides.forEach( ( slide ) => {\n slide.target = contentWidth * this.cellAlign;\n } );\n } else {\n // contain to bounds\n let beginBound = this.cursorPosition + this.cells[0].size[ this.beginMargin ];\n let endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n this.slides.forEach( ( slide ) => {\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n } );\n }\n};\n\n// ----- events ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n let emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n let $event = type;\n if ( event ) {\n // create jQuery event\n let jQEvent = new jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n};\n\nconst unidraggerEvents = [\n 'dragStart',\n 'dragMove',\n 'dragEnd',\n 'pointerDown',\n 'pointerMove',\n 'pointerEnd',\n 'staticClick',\n];\n\nlet _emitEvent = proto.emitEvent;\nproto.emitEvent = function( eventName, args ) {\n if ( eventName === 'staticClick' ) {\n // add cellElem and cellIndex args to staticClick\n let clickedCell = this.getParentCell( args[0].target );\n let cellElem = clickedCell && clickedCell.element;\n let cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n args = args.concat( cellElem, cellIndex );\n }\n // do regular thing\n _emitEvent.call( this, eventName, args );\n // duck-punch in jQuery events for Unidragger events\n let isUnidraggerEvent = unidraggerEvents.includes( eventName );\n if ( !isUnidraggerEvent || !jQuery || !this.$element ) return;\n\n eventName += this.options.namespaceJQueryEvents ? '.flickity' : '';\n let event = args.shift( 0 );\n let jQEvent = new jQuery.Event( event );\n jQEvent.type = eventName;\n this.$element.trigger( jQEvent, args );\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) return;\n\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n\n if ( this.isWrapping || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) return;\n\n let prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index !== prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n if ( !this.isWrapping ) return;\n\n const { selectedIndex, slideableWidth, slides: { length } } = this;\n // shift index for wrap, do not wrap dragSelect\n if ( !this.isDragSelect ) {\n let wrapIndex = utils.modulo( index, length );\n // go to shortest\n let delta = Math.abs( wrapIndex - selectedIndex );\n let backWrapDelta = Math.abs( ( wrapIndex + length ) - selectedIndex );\n let forewardWrapDelta = Math.abs( ( wrapIndex - length ) - selectedIndex );\n if ( backWrapDelta < delta ) {\n index += length;\n } else if ( forewardWrapDelta < delta ) {\n index -= length;\n }\n }\n\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= slideableWidth;\n } else if ( index >= length ) {\n this.x += slideableWidth;\n }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n let slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) return;\n\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) this.selectedSlide.unselect();\n};\n\nproto.selectInitialIndex = function() {\n let initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n let cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n let index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n let cell = this.queryCell( value );\n if ( !cell ) return;\n\n let index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slide that has cell\n let cellSlide = this.slides.find( ( slide ) => slide.cells.includes( cell ) );\n return this.slides.indexOf( cellSlide );\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( let cell of this.cells ) {\n if ( cell.element === elem ) return cell;\n }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n return elems.map( ( elem ) => this.getCell( elem ) ).filter( Boolean );\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n return this.cells.map( ( cell ) => cell.element );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n // first check if elem is cell\n let cell = this.getCell( elem );\n if ( cell ) return cell;\n\n // try to get parent cell elem\n let closest = elem.closest('.flickity-slider > *');\n return this.getCell( closest );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) return this.selectedSlide.getCellElements();\n\n index = index === undefined ? this.selectedIndex : index;\n\n let len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements(); // get all\n }\n\n let cellElems = [];\n for ( let i = index - adjCount; i <= index + adjCount; i++ ) {\n let slideIndex = this.isWrapping ? utils.modulo( i, len ) : i;\n let slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n // do not select invalid selectors from hash: #123, #/. #791\n let isSelectorString = typeof selector == 'string' && !selector.match( /^[#.]?[\\d/]/ );\n if ( isSelectorString ) {\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n this.watchCSS();\n this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n // #1177 disable resize behavior when animating or dragging for iOS 15\n if ( !this.isActive || this.isAnimating || this.isDragging ) return;\n this.getSize();\n // wrap values\n if ( this.isWrapping ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._updateWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n let selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n if ( !this.options.watchCSS ) return;\n\n let afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.includes('flickity') ) {\n this.activate();\n } else {\n this.deactivate();\n }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n let { activeElement } = document;\n let handler = Flickity.keyboardHandlers[ event.key ];\n // only work if element is in focus\n if ( !this.options.accessibility || !activeElement || !handler ) return;\n\n let isFocused = this.focusableElems.some( ( elem ) => activeElement === elem );\n if ( isFocused ) handler.call( this );\n};\n\nFlickity.keyboardHandlers = {\n ArrowLeft: function() {\n this.uiChange();\n let leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this[ leftMethod ]();\n },\n ArrowRight: function() {\n this.uiChange();\n let rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n this.element.focus({ preventScroll: true });\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n if ( !this.isActive ) return;\n\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( ( cell ) => cell.destroy() );\n this.viewport.remove();\n // move child elements back into element\n this.element.append( ...this.slider.children );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nObject.assign( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n if ( elem ) return instances[ elem.flickityGUID ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n jQueryBridget( 'flickity', Flickity, jQuery );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","// drag\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./core'),\n require('unidragger'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this,\n function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nObject.assign( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3,\n} );\n\n// -------------------------- drag prototype -------------------------- //\n\nlet proto = Flickity.prototype;\nObject.assign( proto, Unidragger.prototype ); // inherit Unidragger\nproto.touchActionValue = '';\n\n// -------------------------- -------------------------- //\n\nFlickity.create.drag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n this.on( 'pointerDown', this.handlePointerDown );\n this.on( 'pointerUp', this.handlePointerUp );\n this.on( 'pointerDown', this.handlePointerDone );\n this.on( 'dragStart', this.handleDragStart );\n this.on( 'dragMove', this.handleDragMove );\n this.on( 'dragEnd', this.handleDragEnd );\n this.on( 'staticClick', this.handleStaticClick );\n // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable === '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n this.element.classList.toggle( 'is-draggable', this.isDraggable );\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.handlePointerDown = function( event ) {\n if ( !this.isDraggable ) {\n // proceed for staticClick\n this.bindActivePointerEvents( event );\n return;\n }\n\n let isTouchStart = event.type === 'touchstart';\n let isTouchPointer = event.pointerType === 'touch';\n let isFocusNode = event.target.matches('input, textarea, select');\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) event.preventDefault();\n if ( !isFocusNode ) this.focus();\n // blur\n if ( document.activeElement !== this.element ) document.activeElement.blur();\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n this.bindActivePointerEvents( event );\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.handlePointerUp = function() {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n};\n\nproto.handlePointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.handleDragStart = function() {\n if ( !this.isDraggable ) return;\n\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n};\n\nproto.handleDragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) return;\n\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n let direction = this.options.rightToLeft ? -1 : 1;\n // wrap around move. #589\n if ( this.isWrapping ) moveVector.x %= this.slideableWidth;\n let dragX = this.dragStartPosition + moveVector.x * direction;\n\n if ( !this.isWrapping ) {\n // slow drag\n let originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n let endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n\n this.dragX = dragX;\n this.dragMoveTime = new Date();\n};\n\nproto.handleDragEnd = function() {\n if ( !this.isDraggable ) return;\n\n let { freeScroll } = this.options;\n if ( freeScroll ) this.isFreeScrolling = true;\n // set selectedIndex based on where flick will end up\n let index = this.dragEndRestingSelect();\n\n if ( freeScroll && !this.isWrapping ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n let restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !freeScroll && index === this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.isWrapping;\n this.select( index );\n delete this.isDragSelect;\n};\n\nproto.dragEndRestingSelect = function() {\n let restingX = this.getRestingPosition();\n // how far away from selected slide\n let distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n let positiveResting = this._getClosestResting( restingX, distance, 1 );\n let negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n return positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n let index = this.selectedIndex;\n let minDistance = Infinity;\n let condition = this.options.contain && !this.isWrapping ?\n // if containing, keep going if distance is equal to minDistance\n ( dist, minDist ) => dist <= minDist :\n ( dist, minDist ) => dist < minDist;\n\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) break;\n\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment,\n };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n let len = this.slides.length;\n // wrap around if at least 2 slides\n let isWrapAround = this.options.wrapAround && len > 1;\n let slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n let slide = this.slides[ slideIndex ];\n if ( !slide ) return null;\n\n // add distance for wrap-around slides\n let wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n\n let distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n let delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n let scroll = getScrollPosition();\n let scrollMoveX = this.pointerDownScroll.x - scroll.x;\n let scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this.pointerDone();\n }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset,\n };\n}\n\n// ----- ----- //\n\nreturn Flickity;\n\n} ) );\n","// imagesloaded\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('imagesloaded'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.imagesLoaded,\n );\n }\n\n}( typeof window != 'undefined' ? window : this,\n function factory( Flickity, imagesLoaded ) {\n\nFlickity.create.imagesLoaded = function() {\n this.on( 'activate', this.imagesLoaded );\n};\n\nFlickity.prototype.imagesLoaded = function() {\n if ( !this.options.imagesLoaded ) return;\n\n let onImagesLoadedProgress = ( instance, image ) => {\n let cell = this.getParentCell( image.img );\n this.cellSizeChange( cell && cell.element );\n if ( !this.options.freeScroll ) this.positionSliderAtSelected();\n };\n imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v3.0.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2022 Metafizzy\n */\n\nif ( typeof module == 'object' && module.exports ) {\n const Flickity = require('./core');\n require('./drag');\n require('./prev-next-button');\n require('./page-dots');\n require('./player');\n require('./add-remove-cell');\n require('./lazyload');\n require('./imagesloaded');\n\n module.exports = Flickity;\n}\n","// lazyload\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\nconst lazyAttr = 'data-flickity-lazyload';\nconst lazySrcAttr = `${lazyAttr}-src`;\nconst lazySrcsetAttr = `${lazyAttr}-srcset`;\nconst imgSelector = `img[${lazyAttr}], img[${lazySrcAttr}], ` +\n `img[${lazySrcsetAttr}], source[${lazySrcsetAttr}]`;\n\nFlickity.create.lazyLoad = function() {\n this.on( 'select', this.lazyLoad );\n\n this.handleLazyLoadComplete = this.onLazyLoadComplete.bind( this );\n};\n\nlet proto = Flickity.prototype;\n\nproto.lazyLoad = function() {\n let { lazyLoad } = this.options;\n if ( !lazyLoad ) return;\n\n // get adjacent cells, use lazyLoad option for adjacent count\n let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n // lazy load images\n this.getAdjacentCellElements( adjCount )\n .map( getCellLazyImages )\n .flat()\n .forEach( ( img ) => new LazyLoader( img, this.handleLazyLoadComplete ) );\n};\n\nfunction getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.matches('img') ) {\n let cellAttr = cellElem.getAttribute( lazyAttr );\n let cellSrcAttr = cellElem.getAttribute( lazySrcAttr );\n let cellSrcsetAttr = cellElem.getAttribute( lazySrcsetAttr );\n if ( cellAttr || cellSrcAttr || cellSrcsetAttr ) {\n return cellElem;\n }\n }\n // select lazy images in cell\n return [ ...cellElem.querySelectorAll( imgSelector ) ];\n}\n\nproto.onLazyLoadComplete = function( img, event ) {\n let cell = this.getParentCell( img );\n let cellElem = cell && cell.element;\n this.cellSizeChange( cellElem );\n\n this.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Function} onComplete - callback function\n */\nfunction LazyLoader( img, onComplete ) {\n this.img = img;\n this.onComplete = onComplete;\n this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n let src = this.img.getAttribute( lazyAttr ) ||\n this.img.getAttribute( lazySrcAttr );\n let srcset = this.img.getAttribute( lazySrcsetAttr );\n // set src & serset\n this.img.src = src;\n if ( srcset ) this.img.setAttribute( 'srcset', srcset );\n // remove attr\n this.img.removeAttribute( lazyAttr );\n this.img.removeAttribute( lazySrcAttr );\n this.img.removeAttribute( lazySrcsetAttr );\n};\n\nLazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n let mediaElem = this.img.parentNode.matches('picture') ? this.img.parentNode : this.img;\n mediaElem.classList.add( className );\n\n this.onComplete( this.img, event );\n};\n\n// ----- ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./core'),\n require('fizzy-ui-utils'),\n );\n } else {\n // browser global\n factory(\n window.Flickity,\n window.fizzyUIUtils,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\nfunction PageDots() {\n // create holder element\n this.holder = document.createElement('div');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n}\n\nPageDots.prototype.setDots = function( slidesLength ) {\n // get difference between number of slides and number of dots\n let delta = slidesLength - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n};\n\nPageDots.prototype.addDots = function( count ) {\n let newDots = new Array( count ).fill()\n .map( ( item, i ) => {\n let dot = document.createElement('button');\n dot.setAttribute( 'type', 'button' );\n let num = i + 1 + this.dots.length;\n dot.className = 'flickity-page-dot';\n dot.textContent = `View slide ${num}`;\n return dot;\n } );\n\n this.holder.append( ...newDots );\n this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n let removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( ( dot ) => dot.remove() );\n};\n\nPageDots.prototype.updateSelected = function( index ) {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.classList.remove('is-selected');\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) return;\n\n this.selectedDot = this.dots[ index ];\n this.selectedDot.classList.add('is-selected');\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n pageDots: true,\n} );\n\nFlickity.create.pageDots = function() {\n if ( !this.options.pageDots ) return;\n\n this.pageDots = new PageDots();\n this.handlePageDotsClick = this.onPageDotsClick.bind( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePageDots = function() {\n this.pageDots.setDots( this.slides.length );\n this.focusableElems.push( ...this.pageDots.dots );\n this.pageDots.holder.addEventListener( 'click', this.handlePageDotsClick );\n this.element.append( this.pageDots.holder );\n};\n\nproto.onPageDotsClick = function( event ) {\n let index = this.pageDots.dots.indexOf( event.target );\n if ( index === -1 ) return; // only dot clicks\n\n this.uiChange();\n this.select( index );\n};\n\nproto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected( this.selectedIndex );\n};\n\nproto.updatePageDots = function() {\n this.pageDots.dots.forEach( ( dot ) => {\n utils.removeFrom( this.focusableElems, dot );\n } );\n this.pageDots.setDots( this.slides.length );\n this.focusableElems.push( ...this.pageDots.dots );\n};\n\nproto.deactivatePageDots = function() {\n this.pageDots.holder.remove();\n this.pageDots.holder.removeEventListener( 'click', this.handlePageDotsClick );\n};\n\n// ----- ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('./core') );\n } else {\n // browser global\n factory( window.Flickity );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( autoPlay, onTick ) {\n this.autoPlay = autoPlay;\n this.onTick = onTick;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\n// start play\nPlayer.prototype.play = function() {\n if ( this.state === 'playing' ) return;\n\n // do not play if page is hidden, start playing when page is visible\n let isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n};\n\nPlayer.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state !== 'playing' ) return;\n\n // default to 3 seconds\n let time = typeof this.autoPlay == 'number' ? this.autoPlay : 3000;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( () => {\n this.onTick();\n this.tick();\n }, time );\n};\n\nPlayer.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n if ( this.state === 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n};\n\nPlayer.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state === 'paused' ) this.play();\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n let isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n pauseAutoPlayOnHover: true,\n} );\n\nFlickity.create.player = function() {\n this.player = new Player( this.options.autoPlay, () => {\n this.next( true );\n } );\n\n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePlayer = function() {\n if ( !this.options.autoPlay ) return;\n\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n this.player.play();\n};\n\nproto.stopPlayer = function() {\n this.player.stop();\n};\n\nproto.pausePlayer = function() {\n this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) return;\n\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n};\n\n// ----- ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( require('./core') );\n } else {\n // browser global\n factory( window.Flickity );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\nconst svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( increment, direction, arrowShape ) {\n this.increment = increment;\n this.direction = direction;\n this.isPrevious = increment === 'previous';\n this.isLeft = direction === 'left';\n this._create( arrowShape );\n}\n\nPrevNextButton.prototype._create = function( arrowShape ) {\n // properties\n let element = this.element = document.createElement('button');\n element.className = `flickity-button flickity-prev-next-button ${this.increment}`;\n let label = this.isPrevious ? 'Previous' : 'Next';\n // prevent button from submitting form https://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n element.setAttribute( 'aria-label', label );\n // init as disabled\n this.disable();\n // create arrow\n let svg = this.createSVG( label, arrowShape );\n element.append( svg );\n};\n\nPrevNextButton.prototype.createSVG = function( label, arrowShape ) {\n let svg = document.createElementNS( svgURI, 'svg' );\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n // add title #1189\n let title = document.createElementNS( svgURI, 'title' );\n title.append( label );\n // add path\n let path = document.createElementNS( svgURI, 'path' );\n let pathMovements = getArrowMovements( arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180)' );\n }\n svg.append( title, path );\n return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) return shape;\n\n let { x0, x1, x2, x3, y1, y2 } = shape;\n\n // create movement string\n return `M ${x0}, 50\n L ${x1}, ${y1 + 50}\n L ${x2}, ${y2 + 50}\n L ${x3}, 50\n L ${x2}, ${50 - y2}\n L ${x1}, ${50 - y1}\n Z`;\n}\n\n// ----- ----- //\n\nPrevNextButton.prototype.enable = function() {\n this.element.removeAttribute('disabled');\n};\n\nPrevNextButton.prototype.disable = function() {\n this.element.setAttribute( 'disabled', true );\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nObject.assign( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30,\n },\n} );\n\nFlickity.create.prevNextButtons = function() {\n if ( !this.options.prevNextButtons ) return;\n\n let { rightToLeft, arrowShape } = this.options;\n let prevDirection = rightToLeft ? 'right' : 'left';\n let nextDirection = rightToLeft ? 'left' : 'right';\n this.prevButton = new PrevNextButton( 'previous', prevDirection, arrowShape );\n this.nextButton = new PrevNextButton( 'next', nextDirection, arrowShape );\n this.focusableElems.push( this.prevButton.element );\n this.focusableElems.push( this.nextButton.element );\n\n this.handlePrevButtonClick = () => {\n this.uiChange();\n this.previous();\n };\n\n this.handleNextButtonClick = () => {\n this.uiChange();\n this.next();\n };\n\n this.on( 'activate', this.activatePrevNextButtons );\n this.on( 'select', this.updatePrevNextButtons );\n};\n\nlet proto = Flickity.prototype;\n\nproto.updatePrevNextButtons = function() {\n let lastIndex = this.slides.length ? this.slides.length - 1 : 0;\n this.updatePrevNextButton( this.prevButton, 0 );\n this.updatePrevNextButton( this.nextButton, lastIndex );\n};\n\nproto.updatePrevNextButton = function( button, disabledIndex ) {\n // enable is wrapAround and at least 2 slides\n if ( this.isWrapping && this.slides.length > 1 ) {\n button.enable();\n return;\n }\n\n let isEnabled = this.selectedIndex !== disabledIndex;\n button[ isEnabled ? 'enable' : 'disable' ]();\n // if disabling button that is focused,\n // shift focus to element to maintain keyboard accessibility\n let isDisabledFocused = !isEnabled && document.activeElement === button.element;\n if ( isDisabledFocused ) this.focus();\n};\n\nproto.activatePrevNextButtons = function() {\n this.prevButton.element.addEventListener( 'click', this.handlePrevButtonClick );\n this.nextButton.element.addEventListener( 'click', this.handleNextButtonClick );\n this.element.append( this.prevButton.element, this.nextButton.element );\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n this.prevButton.element.remove();\n this.nextButton.element.remove();\n this.prevButton.element.removeEventListener( 'click', this.handlePrevButtonClick );\n this.nextButton.element.removeEventListener( 'click', this.handleNextButtonClick );\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// -------------------------- -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function factory() {\n\nfunction Slide( beginMargin, endMargin, cellAlign ) {\n this.beginMargin = beginMargin;\n this.endMargin = endMargin;\n this.cellAlign = cellAlign;\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n}\n\nlet proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height );\n // first cell stuff\n if ( this.cells.length === 1 ) {\n this.x = cell.x; // x comes from first cell\n this.firstMargin = cell.size[ this.beginMargin ];\n }\n};\n\nproto.updateTarget = function() {\n let lastCell = this.getLastCell();\n let lastMargin = lastCell ? lastCell.size[ this.endMargin ] : 0;\n let slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.cellAlign;\n};\n\nproto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n this.cells.forEach( ( cell ) => cell.select() );\n};\n\nproto.unselect = function() {\n this.cells.forEach( ( cell ) => cell.unselect() );\n};\n\nproto.getCellElements = function() {\n return this.cells.map( ( cell ) => cell.element );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * Infinite Scroll v2.0.4\n * measure size of elements\n * MIT license\n */\n\n( function( window, factory ) {\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n} )( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n let num = parseFloat( value );\n // not a percent like '100%', and a number\n let isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\n// -------------------------- measurements -------------------------- //\n\nlet measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth',\n];\n\nlet measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n let size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0,\n };\n measurements.forEach( ( measurement ) => {\n size[ measurement ] = 0;\n } );\n return size;\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) elem = document.querySelector( elem );\n\n // do not proceed on non-objects\n let isElement = elem && typeof elem == 'object' && elem.nodeType;\n if ( !isElement ) return;\n\n let style = getComputedStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) return getZeroSize();\n\n let size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n measurements.forEach( ( measurement ) => {\n let value = style[ measurement ];\n let num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n } );\n\n let paddingWidth = size.paddingLeft + size.paddingRight;\n let paddingHeight = size.paddingTop + size.paddingBottom;\n let marginWidth = size.marginLeft + size.marginRight;\n let marginHeight = size.marginTop + size.marginBottom;\n let borderWidth = size.borderLeftWidth + size.borderRightWidth;\n let borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n // overwrite width and height if we can get it from style\n let styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBox ? 0 : paddingWidth + borderWidth );\n }\n\n let styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBox ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n} );\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory( window, require('ev-emitter') );\n } else {\n // browser global\n window.imagesLoaded = factory( window, window.EvEmitter );\n }\n\n} )( typeof window !== 'undefined' ? window : this,\n function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n // use object if already an array\n if ( Array.isArray( obj ) ) return obj;\n\n let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n // convert nodeList to array\n if ( isArrayLike ) return [ ...obj ];\n\n // array of single index\n return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n if ( !( this instanceof ImagesLoaded ) ) {\n return new ImagesLoaded( elem, options, onAlways );\n }\n // use elem as selector string\n let queryElem = elem;\n if ( typeof elem == 'string' ) {\n queryElem = document.querySelectorAll( elem );\n }\n // bail if bad element\n if ( !queryElem ) {\n console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n return;\n }\n\n this.elements = makeArray( queryElem );\n this.options = {};\n // shift arguments if no options set\n if ( typeof options == 'function' ) {\n onAlways = options;\n } else {\n Object.assign( this.options, options );\n }\n\n if ( onAlways ) this.on( 'always', onAlways );\n\n this.getImages();\n // add jQuery Deferred object\n if ( $ ) this.jqDeferred = new $.Deferred();\n\n // HACK check async to allow time to bind listeners\n setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n this.images = [];\n\n // filter & find items if we have an item selector\n this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n // filter siblings\n if ( elem.nodeName === 'IMG' ) {\n this.addImage( elem );\n }\n // get background image on element\n if ( this.options.background === true ) {\n this.addElementBackgroundImages( elem );\n }\n\n // find children\n // no non-element nodes, #143\n let { nodeType } = elem;\n if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n let childImgs = elem.querySelectorAll('img');\n // concat childElems to filterFound array\n for ( let img of childImgs ) {\n this.addImage( img );\n }\n\n // get child background images\n if ( typeof this.options.background == 'string' ) {\n let children = elem.querySelectorAll( this.options.background );\n for ( let child of children ) {\n this.addElementBackgroundImages( child );\n }\n }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n let style = getComputedStyle( elem );\n // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n if ( !style ) return;\n\n // get url inside url(\"...\")\n let matches = reURL.exec( style.backgroundImage );\n while ( matches !== null ) {\n let url = matches && matches[2];\n if ( url ) {\n this.addBackground( url, elem );\n }\n matches = reURL.exec( style.backgroundImage );\n }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n let loadingImage = new LoadingImage( img );\n this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n let background = new Background( url, elem );\n this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n this.progressedCount = 0;\n this.hasAnyBroken = false;\n // complete if no images\n if ( !this.images.length ) {\n this.complete();\n return;\n }\n\n /* eslint-disable-next-line func-style */\n let onProgress = ( image, elem, message ) => {\n // HACK - Chrome triggers event before object properties have changed. #83\n setTimeout( () => {\n this.progress( image, elem, message );\n } );\n };\n\n this.images.forEach( function( loadingImage ) {\n loadingImage.once( 'progress', onProgress );\n loadingImage.check();\n } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n this.progressedCount++;\n this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n // progress event\n this.emitEvent( 'progress', [ this, image, elem ] );\n if ( this.jqDeferred && this.jqDeferred.notify ) {\n this.jqDeferred.notify( this, image );\n }\n // check if completed\n if ( this.progressedCount === this.images.length ) {\n this.complete();\n }\n\n if ( this.options.debug && console ) {\n console.log( `progress: ${message}`, image, elem );\n }\n};\n\nImagesLoaded.prototype.complete = function() {\n let eventName = this.hasAnyBroken ? 'fail' : 'done';\n this.isComplete = true;\n this.emitEvent( eventName, [ this ] );\n this.emitEvent( 'always', [ this ] );\n if ( this.jqDeferred ) {\n let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n this.jqDeferred[ jqMethod ]( this );\n }\n};\n\n// -------------------------- -------------------------- //\n\nfunction LoadingImage( img ) {\n this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n // If complete is true and browser supports natural sizes,\n // try to check for image status manually.\n let isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n // report based on naturalWidth\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n return;\n }\n\n // If none of the checks above matched, simulate loading on detached element.\n this.proxyImage = new Image();\n // add crossOrigin attribute. #204\n if ( this.img.crossOrigin ) {\n this.proxyImage.crossOrigin = this.img.crossOrigin;\n }\n this.proxyImage.addEventListener( 'load', this );\n this.proxyImage.addEventListener( 'error', this );\n // bind to image as well for Firefox. #191\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n // check for non-zero, non-undefined naturalWidth\n // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n let { parentNode } = this.img;\n // emit progress with parent <picture> or self <img>\n let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nLoadingImage.prototype.onload = function() {\n this.confirm( true, 'onload' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n this.confirm( false, 'onerror' );\n this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n this.proxyImage.removeEventListener( 'load', this );\n this.proxyImage.removeEventListener( 'error', this );\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n this.url = url;\n this.element = element;\n this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.img.src = this.url;\n // check if image is already complete\n let isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n this.unbindEvents();\n }\n};\n\nBackground.prototype.unbindEvents = function() {\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n jQuery = jQuery || window.jQuery;\n if ( !jQuery ) return;\n\n // set local variable\n $ = jQuery;\n // $().imagesLoaded()\n $.fn.imagesLoaded = function( options, onAlways ) {\n let instance = new ImagesLoaded( this, options, onAlways );\n return instance.jqDeferred.promise( $( this ) );\n };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// -------------------------- -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*!\n * Unidragger v3.0.1\n * Draggable base class\n * MIT license\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.EvEmitter,\n );\n }\n\n}( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) {\n\nfunction Unidragger() {}\n\n// inherit EvEmitter\nlet proto = Unidragger.prototype = Object.create( EvEmitter.prototype );\n\n// ----- bind start ----- //\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nlet startEvent, activeEvents;\nif ( 'ontouchstart' in window ) {\n // HACK prefer Touch Events as you can preventDefault on touchstart to\n // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n startEvent = 'touchstart';\n activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ];\n} else if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ];\n} else {\n // mouse events\n startEvent = 'mousedown';\n activeEvents = [ 'mousemove', 'mouseup' ];\n}\n\n// prototype so it can be overwriteable by Flickity\nproto.touchActionValue = 'none';\n\nproto.bindHandles = function() {\n this._bindHandles( 'addEventListener', this.touchActionValue );\n};\n\nproto.unbindHandles = function() {\n this._bindHandles( 'removeEventListener', '' );\n};\n\n/**\n * Add or remove start event\n * @param {String} bindMethod - addEventListener or removeEventListener\n * @param {String} touchAction - value for touch-action CSS property\n */\nproto._bindHandles = function( bindMethod, touchAction ) {\n this.handles.forEach( ( handle ) => {\n handle[ bindMethod ]( startEvent, this );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) handle.style.touchAction = touchAction;\n } );\n};\n\nproto.bindActivePointerEvents = function() {\n activeEvents.forEach( ( eventName ) => {\n window.addEventListener( eventName, this );\n } );\n};\n\nproto.unbindActivePointerEvents = function() {\n activeEvents.forEach( ( eventName ) => {\n window.removeEventListener( eventName, this );\n } );\n};\n\n// ----- event handler helpers ----- //\n\n// trigger method with matching pointer\nproto.withPointer = function( methodName, event ) {\n if ( event.pointerId === this.pointerIdentifier ) {\n this[ methodName ]( event, event );\n }\n};\n\n// trigger method with matching touch\nproto.withTouch = function( methodName, event ) {\n let touch;\n for ( let changedTouch of event.changedTouches ) {\n if ( changedTouch.identifier === this.pointerIdentifier ) {\n touch = changedTouch;\n }\n }\n if ( touch ) this[ methodName ]( event, touch );\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n this.pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n this.pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n this.pointerDown( event, event );\n};\n\n// nodes that have text fields\nconst cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ];\n// input types that do not have text fields\nconst clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ];\n\n/**\n * any time you set `event, pointer` it refers to:\n * @param {Event} event\n * @param {Event | Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n // dismiss multi-touch taps, right clicks, and clicks on text fields\n let isCursorNode = cursorNodes.includes( event.target.nodeName );\n let isClickType = clickTypes.includes( event.target.type );\n let isOkayElement = !isCursorNode || isClickType;\n let isOkay = !this.isPointerDown && !event.button && isOkayElement;\n if ( !isOkay ) return;\n\n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n // track position for move\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n\n this.bindActivePointerEvents();\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// ----- move ----- //\n\nproto.onmousemove = function( event ) {\n this.pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n this.withPointer( 'pointerMove', event );\n};\n\nproto.ontouchmove = function( event ) {\n this.withTouch( 'pointerMove', event );\n};\n\nproto.pointerMove = function( event, pointer ) {\n let moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY,\n };\n this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n // start drag if pointer has moved far enough to start drag\n let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector );\n if ( isDragStarting ) this.dragStart( event, pointer );\n if ( this.isDragging ) this.dragMove( event, pointer, moveVector );\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- drag ----- //\n\nproto.dragStart = function( event, pointer ) {\n this.isDragging = true;\n this.isPreventingClicks = true; // set flag to prevent clicks\n this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// ----- end ----- //\n\nproto.onmouseup = function( event ) {\n this.pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n this.withPointer( 'pointerUp', event );\n};\n\nproto.ontouchend = function( event ) {\n this.withTouch( 'pointerUp', event );\n};\n\nproto.pointerUp = function( event, pointer ) {\n this.pointerDone();\n this.emitEvent( 'pointerUp', [ event, pointer ] );\n\n if ( this.isDragging ) {\n this.dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this.staticClick( event, pointer );\n }\n};\n\nproto.dragEnd = function( event, pointer ) {\n this.isDragging = false; // reset flag\n // re-enable clicking async\n setTimeout( () => delete this.isPreventingClicks );\n\n this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// triggered on pointer up & pointer cancel\nproto.pointerDone = function() {\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n this.unbindActivePointerEvents();\n this.emitEvent('pointerDone');\n};\n\n// ----- cancel ----- //\n\nproto.onpointercancel = function( event ) {\n this.withPointer( 'pointerCancel', event );\n};\n\nproto.ontouchcancel = function( event ) {\n this.withTouch( 'pointerCancel', event );\n};\n\nproto.pointerCancel = function( event, pointer ) {\n this.pointerDone();\n this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- click ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n if ( this.isPreventingClicks ) event.preventDefault();\n};\n\n// triggered after pointer down & up with no/tiny movement\nproto.staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n let isMouseup = event.type === 'mouseup';\n if ( isMouseup && this.isIgnoringMouseUp ) return;\n\n this.emitEvent( 'staticClick', [ event, pointer ] );\n\n // set flag for emulated clicks 300ms after touchend\n if ( isMouseup ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 400ms\n setTimeout( () => {\n delete this.isIgnoringMouseUp;\n }, 400 );\n }\n};\n\n// ----- ----- //\n\nreturn Unidragger;\n\n} ) );\n","module.exports = window[\"React\"];","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0,\n\t\"./style-index\": 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkflexiflick\"] = self[\"webpackChunkflexiflick\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [\"./style-index\"], () => (__webpack_require__(\"./src/index.js\")))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["Flickity","useEffect","useRef","useSelect","InspectorControls","useBlockProps","PanelBody","ToggleControl","TextControl","__","metadata","registerBlockType","wp","blocks","name","title","icon","category","attributes","showArrows","type","default","showPager","draggable","wrapAround","freeScroll","pauseAutoPlayOnHover","autoPlay","minHeight","edit","setAttributes","blockProps","sliderRef","posts","select","fetchedPosts","getEntityRecords","per_page","_embed","map","post","id","rendered","content","featured_media_url","_embedded","source_url","length","current","flickityInstance","prevNextButtons","pageDots","destroy","createElement","label","help","checked","onChange","value","parseInt","className","ref","save"],"sourceRoot":""} -
flexi-flick/trunk/build/style-index-rtl.css
r3148783 r3185975 15 15 16 16 .flickity-wrap img { 17 border-radius: 15px;18 17 width: 100%; 19 18 display: block; … … 25 24 26 25 .flickity-slide { 27 width: calc(85% - 60px); 28 margin-left: 10px; 29 border-radius: 5px; 30 max-width: 1200px; 31 display: block; 32 } 33 34 .flickity-slide:after { 35 content: ""; 36 background: rgba(0, 0, 0, 0.6); 37 display: block; 38 width: 50%; 39 height: 100%; 40 position: absolute; 41 z-index: -1; 26 width: 100%; 27 height: auto !important; 42 28 } 43 29 44 30 .flickity-slide-content { 45 /*position: absolute;46 top: 0px;47 width: 100%;48 padding-left: 50px;49 padding-right: 50px;*/50 31 position: absolute; 51 32 top: 50%; 52 right: 5 0%;53 transform: translate(5 0%, -50%);33 right: 5%; 34 transform: translate(5%, -50%); 54 35 color: white; /* Adjust text color to contrast with the image */ 55 padding: 10px; /* Optional: Add padding around the text */36 padding: 80px 40px; /* Optional: Add padding around the text */ 56 37 box-sizing: border-box; /* Ensures padding is included in the element's total width and height */ 57 38 width: 80%; /* Adjust to fit within the image */ 39 max-width: 800px; 58 40 } 59 41 … … 72 54 width: 12px !important; 73 55 border-radius: 8px !important; 56 } 57 58 .flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img { 59 min-height: var(--slider-min-height, 600px); 74 60 } 75 61 … … 132 118 133 119 .flickity-page-dots li.is-selected:before { 134 animation: bulletLoader 8sforwards;120 animation: bulletLoader var(--slider-ani-speed, 3s) forwards; 135 121 } 136 122 … … 160 146 text-align: center; 161 147 } 148 149 @media (max-width: 768px) { 150 .flickity-slide-content { 151 width: 100%; 152 top: 0px; 153 right: 0px; 154 transform: none; 155 padding: 40px 20px; 156 } 157 .flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img { 158 min-height: 400px; 159 } 160 } -
flexi-flick/trunk/build/style-index.css
r3148783 r3185975 15 15 16 16 .flickity-wrap img { 17 border-radius: 15px;18 17 width: 100%; 19 18 display: block; … … 25 24 26 25 .flickity-slide { 27 width: calc(85% - 60px); 28 margin-right: 10px; 29 border-radius: 5px; 30 max-width: 1200px; 31 display: block; 32 } 33 34 .flickity-slide:after { 35 content: ""; 36 background: rgba(0, 0, 0, 0.6); 37 display: block; 38 width: 50%; 39 height: 100%; 40 position: absolute; 41 z-index: -1; 26 width: 100%; 27 height: auto !important; 42 28 } 43 29 44 30 .flickity-slide-content { 45 /*position: absolute;46 top: 0px;47 width: 100%;48 padding-left: 50px;49 padding-right: 50px;*/50 31 position: absolute; 51 32 top: 50%; 52 left: 5 0%;53 transform: translate(-5 0%, -50%);33 left: 5%; 34 transform: translate(-5%, -50%); 54 35 color: white; /* Adjust text color to contrast with the image */ 55 padding: 10px; /* Optional: Add padding around the text */36 padding: 80px 40px; /* Optional: Add padding around the text */ 56 37 box-sizing: border-box; /* Ensures padding is included in the element's total width and height */ 57 38 width: 80%; /* Adjust to fit within the image */ 39 max-width: 800px; 58 40 } 59 41 … … 72 54 width: 12px !important; 73 55 border-radius: 8px !important; 56 } 57 58 .flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img { 59 min-height: var(--slider-min-height, 600px); 74 60 } 75 61 … … 132 118 133 119 .flickity-page-dots li.is-selected:before { 134 animation: bulletLoader 8sforwards;120 animation: bulletLoader var(--slider-ani-speed, 3s) forwards; 135 121 } 136 122 … … 161 147 } 162 148 149 @media (max-width: 768px) { 150 .flickity-slide-content { 151 width: 100%; 152 top: 0px; 153 left: 0px; 154 transform: none; 155 padding: 40px 20px; 156 } 157 .flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img { 158 min-height: 400px; 159 } 160 } 161 163 162 /*# sourceMappingURL=style-index.css.map*/ -
flexi-flick/trunk/build/style-index.css.map
r3148783 r3185975 1 {"version":3,"file":"./style-index.css","mappings":";;;AAAA;;;;;EAAA;AAMA;EACC;EACA;EACG;AACJ;;AACA;EACC;EACA;EACA; EACA;KAAA;EACA;EACG;AAEJ;;AAAA;EACE;EACA;EACA;EACA;EACA;AAGF;;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAGJ;;AADA;EACC;;;;uBAAA;EAKA;EACG;EACA;EACA;EACA;EACA;EACA;EACA;AAIJ;;AAFA;EACI;AAKJ;;AAHA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAMJ;;AAHA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAMJ;;AAJA;EACI;EACA;AAOJ;;AALA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;AAOJ;;AALA;EACI;EACA;EACA;EACA;EACA;AAQJ;;AANA;EACI;IACI;EASN;EANE;IACI;EAQN;AACF;AANA;EACI;EACA;EACA;EACA;EACA;EACA;AAQJ;;AALA;EACI;EACA;EACA;EACA;AAQJ;;AALA;EACI;AAQJ;;AANA;EACC;EACG;AASJ;;AAPA;EACC;AAUD;;AARA;EACI;EACA;AAWJ;;AATA;EACE;EACA;EACA;EACA;EACA;AAYF;;AATA;EACE;AAYF,C","sources":["webpack://flexiflick/./src/style.scss"],"sourcesContent":["/**\n * The following styles get applied both on the front of your site\n * and in the editor.\n *\n * Replace them with your own styles or remove the file completely.\n */\n.flickity-wrap {\n\tposition: relative;\n\twidth: 100%;\n max-width: 100% !important;\n}\n.flickity-wrap img {\n\tborder-radius: 15px;\n\twidth: 100%;\n\tdisplay: block;\n\tobject-fit: cover;\n\theight: auto;\n filter: brightness(0.7);\n}\n.flickity-slide {\n width: calc(85% - 60px);\n margin-right: 10px;\n border-radius: 5px;\n max-width: 1200px;\n display: block;\n \n}\n.flickity-slide:after {\n content: \"\";\n background: rgba(0,0,0,0.6);\n display: block;\n width: 50%;\n height: 100%;\n position: absolute;\n z-index: -1;\n}\n.flickity-slide-content {\n\t/*position: absolute;\n\ttop: 0px;\n\twidth: 100%;\n\tpadding-left: 50px;\n\tpadding-right: 50px;*/\n\tposition: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: white; /* Adjust text color to contrast with the image */\n padding: 10px; /* Optional: Add padding around the text */\n box-sizing: border-box; /* Ensures padding is included in the element's total width and height */\n width: 80%; /* Adjust to fit within the image */\n}\n.flickity-page-dots {\n bottom: 20px !important;\n}\n.flickity-page-dots li {\n background-color: #fff;\n margin: 0px 5px !important;\n height: 6px !important;\n opacity: 1;\n overflow: hidden;\n position: relative;\n transition: all .3s ease;\n width: 12px !important;\n border-radius: 8px !important;\n \n}\n.flickity-slide-content .wp-block-button a {\n font-size: 16px !important;\n padding: 9px 30px;\n background: transparent !important;\n color: #fff !important;\n text-decoration: none !important;\n border: 1px solid #fff;\n border-radius: 999px;\n}\n.flickity-slide-content .wp-block-button a:hover {\n background: transparent !important;\n color: #fff !important;\n}\n.flickity-slide-content .wp-block-button a:after {\n \n background-position: 100%;\n background-repeat: no-repeat;\n background-size: contain;\n content: \"\";\n display: inline-flex;\n transition: width .1s ease-out;\n width: 0;\n}\n.flickity-slide-content .wp-block-button a:hover:after {\n width: 17px;\n height: 17px;\n position: relative;\n top: 3px;\n left: 10px;\n}\n@keyframes bulletLoader {\n 0% {\n width: 0\n }\n\n to {\n width: 100%\n }\n}\n.flickity-page-dots li:before {\n background-color: #f6f6f6;\n content: \"\";\n height: 100%;\n left: 0;\n position: absolute;\n width: 0\n}\n\n.flickity-page-dots li.is-selected {\n position: relative;\n width: 56px !important;\n border-radius: 8px !important;\n height: 6px !important;\n}\n\n.flickity-page-dots li.is-selected:before {\n animation: bulletLoader 8s forwards\n}\n.flickity-wrap h2 {\n\tmargin-top: 0px !important;\n margin-bottom: 10px !important;\n}\n.flickity-wrap h2, .flickity-wrap p {\n\tcolor: #fff !important;\n}\n.flickity-page-dots .dot {\n opacity: 0.6 !important;\n background: #ccc !important;\n}\n.wp-block-flexiflick-slider-block {\n background: #ccc;\n color: #000 !important;\n text-align: center;\n padding: 30px;\n border: 1px dotted #000;\n}\n\n.wp-block-flexiflick-slider-block h3 {\n text-align: center;\n}\n"],"names":[],"sourceRoot":""}1 {"version":3,"file":"./style-index.css","mappings":";;;AAAA;;;;;EAAA;AAMA;EACC;EACA;EACG;AACJ;;AACA;EACC;EACA;EACA;KAAA;EACA;EACC;AAEF;;AAAA;EACE;EACA;AAGF;;AACA;EAEC;EACG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACJ;;AACA;EACI;AAEJ;;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAGJ;;AAAA;EACE;AAGF;;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAGJ;;AADA;EACI;EACA;AAIJ;;AAFA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;AAIJ;;AAFA;EACI;EACA;EACA;EACA;EACA;AAKJ;;AAHA;EACI;IACI;EAMN;EAHE;IACI;EAKN;AACF;AAHA;EACI;EACA;EACA;EACA;EACA;EACA;AAKJ;;AAFA;EACI;EACA;EACA;EACA;AAKJ;;AAFA;EACI;AAKJ;;AAHA;EACC;EACG;AAMJ;;AAJA;EACC;AAOD;;AALA;EACI;EACA;AAQJ;;AANA;EACE;EACA;EACA;EACA;EACA;AASF;;AANA;EACE;AASF;;AAPA;EACE;IACE;IACA;IACA;IACA;IACA;EAUF;EARA;IACE;EAUF;AACF,C","sources":["webpack://flexiflick/./src/style.scss"],"sourcesContent":["/**\n * The following styles get applied both on the front of your site\n * and in the editor.\n *\n * Replace them with your own styles or remove the file completely.\n */\n.flickity-wrap {\n\tposition: relative;\n\twidth: 100%;\n max-width: 100% !important;\n}\n.flickity-wrap img {\n\twidth: 100%;\n\tdisplay: block;\n\tobject-fit: cover;\n\theight: auto;\n filter: brightness(0.7);\n}\n.flickity-slide {\n width: 100%;\n height: auto !important;\n}\n\n\n.flickity-slide-content {\n\t\n\tposition: absolute;\n top: 50%;\n left: 5%;\n transform: translate(-5%, -50%);\n color: white; /* Adjust text color to contrast with the image */\n padding: 80px 40px; /* Optional: Add padding around the text */\n box-sizing: border-box; /* Ensures padding is included in the element's total width and height */\n width: 80%; /* Adjust to fit within the image */\n max-width: 800px;\n}\n.flickity-page-dots {\n bottom: 20px !important;\n}\n.flickity-page-dots li {\n background-color: #fff;\n margin: 0px 5px !important;\n height: 6px !important;\n opacity: 1;\n overflow: hidden;\n position: relative;\n transition: all .3s ease;\n width: 12px !important;\n border-radius: 8px !important;\n \n}\n.flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img {\n min-height: var(--slider-min-height, 600px);\n}\n\n.flickity-slide-content .wp-block-button a {\n font-size: 16px !important;\n padding: 9px 30px;\n background: transparent !important;\n color: #fff !important;\n text-decoration: none !important;\n border: 1px solid #fff;\n border-radius: 999px;\n}\n.flickity-slide-content .wp-block-button a:hover {\n background: transparent !important;\n color: #fff !important;\n}\n.flickity-slide-content .wp-block-button a:after {\n \n background-position: 100%;\n background-repeat: no-repeat;\n background-size: contain;\n content: \"\";\n display: inline-flex;\n transition: width .1s ease-out;\n width: 0;\n}\n.flickity-slide-content .wp-block-button a:hover:after {\n width: 17px;\n height: 17px;\n position: relative;\n top: 3px;\n left: 10px;\n}\n@keyframes bulletLoader {\n 0% {\n width: 0\n }\n\n to {\n width: 100%\n }\n}\n.flickity-page-dots li:before {\n background-color: #f6f6f6;\n content: \"\";\n height: 100%;\n left: 0;\n position: absolute;\n width: 0\n}\n\n.flickity-page-dots li.is-selected {\n position: relative;\n width: 56px !important;\n border-radius: 8px !important;\n height: 6px !important;\n}\n\n.flickity-page-dots li.is-selected:before {\n animation: bulletLoader var(--slider-ani-speed,3s) forwards\n}\n.flickity-wrap h2 {\n\tmargin-top: 0px !important;\n margin-bottom: 10px !important;\n}\n.flickity-wrap h2, .flickity-wrap p {\n\tcolor: #fff !important;\n}\n.flickity-page-dots .dot {\n opacity: 0.6 !important;\n background: #ccc !important;\n}\n.wp-block-flexiflick-slider-block {\n background: #ccc;\n color: #000 !important;\n text-align: center;\n padding: 30px;\n border: 1px dotted #000;\n}\n\n.wp-block-flexiflick-slider-block h3 {\n text-align: center;\n}\n@media (max-width: 768px) { \n .flickity-slide-content {\n width: 100%;\n top: 0px;\n left: 0px;\n transform: none;\n padding: 40px 20px;\n }\n .flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img {\n min-height: 400px;\n }\n}\n\n"],"names":[],"sourceRoot":""} -
flexi-flick/trunk/flexiflick.php
r3148783 r3185975 5 5 * Requires at least: 6.1 6 6 * Requires PHP: 7.0 7 * Version: 0.1. 17 * Version: 0.1.2 8 8 * Author: rashmiwp 9 9 * Author URI: https://profiles.wordpress.org/rashmiwp/ 10 10 * License: GPL-3.0-or-later 11 11 * License URI: https://www.gnu.org/licenses/gpl-3.0.html 12 * Text Domain: flexi flick12 * Text Domain: flexi-flick 13 13 * 14 14 * @package FlexiFlick … … 91 91 'default' => 0, // Default is 0 (no autoplay) 92 92 ), 93 'minHeight' => array( // New autoPlay setting 94 'type' => 'number', 95 'default' => 450, // Default is 0 (no autoplay) 96 ), 93 97 ), 94 98 )); … … 107 111 108 112 if ($slides->have_posts()) { 109 echo '<div class="flickity-wrap"><div data-flickity=\'{ 113 $animation_speed = (floor($attributes['autoPlay']/1000) + 2) ?? 0; 114 115 $min_height = $attributes['minHeight'] ?? '450'; // Example attribute value from block 116 echo '<div class="flickity-wrap" style="--slider-min-height: ' . esc_attr($min_height) . 'px; --slider-ani-speed: ' . esc_attr($animation_speed) . 's"><div data-flickity=\'{ 110 117 "draggable": ' . esc_attr($attributes['draggable'] ? 'true' : 'false') . ', 111 118 "freeScroll": ' . esc_attr($attributes['freeScroll'] ? 'true' : 'false') . ', … … 115 122 "prevNextButtons": ' . esc_attr($attributes['showArrows'] ? 'true' : 'false') . ' 116 123 }\'>'; 124 117 125 while ($slides->have_posts()) : $slides->the_post(); 118 echo '<div class="flickity-slide" >';126 echo '<div class="flickity-slide" >'; 119 127 if (has_post_thumbnail()) { 120 128 the_post_thumbnail('full'); -
flexi-flick/trunk/readme.txt
r3148783 r3185975 1 1 === Flexi Flick === 2 2 Contributors: rashmiwp 3 Tags: block 4 Tested up to: 6. 65 Stable tag: 0.1. 13 Tags: block, slider, hero banner, flickity, Gutenberg, customizable slider, image carousel, responsive slider, autoplay slider, WordPress block slider 4 Tested up to: 6.7 5 Stable tag: 0.1.2 6 6 License: GPL-3.0-or-later 7 7 License URI: https://www.gnu.org/licenses/gpl-3.0.html 8 8 9 9 10 Gutenberg block for flickity slider with custom post type option10 FlexiFlick Hero Slider - Customizable WordPress Slider Plugin 11 11 12 12 == Description == 13 13 14 FlexiFlick Slider is a highly customizable WordPress plugin designed to create stunning, interactive sliders with ease, powered by the renowned Flickity library. With its intuitive Gutenberg block, you can effortlessly control features like navigation arrows and pagination ( more to come ), giving you full flexibility to showcase your content in a dynamic, engaging way. Whether you're highlighting featured posts, images, or products, FlexiFlick Slider adds a sleek, professional touch to any WordPress site. 15 16 A big credit for this plugin goes to [SiteWired.com](https://www.sitewired.com), as it was initially developed for one of their projects. Later, We decided to enhance it further and contribute it to the WordPress community so others could benefit from its flexibility and features. 14 FlexiFlick Slider is a versatile and highly customizable WordPress plugin crafted for creating eye-catching hero banners and dynamic content sliders with minimal setup. Built on the robust [Flickity library](https://flickity.metafizzy.co/options), FlexiFlick Slider enables you to showcase your content—be it images, featured posts, or products—in a professional, sleek design. Easily configured through an intuitive Gutenberg block, it lets you control everything from autoplay, navigation arrows, and pagination to styles and animation speeds, making it perfect for high-impact hero banners or interactive product showcases. 17 15 18 16 Features: 19 17 20 Display posts from the custom post type flexiflick_slide. 21 Option to show or hide navigation arrows. 22 Option to show or hide pagination dots. 18 - Hero Banner Ready: Ideal for highlighting important content, featured posts, or product showcases. 19 20 - Advanced Customization Options: Control every aspect of your slider, including navigation, animation speed, autoplay, and pagination, with more features on the way. 21 22 - Seamless Gutenberg Integration: Effortlessly create sliders with a simple block-based interface. 23 24 - Responsive & Mobile-Friendly: Looks great on any device, from desktops to mobiles. 25 26 - Originally developed in partnership with [SiteWired.com](https://www.sitewired.com), FlexiFlick Slider is now available for the WordPress community, built to meet professional standards while staying user-friendly. 27 23 28 24 29 == Installation == … … 50 55 * Introduced an overlay design option for better visual aesthetics. 51 56 * Added new styles for navigation buttons. 57 = 0.1.2 = 58 * changes to make it compatiable with Wordpress latest version 6.7 59 * added new option to set minimum height for each slide 60 * issue fixing for mobile part 52 61 53 62 -
flexi-flick/trunk/src/editor.scss
r3148052 r3185975 18 18 min-height: 200px; /* Ensure the slide has a minimum height */ 19 19 } 20 -
flexi-flick/trunk/src/index.js
r3148783 r3185975 45 45 default: 0, 46 46 }, 47 minHeight: { 48 type: 'number', // Number input for autoPlay 49 default: 450, 50 }, 47 51 }, 48 52 edit({ attributes, setAttributes }) { … … 90 94 <ToggleControl 91 95 label={__('Show Arrows', 'flexiflick')} 92 help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}96 help={__('Enter the autoPlay speed in milliseconds. For example 1500 will advance cells every 1.5 seconds. Set to 0 for no autoPlay.', 'flexiflick')} 93 97 checked={attributes.showArrows} 94 98 onChange={(value) => setAttributes({ showArrows: value })} … … 132 136 type="number" 133 137 /> 138 <TextControl 139 label={__('Min Height (px)', 'flexiflick')} 140 help={__('Enter the minimum height in pixels for slider', 'flexiflick')} 141 value={attributes.minHeight} 142 onChange={(minHeight) => setAttributes({ minHeight: parseInt(minHeight) || 450 })} 143 type="number" 144 /> 134 145 </PanelBody> 135 146 </InspectorControls> -
flexi-flick/trunk/src/style.scss
r3148783 r3185975 11 11 } 12 12 .flickity-wrap img { 13 border-radius: 15px;14 13 width: 100%; 15 14 display: block; 16 15 object-fit: cover; 17 16 height: auto; 18 filter: brightness(0.7);17 filter: brightness(0.7); 19 18 } 20 19 .flickity-slide { 21 width: calc(85% - 60px); 22 margin-right: 10px; 23 border-radius: 5px; 24 max-width: 1200px; 25 display: block; 26 20 width: 100%; 21 height: auto !important; 27 22 } 28 .flickity-slide:after { 29 content: ""; 30 background: rgba(0,0,0,0.6); 31 display: block; 32 width: 50%; 33 height: 100%; 34 position: absolute; 35 z-index: -1; 36 } 23 24 37 25 .flickity-slide-content { 38 /*position: absolute; 39 top: 0px; 40 width: 100%; 41 padding-left: 50px; 42 padding-right: 50px;*/ 26 43 27 position: absolute; 44 28 top: 50%; 45 left: 5 0%;46 transform: translate(-5 0%, -50%);29 left: 5%; 30 transform: translate(-5%, -50%); 47 31 color: white; /* Adjust text color to contrast with the image */ 48 padding: 10px; /* Optional: Add padding around the text */32 padding: 80px 40px; /* Optional: Add padding around the text */ 49 33 box-sizing: border-box; /* Ensures padding is included in the element's total width and height */ 50 34 width: 80%; /* Adjust to fit within the image */ 35 max-width: 800px; 51 36 } 52 37 .flickity-page-dots { … … 65 50 66 51 } 52 .flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img { 53 min-height: var(--slider-min-height, 600px); 54 } 55 67 56 .flickity-slide-content .wp-block-button a { 68 57 font-size: 16px !important; … … 121 110 122 111 .flickity-page-dots li.is-selected:before { 123 animation: bulletLoader 8sforwards112 animation: bulletLoader var(--slider-ani-speed,3s) forwards 124 113 } 125 114 .flickity-wrap h2 { … … 145 134 text-align: center; 146 135 } 136 @media (max-width: 768px) { 137 .flickity-slide-content { 138 width: 100%; 139 top: 0px; 140 left: 0px; 141 transform: none; 142 padding: 40px 20px; 143 } 144 .flickity-wrap .flickity-viewport, .flickity-slide, .flickity-slide img { 145 min-height: 400px; 146 } 147 } 148
Note: See TracChangeset
for help on using the changeset viewer.