~+t7i&yeZBQJ8{*}*Uu+9JK?n;*b=tb
zVtzkE>a*_lUi9NW_%he;al-ksG#fH2V3#_Ery=pgUz&(a!N|z0P^>iCq|^e`Cud#W
z_w1aKXB7)fasUwDfarkQuS<^&Kt>q%yNJa`YuCxe!1v21L(sc!^gWfRJFk332=pbD
zo9b^&4Tby3I|Dzyl|uj^h)zh^Hl7vI06YWb7s1OAvC%SU$g2;~vP)WV>Qk(s=2ljb
zf43hz4t%^%bWt^(7Cb#Fd1MEJ4BRkuk5di+r>J)K1CW7KbT5>{4L
z>!c2Rs6axRNK`;Xp@g?k)(0Iu3jM5#ZF(6*06YQ`BU7P+p|~UY~y&0uWx5{x1E<83+8=f%|}el{%P`Uo1qndkh6;XgWg?
zAVQJ*VuBcyy)#x=gaC_v$o^|e(9Q1tku}2s4SDUm_X%1~!5gw3C1OONujE>8IF|ei
z*)MFe6!>=O0V{hC3m-t_n*8R7rTNM_^e5;Cu8F@ED2RNPp9bFY1KBo}pWgxr^b-l1
zrS2L}m_7ZKJ^_$cw1N*
zqyox<@`uJU|_>uhSqtWy3
z7Z}xTlAaW6XT=mry_>{j5+}j{L$=my%pI1_$&0O^f9i=h5#ne
z#|#OGiu#`%!-5;cD-W6dE#03yDYaT1G&
zRoO5PqIN|%5Mu&(gq?j<96fq(5xWk9K5M1VyZ~O8-AG}?ejNHi=Zws@9z@wxjwgoV
zPqEZvMsQ2Ja|&@JsA26DBt$SYW@8(L(r0MKDB*wfC-#Dei2SnFUh
zqQ(J9{^1cdh#GAQP{GLmZy@<5pWtsW4}S6FA0LSSe?j#A8>;tzN96wEKY_phI}!lg
z?SC85zY<6=BlrtO{=24suIu0S_TNeL7bFeFA^#?Vf352u8u-79qW%{q``<+HZ({i8
zn*KY9{!I-3KbXtEiQ%7W`5#pCm*BsV=)cht{<8X?*exRh|APSjCzAi-5B_xU>Yp6uIds@>!C^HV=vq7t+U)BTl?7a4
z0`7doN<4fN0b|zSNd!58#Kc5ij&TW@?3diBVAegf=4Si{_FOU~u!FeJ^av3!p=Dfu
z3`ZxH)A)1~7|#oln1lvc^bsIQXOx@u8P2HXFoU&)7ty^YOV-@2FeHM=->=DjaWN?q
z$fkrEEl6UAiLs4H6c!d5Dk8BM@w%+^noz~PB}3(k(Z>Q&?2gOX6KR@EDoenRsL`##
z8{VE!Q@o+z@0Jp%#5j4FAWUi6xi@E8w^qrNhgSEPTRjl0ou-?SKS4yefB?|Ja@@T7
zdhWTPJXp4MSIV|1%)rmhE$U!TQ>b7Ytfb6x?eZ!z7@u!-D;MB3w5a2%lSB54F~OK7
zfgUYPOz9igDwK`7M~@1?%O#v%E@w)4QgZzJ3~?#eK5JQ0S)^mrQ3oN;J&-dIjI3S<
zsbGArb0Hw}#4?f>od}iS<9b7FW^OI{t~od^xo0ozNf{uW(L-;WgiR)+h*$Fh6Af2^
z`iW9hI=X*t*+k_l*rOSfmQdB0bK^JgR#`^->JLry>A|-U$COtrIsAjK(XDx@zxMq}
z;G}qv2oia_SJ|54iXeiGXh^P3Hviiax$4jCYp~X?-=-=q;+S1u!7po{9P}(vM2!sJ
zAe3g-OX((rP>=RC{z@F)~jy`
z+lzboYhY71V1tk{zrLc{MGV;({h{*=P40=5xp~0>cWFt9iQ*F_S1W64SpDVMnIS8y2?37ZcqkkJ792^|8wsw}5mGjL30SHB@d_E0q_@Bb
zWI?Ywm)a?3ez(IK^yIR4&DFodxQ}^{n??+ImJQR^7h2bNLjsSVbG{gSCuTEISzZqt
zH5@=k30*sumh4@{zvWx78vMdox8nS8cfB7A3`3zh4nS`CkkU;Sdxp_@KB7oBB^A*@H`EzbMc(-*q^eFTUdBXemp(TSba0^S>bh<2jl%D@t!VLq`Ze7UxsO7
z@uZ`=HWpzg^ktHZc8lI!fTFhL;_NIfA-8SKeSR;I(@QT(|Ela6R_$i@$^)l`db@h~
ze(hHG3XAvWj)2zo<7i7k#*p-RrT&A(rm7;y32NM<-sMR?@)8P)v28_7K{|!gB;g8W
z2s&|953jz@xtg_4va?Eo!sa{~Fz~Ss>Uxl2Y)}MXh+~rx~Rn)
zD4pHgnGQB~0j_#i=cnc_7@7N(_2yR$_mByWJt9oOS_70J1K(@t0%>-jGN80;Hk=A=
z@>znrs5dyfxb#0yy325Xt)a^)hVF_HI>?b{wg7K4Efh$fpRGcTk%Ow_j}O{d%o(-t
z-tu|IWv!ihek&;$B|u4GH3=3t9b&H&P6%)YHVr}Cf8E04%}kp%Z1FGXJfTD=d2#u5
zluQ;4S-2N^7m54f4h_-A<qV4pp+K_E`7jYKH^801HiYbg_7Y?9=R(hfUJHhx^;I
z4d0V~8W^*~9tSNlkk?gSHg4JESygjUvp-iYS#0()Yo)Hl`unZb`>j?VH@l^;;fOty
zr@UmwDzOPrf72IHlLwU*!YA9+^!%=9Vgkq9ta*gi(_sZVcE#n*B|e`(Y$o1$ptI7z
z;YkdjMCYs)nZj-!HUBWFqNrt_zZdo?Q6)cog`4BSs0-F6c#8q!u1Ritb_8Jy`R{M|nKTvDDFlkMBPN&5Ryp{ukSE_Uk1(I0e!V0%G^
z(xb#@b7#eK*rFK`U&=Rj<{+-^ahbV{TjLfZ%jaTl<9TqAg21uZg%Uuuhi2#ASqKBc
zC2)=Tz$(}RS5b#c(`D+UUq>3?rz8B5_x>i)f?v9^5fZ)yy}%tDmm
z3@h`iwVa^lJv>@Y^DZwFraV|rLT+KK+N$I)ce7xxM#GLM5kbo_r>|Fz=bUc2I3yj$
z+fKkameyfOzZ+0H=GIW8p4`jcbFSC1ZG=u@=r%f1$)*9c@8(^g+&-82X|`4B<3C@c
zB&9pVs;a9|W$E}C{sC^f0@Ju24ehVvGzS<}(zIE+!SeeT{eW%o)}nCZPH77>Z2aA`
z(IW!=n^rm!q5^|c40U5>ojN%ZzdMHo=yFBFI_lm>20+P%?{v501v62t9!9WB3Uvz?
ze1t*pSMFn~O^jE^tGOxCc({GrWb2<*H};yO#+Nxs2ORqS$^oIXmwVmCnJtg}e5Zy6
zvlJO$*EVINdpoU#@b6%l)nV|w_ym2~Nn@OnK4>t(^uzo4kh_a}>{y;J@Kl}BZbPoi_zt~rd!I}MpA`n8nM6k
z$@*2pypJ<)A3fJD3eNXswVLj;DLspuN$Pd4hqH9H0=NBdK4a5w-0W4_c>%E&$$~Zco8mYJ-%C{H<
zV~v1h{Nk9&=v>m42fy;i1!Bdv;({~b<^%u4NtyWDZ*IO~d?rkmFjyj|^|Yq-uJB18
z1%+?n$SfRGXIb?uf?>0&np!_Ht}csJOG(oqd=Nh4fYCzPt+sMo%fW$0I$6HZDydDE
zYAREx@kPMp78i^jkDRs>`=N}b&sks4PlWfY`-n{(nkYW5T&}oj-%cAgROugjI;fm9
zJ-HL|Sh)0~*fUsS0PiX~-s}_%zE%`4DziR0kGq^@$*Fy2o+g;pD{xgQTR>8DrD{XEBt
zU=n3Evz0V?9TqVdOLq--oBcFp(W88O3?64=l4a0170Z=xOo4Gc#!`1D2xM8SKg%6p
z!e`lPqr4L_Qe3vjR_ox+hsrOsW6}ZyB*P^$eMLtP=En_-{ZIcy;nqtPR_RYW+hD*N
zkDD|WYP?wc1!4|WedK007sXHT#1t`N{q7!S+D^)cF$9XP?~N;DUF&M7+KMjT`Toh5
zEL~MH&+@6O74y%miEq$sc~~Fi-6FE~%y?LLLHSwvs(xYE0NH;C?YELwES}<&ENt(k
z(gC01&xz-@O$S``V#=MrN-_N2dxwQDcN2c+2c>jlmEXtOf&yJ@5q?~?<7#f!*l#MY
z8va2ibN(R$wQEQGH#Rxx<8E8?Wihd0D~XfW=CO}pRXxmoYPsjPFy?Ky<+CR0
zC>=N_eQqzbwmi1gP+psmuq*iHreA*@4O`*&PHew5m}fXh9A*=oWi%JQZt}ZbC-(DH
zmWY1L50Nf6&%$MpdfBuWzNON$c}vB08J0%Bsc(1ql3Ouj<>s{F{%pc=
z8bydomKm;mC-fNlXLidjA>Ter_k8Hc_iT*R?~xB?3*MPFeoeNc;t_2@#WsCWril9&+|upx7rs9Dy+_)cx~?Up0lx2iNX2jH&YDsX>_t0Mp4lO
zJtY15;Yiz9v>-Inaj&eN+U=>2pmu;o3}uhxS^fg2J(eW#CsY^v=@i2c6r>05SpQGHY|lH1rgcN1jInZqBgFT=(v6bDz?!3ztPCWj~^
zQ8`RpDg=t#?eOca-%BqluP`?qGzy`}y$P$6Jjx&;4TFWXt#tY16iYd)6+9f|hXgNM
z-)5s^c>YY5S$Kvx
zBcXxpi_f9*xaxII@5Q2i@JR6@OSS50fmeFo>%qGDg&teH9$8L5?J%*^4bsbN3A$}K
z!>3!CHY?g%73zdflR0%n{H{G2jfq!xcXk{E_{M}3?-#oi%-x(&lf8wRCr*prBg!QJ
zmDb;@Iky{a`4^9J1HPgpYkSPr`oL2U!7#V%{h6TGg(eNF!ToU7z|b#+uzGy#{?P*r
z$&FU|ro0Iq#tD%n$4#gDhpQ~#vz3)mB?q1$$+}~VQ+r?BO+2#eV5uIm>z<@GztcxX
z9uw%S{UC#e)QB#JUh}&N=iIUHMD7RJjrV_Vz%J!;_T{MsqkF^Vs=8Ahx6b%D#hfwa
zkN%%B&OM$9^^fB&m0Rvgxh&V*Ww*9_rK@${Pq3gd7kh4^A?fvryaqg+<63fqFJ?(
z49p|`drRT$DlZAycVlD^2W+42A377;gU^j{4I@=eP*f8^q;u4zjRq4e*S({eo2!IV
zr#ANnpkX=iWI8Vt08qK$p?BAL^$#?`$!ii)Kg)PrNq)g1%wyNYDs~A9
zM?(I9mDba~;07o)@ioAN+0r3%#8>=_z=)ru3CigLOv!3*ici8qj%CYw*hs>5r_lLO
z5s82*#)biBGWC+(VMyyH}bO#S`KG0`E+Wi@c}kg!xWXrt_2fJu9?7~uBJ
z1zKu+O~icwba}M4%j`n}$Me8Gl$6j2?LOe9*I$c3Y$uz)X>}$aB|+`F)&_oNM*NyL
z>4@CqPPP|~x>78v*!T{>dL%WaPAqH6C!XMw*lW@90N5zxfXx#+zBI5`EJ(NSt|(5ubVv-LV68@brb=M$Y$c
z9DN}U4~(ch-il4q;3nO?Ky8>k*TNvzd@9@=ykXoF^Kz(QIkz2!li04LoeeQZmjh12=6Y2NW_VTQ#<%OrlGzF(%`Csv3*Y*W4PR=&Vd!(1
z18qs}t`=>ZT&;dw8A4GuL>_5fen!rYPaQCIX1(Qmq>hxzJHc>Jn%0!q+bC-ji7zn2
z*8a}nx_;Qm(Zbh|ExBlxbQ5I?k+9A!%z7JD?znX*=vpMy9v3w>DZjmC70=W0J0
zpAv90sGOdFRQr-uEwG)?KY(L+rBrLB#$7DbCh>jh6sLAD;`gTAe(bI5(_cN84TFr-
zr-`=il_4&%;JP+7xa$|?tLV>>31O_or<1w+LoJA=`jtsl%z4DqTxIW&k+Sr?O##in
zyNR`JJPAi_)w8_!-qorMkiEK71ek>ZkOo8*uLAbH!0bH
zW|U-4ZbB#}yDo#%z-llMNO`qq)Y^VE)RSW`PR_Iq|F)tGR&AyWLl0IFUoE8w788PX
zuU^=Dl@!wb*4GLJ=T}qD*Dx`x%!AEg&WfMb0CRipD)Nbrxp3AD-$yM7ixiF+p`V0sr~(rT@qg3X*8j)9sQY5cDA`>$OoqCoRgIQ+g$b)NyiRB+1z6BiVvOK
zKkGMA|5F+U_KLR|Vy>OGvaPX?vF^>Vd4sBI{W)+Eu{*aUu{!CrrUV}+9!+4b=qd0Z9Gt4^@hgdq!$(NLbhi#U}g3tJ?wiWD5L>%
z>=f)v19p3(tpE_W*lER`msj*1GuX$!W1stAvcukbx)7n_~
z(0L8h#uyDT_N=GI98+s6}y&uEJ2k4QX*(=DYpk6gPyQM|so4
z)KuFDb)vDq3BK-V@V4$wSB*(K8L`mEBImL|Ynq?d{Kuejl>>(%A8`X>M#^XnQ|^l8Ynm
z+;?_S&C-X|r6YsA6_X9(qiA3aI{dzQFjkVM?4;IK2{mW`PAhP-=_lZcRUgf~#%Jn-%zd(aGl
z=cEGuMG$%9MB;H=v@gxQ;Q)pLa1l4ldua^(R^K-SkZ{fash#3n{_Lc6ua1LEC&4!&
zSWJ@lnKC*ds{lrJ1y`xk>Mim>71vYzKcSQ}>nlX`J=FqL2wH4ZGfy58A%xEm^dV8=X(Gx>
zvZ~-Z5B0@Mfg=qe^KKq=MWuWJ+!=n+Qzv$yDq{kwc|{*KfopYs8iU52CsuI6Z8oDyv<010I#p5}`ZhK2XK)=3AD*RES#l)42;6G&r
zLgcmg{*X~QJRvQPg80Al)KLMC>hMoTA}2ifz%zPTT`kX5c{JQVtOwtJ>wj^Ce~tdx
n$Nzue`>!qkI!AW$K;ED4dGtwJ|Fb*Qe7tqp)&=s~+W-FFhv#}>
literal 0
HcmV?d00001
diff --git a/demo/img/iphonex-example-camera.png b/demo/img/iphonex-example-camera.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa6e40f20f9ed8827f2170d75e57e08bcacffc7e
GIT binary patch
literal 2218
zcmaJ@dpJ~iA0NiG_holU)=H)^p*S;h&fF)H+nC(Oy$vtrICC&*F6P20t;NRLc2i5Q
zBDXxLcCk`PNjz)S#>*1hE=r{diRf>o##2v{C?l_{d~Tk@9lX`ZcxB>
zlQkc$!QpTwKHmHg?7td&tc(n_CuaKw?M3Akt_qdKsZwACigOpqVo`#R1dc~TP*{|j
zbPILC;qaN_uy9ql(4ULQBxG3YL)J*-7#fFjan;CSBoS2+V$pc9lt+Bp)IubPMLgn8
zhL9?hd!h+q?|lk1bYDOivM&+gh={J+2re2fMj$~|FhL{PD^+qeJmNAh7dvas6e3~S
zMU}`Su80a31`#}E3Y5SgGXVsoGYBjW8D!Gv9F8*qqJnG+l}!O@0LbLhsayymy!jEa
zXbMprH-s;E6AQcXhzTl{oJ*mkq@<8jXk?ipo&s_>910bpKoEd=0LoOU3f2HprQIq6
zA5|g>v0NpVNeNm;I98@s@ranxl@ug$q3|uSRQaY*Sji|FSWW@SREk8R&1>0PsR}{=
zFXNrw%CJ;9N(n)gGPMH1`VnWh3dU;p_kpyIm>O=NLX0&9-piLEY6&V;`S5u}>d?FFwfTd#+-Aq)HVmMbOo_Vl3_omMQpKEZ0+k!YY{}OeWjAIsrimGL=l3Ad?e3
zJ+&R@5FCXtB9>~6o3%|^$(fHT#L1{gppZ!j%T?xz-=TsL$Al0BWicgaA5A!~tL$
z1OhA;N{{8RAQ1>c#5Z`+U#hn{y6M!6Z_&gY%a`S~X$QsXe}33+(cCu}~?tO$uynbbbhahQsMy_u;#TX$Gf@
zf65!;uf5qaMmpRa!1Ni2z8b{WcgkqQ?btygHD)w^Z?lm^UjHY)Q9jbGlT>k+Eq|!{
zIo?QbG)3RS@Z+-
z=$&jiU|hxYniKuc%%lysPU
z|9MT(W6hy)vnx>>teiZ{_Y@F&pZN9{tHb8zAEfSzx;o=DVE2Q#IGvQEbbO|(p51!&
zK-v|1%kYTvUA~0d~0V^Z~FMfN6}5n7vcj;Bxl;exJrZVw2>>o
zZ$`Zm|R**gd|(Dl%gth-YDT0g%dY|D8g6T#e$NbihhRF_%8{84%3
zx<1YX*LLJ`z8&F(o2QW~UyTpX;$|)Mb(nsyYpNevvyKmoPk#FuSrql+KGDgQPO&$j=gAY`ANTT=b|gFl+_PTq6?
zLQGw%Cth?U=;6245=?EfBaH?Er%o$N-1qZrZ#NZwGQ^`e-PrX-)~hz5()`JiO~Rzh
z#e&~m{hQJbdStd7CH=99zdrU?10I5`t1B!t4mZ`;++qm(=IdeWvS)0%BdydGIG|Ux
z?X1V=xt8!X@)>Y38;)@u?Jga=+c1<-F(v=+Vo~z$JR&S0@*9Q$cRSO2<-(Tk_VP8af}En0VGn{_sP%tg`b}
z5Z69(*8k6jZ+siv(;DJz63=fNFANjTp6C1{*Sfm;y&G`J8fS}#j4>NVukYnx*}+pxWoCteIcP$t^*$_69e(B}+FLv=hsY2S+sx
z8qRO32Og0M#@|m@%;^sli)=eMI%{9g7kg*U|1-LjG&XfWlzR5UzfNat5iOpxDw|CA
po3jE_)bMcZjBRg0LE4f-D{h^QvF}i%C{O$K;Num*ul0z@{2u|jh)w_i
literal 0
HcmV?d00001
diff --git a/demo/onepage.html b/demo/onepage.html
new file mode 100644
index 0000000..3a07171
--- /dev/null
+++ b/demo/onepage.html
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+ mmenu.js demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is a demo
+ Click the menu icon to open the menu.
+ Some of the links in the menu link to a section on this page.
+
+
+ Widescreen extension
+ On wider screens, the menu will always be opened.
+ Open the menu.
+
+
+ Drag add-on
+ You can also drag the page to the right to open the menu.
+ Open the menu.
+
+
+ Fixed elements
+ Notice how the fixed header and footer slide out along with the page.
+ Open the menu.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dist/_modules/dom.js b/dist/_modules/dom.js
new file mode 100644
index 0000000..6073f28
--- /dev/null
+++ b/dist/_modules/dom.js
@@ -0,0 +1,132 @@
+/**
+ * Create an element with classname.
+ *
+ * @param {string} selector The nodeName and classnames for the element to create.
+ * @return {HTMLElement} The created element.
+ */
+export function create(selector) {
+ var args = selector.split('.');
+ var elem = document.createElement(args.shift());
+ // IE11:
+ args.forEach(function (classname) {
+ elem.classList.add(classname);
+ });
+ // Better browsers:
+ // elem.classList.add(...args);
+ return elem;
+}
+/**
+ * Find all elements matching the selector.
+ * Basically the same as element.querySelectorAll() but it returns an actuall array.
+ *
+ * @param {HTMLElement} element Element to search in.
+ * @param {string} filter The filter to match.
+ * @return {array} Array of elements that match the filter.
+ */
+export function find(element, filter) {
+ return Array.prototype.slice.call(element.querySelectorAll(filter));
+}
+/**
+ * Find all child elements matching the (optional) selector.
+ *
+ * @param {HTMLElement} element Element to search in.
+ * @param {string} filter The filter to match.
+ * @return {array} Array of child elements that match the filter.
+ */
+export function children(element, filter) {
+ var children = Array.prototype.slice.call(element.children);
+ return filter ? children.filter(function (child) { return child.matches(filter); }) : children;
+}
+/**
+ * Find text excluding text from within child elements.
+ * @param {HTMLElement} element Element to search in.
+ * @return {string} The text.
+ */
+export function text(element) {
+ return Array.prototype.slice
+ .call(element.childNodes)
+ .filter(function (child) { return child.nodeType == 3; })
+ .map(function (child) { return child.textContent; })
+ .join(' ');
+}
+/**
+ * Find all preceding elements matching the selector.
+ *
+ * @param {HTMLElement} element Element to start searching from.
+ * @param {string} filter The filter to match.
+ * @return {array} Array of preceding elements that match the selector.
+ */
+export function parents(element, filter) {
+ /** Array of preceding elements that match the selector. */
+ var parents = [];
+ /** Array of preceding elements that match the selector. */
+ var parent = element.parentElement;
+ while (parent) {
+ parents.push(parent);
+ parent = parent.parentElement;
+ }
+ return filter ? parents.filter(function (parent) { return parent.matches(filter); }) : parents;
+}
+/**
+ * Find all previous siblings matching the selecotr.
+ *
+ * @param {HTMLElement} element Element to start searching from.
+ * @param {string} filter The filter to match.
+ * @return {array} Array of previous siblings that match the selector.
+ */
+export function prevAll(element, filter) {
+ /** Array of previous siblings that match the selector. */
+ var previous = [];
+ /** Current element in the loop */
+ var current = element.previousElementSibling;
+ while (current) {
+ if (!filter || current.matches(filter)) {
+ previous.push(current);
+ }
+ current = current.previousElementSibling;
+ }
+ return previous;
+}
+/**
+ * Get an element offset relative to the document.
+ *
+ * @param {HTMLElement} element Element to start measuring from.
+ * @param {string} [direction=top] Offset top or left.
+ * @return {number} The element offset relative to the document.
+ */
+export function offset(element, direction) {
+ return (element.getBoundingClientRect()[direction] +
+ document.body[direction === 'left' ? 'scrollLeft' : 'scrollTop']);
+}
+/**
+ * Filter out non-listitem listitems.
+ * @param {array} listitems Elements to filter.
+ * @return {array} The filtered set of listitems.
+ */
+export function filterLI(listitems) {
+ return listitems.filter(function (listitem) { return !listitem.matches('.mm-hidden'); });
+}
+/**
+ * Find anchors in listitems (excluding anchor that open a sub-panel).
+ * @param {array} listitems Elements to filter.
+ * @return {array} The found set of anchors.
+ */
+export function filterLIA(listitems) {
+ var anchors = [];
+ filterLI(listitems).forEach(function (listitem) {
+ anchors.push.apply(anchors, children(listitem, 'a.mm-listitem__text'));
+ });
+ return anchors.filter(function (anchor) { return !anchor.matches('.mm-btn_next'); });
+}
+/**
+ * Refactor a classname on multiple elements.
+ * @param {HTMLElement} element Element to refactor.
+ * @param {string} oldClass Classname to remove.
+ * @param {string} newClass Classname to add.
+ */
+export function reClass(element, oldClass, newClass) {
+ if (element.matches('.' + oldClass)) {
+ element.classList.remove(oldClass);
+ element.classList.add(newClass);
+ }
+}
diff --git a/dist/_modules/dragevents/_defaults.js b/dist/_modules/dragevents/_defaults.js
new file mode 100644
index 0000000..2a6a8f1
--- /dev/null
+++ b/dist/_modules/dragevents/_defaults.js
@@ -0,0 +1,12 @@
+/** How far from the sides the gesture can start. */
+export var area = {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0
+};
+/** Tresholds for gestures. */
+export var treshold = {
+ start: 15,
+ swipe: 15
+};
diff --git a/dist/_modules/dragevents/_helpers.js b/dist/_modules/dragevents/_helpers.js
new file mode 100644
index 0000000..7405cf5
--- /dev/null
+++ b/dist/_modules/dragevents/_helpers.js
@@ -0,0 +1,15 @@
+/**
+ * Calculate a distance from a percentage.
+ * @param {string|number} position The percentage (e.g. "75%").
+ * @param {number} size The available width or height in pixels.
+ * @return {number} The calculated distance.
+ */
+export var percentage2number = function (position, size) {
+ if (typeof position == 'string') {
+ if (position.slice(-1) == '%') {
+ position = parseInt(position.slice(0, -1), 10);
+ position = size * (position / 100);
+ }
+ }
+ return position;
+};
diff --git a/dist/_modules/dragevents/_settings.js b/dist/_modules/dragevents/_settings.js
new file mode 100644
index 0000000..6468c9a
--- /dev/null
+++ b/dist/_modules/dragevents/_settings.js
@@ -0,0 +1,11 @@
+/** Names of the possible directions. */
+export var directionNames = {
+ x: ['Right', 'Left'],
+ y: ['Down', 'Up']
+};
+/** States for the gesture. */
+export var state = {
+ inactive: 0,
+ watching: 1,
+ dragging: 2
+};
diff --git a/dist/_modules/dragevents/_support.js b/dist/_modules/dragevents/_support.js
new file mode 100644
index 0000000..5aaa886
--- /dev/null
+++ b/dist/_modules/dragevents/_support.js
@@ -0,0 +1,4 @@
+/** Whether or not touch gestures are supported by the browser. */
+export var touch = 'ontouchstart' in window ||
+ (navigator.msMaxTouchPoints ? true : false) ||
+ false;
diff --git a/dist/_modules/dragevents/index.js b/dist/_modules/dragevents/index.js
new file mode 100644
index 0000000..1f1146e
--- /dev/null
+++ b/dist/_modules/dragevents/index.js
@@ -0,0 +1,208 @@
+import * as support from './_support';
+import * as options from './_defaults';
+import * as settings from './_settings';
+import { percentage2number } from './_helpers';
+import { extend } from '../helpers';
+var DragEvents = /** @class */ (function () {
+ /**
+ * Create the gestures.
+ * @param {HTMLElement} surface The surface for the gesture.
+ * @param {object} area Restriction where on the surface the gesture can be started.
+ * @param {object} treshold Treshold for the gestures.
+ */
+ function DragEvents(surface, area, treshold) {
+ this.surface = surface;
+ this.area = extend(area, options.area);
+ this.treshold = extend(treshold, options.treshold);
+ // Set the mouse/touch events.
+ if (!this.surface['mmHasDragEvents']) {
+ this.surface.addEventListener(support.touch ? 'touchstart' : 'mousedown', this.start.bind(this));
+ this.surface.addEventListener(support.touch ? 'touchend' : 'mouseup', this.stop.bind(this));
+ this.surface.addEventListener(support.touch ? 'touchleave' : 'mouseleave', this.stop.bind(this));
+ this.surface.addEventListener(support.touch ? 'touchmove' : 'mousemove', this.move.bind(this));
+ }
+ this.surface['mmHasDragEvents'] = true;
+ }
+ /**
+ * Starting the touch gesture.
+ * @param {Event} event The touch event.
+ */
+ DragEvents.prototype.start = function (event) {
+ this.currentPosition = {
+ x: event.touches ? event.touches[0].pageX : event.pageX || 0,
+ y: event.touches ? event.touches[0].pageY : event.pageY || 0
+ };
+ /** The widht of the surface. */
+ var width = this.surface.clientWidth;
+ /** The height of the surface. */
+ var height = this.surface.clientHeight;
+ // Check if the gesture started below the area.top.
+ var top = percentage2number(this.area.top, height);
+ if (typeof top == 'number') {
+ if (this.currentPosition.y < top) {
+ return;
+ }
+ }
+ // Check if the gesture started before the area.right.
+ var right = percentage2number(this.area.right, width);
+ if (typeof right == 'number') {
+ right = width - right;
+ if (this.currentPosition.x > right) {
+ return;
+ }
+ }
+ // Check if the gesture started above the area.bottom.
+ var bottom = percentage2number(this.area.bottom, height);
+ if (typeof bottom == 'number') {
+ bottom = height - bottom;
+ if (this.currentPosition.y > bottom) {
+ return;
+ }
+ }
+ // Check if the gesture started after the area.left.
+ var left = percentage2number(this.area.left, width);
+ if (typeof left == 'number') {
+ if (this.currentPosition.x < left) {
+ return;
+ }
+ }
+ // Store the start x- and y-position.
+ this.startPosition = {
+ x: this.currentPosition.x,
+ y: this.currentPosition.y
+ };
+ // Set the state of the gesture to "watching".
+ this.state = settings.state.watching;
+ };
+ /**
+ * Stopping the touch gesture.
+ * @param {Event} event The touch event.
+ */
+ DragEvents.prototype.stop = function (event) {
+ // Dispatch the "dragEnd" events.
+ if (this.state == settings.state.dragging) {
+ /** The direction. */
+ var dragDirection = this._dragDirection();
+ /** The event information. */
+ var detail = this._eventDetail(dragDirection);
+ this._dispatchEvents('drag*End', detail);
+ // Dispatch the "swipe" events.
+ if (Math.abs(this.movement[this.axis]) > this.treshold.swipe) {
+ /** The direction. */
+ var swipeDirection = this._swipeDirection();
+ detail.direction = swipeDirection;
+ this._dispatchEvents('swipe*', detail);
+ }
+ }
+ // Set the state of the gesture to "inactive".
+ this.state = settings.state.inactive;
+ };
+ /**
+ * Doing the touch gesture.
+ * @param {Event} event The touch event.
+ */
+ DragEvents.prototype.move = function (event) {
+ switch (this.state) {
+ case settings.state.watching:
+ case settings.state.dragging:
+ var position = {
+ x: event.changedTouches
+ ? event.touches[0].pageX
+ : event.pageX || 0,
+ y: event.changedTouches
+ ? event.touches[0].pageY
+ : event.pageY || 0
+ };
+ this.movement = {
+ x: position.x - this.currentPosition.x,
+ y: position.y - this.currentPosition.y
+ };
+ this.distance = {
+ x: position.x - this.startPosition.x,
+ y: position.y - this.startPosition.y
+ };
+ this.currentPosition = {
+ x: position.x,
+ y: position.y
+ };
+ this.axis =
+ Math.abs(this.distance.x) > Math.abs(this.distance.y)
+ ? 'x'
+ : 'y';
+ /** The direction. */
+ var dragDirection = this._dragDirection();
+ /** The event information. */
+ var detail = this._eventDetail(dragDirection);
+ // Watching for the gesture to go past the treshold.
+ if (this.state == settings.state.watching) {
+ if (Math.abs(this.distance[this.axis]) > this.treshold.start) {
+ this._dispatchEvents('drag*Start', detail);
+ // Set the state of the gesture to "inactive".
+ this.state = settings.state.dragging;
+ }
+ }
+ // Dispatch the "drag" events.
+ if (this.state == settings.state.dragging) {
+ this._dispatchEvents('drag*Move', detail);
+ }
+ break;
+ }
+ };
+ /**
+ * Get the event details.
+ * @param {string} direction Direction for the event (up, right, down, left).
+ * @return {object} The event details.
+ */
+ DragEvents.prototype._eventDetail = function (direction) {
+ var distX = this.distance.x;
+ var distY = this.distance.y;
+ if (this.axis == 'x') {
+ distX -= distX > 0 ? this.treshold.start : 0 - this.treshold.start;
+ }
+ if (this.axis == 'y') {
+ distY -= distY > 0 ? this.treshold.start : 0 - this.treshold.start;
+ }
+ return {
+ axis: this.axis,
+ direction: direction,
+ movementX: this.movement.x,
+ movementY: this.movement.y,
+ distanceX: distX,
+ distanceY: distY
+ };
+ };
+ /**
+ * Dispatch the events
+ * @param {string} eventName The name for the events to dispatch.
+ * @param {object} detail The event details.
+ */
+ DragEvents.prototype._dispatchEvents = function (eventName, detail) {
+ /** General event, e.g. "drag" */
+ var event = new CustomEvent(eventName.replace('*', ''), { detail: detail });
+ this.surface.dispatchEvent(event);
+ /** Axis event, e.g. "dragX" */
+ var axis = new CustomEvent(eventName.replace('*', this.axis.toUpperCase()), { detail: detail });
+ this.surface.dispatchEvent(axis);
+ /** Direction event, e.g. "dragLeft" */
+ var direction = new CustomEvent(eventName.replace('*', detail.direction), {
+ detail: detail
+ });
+ this.surface.dispatchEvent(direction);
+ };
+ /**
+ * Get the dragging direction.
+ * @return {string} The direction in which the user is dragging.
+ */
+ DragEvents.prototype._dragDirection = function () {
+ return settings.directionNames[this.axis][this.distance[this.axis] > 0 ? 0 : 1];
+ };
+ /**
+ * Get the dragging direction.
+ * @return {string} The direction in which the user is dragging.
+ */
+ DragEvents.prototype._swipeDirection = function () {
+ return settings.directionNames[this.axis][this.movement[this.axis] > 0 ? 0 : 1];
+ };
+ return DragEvents;
+}());
+export default DragEvents;
diff --git a/dist/_modules/eventlisteners.js b/dist/_modules/eventlisteners.js
new file mode 100644
index 0000000..7a0d786
--- /dev/null
+++ b/dist/_modules/eventlisteners.js
@@ -0,0 +1,50 @@
+/**
+ * Make the first letter in a word uppercase.
+ * @param {string} word The word.
+ */
+function ucFirst(word) {
+ if (!word) {
+ return '';
+ }
+ return word.charAt(0).toUpperCase() + word.slice(1);
+}
+/**
+ * Bind an event listener to an element.
+ * @param {HTMLElement} element The element to bind the event listener to.
+ * @param {string} evnt The event to listen to.
+ * @param {funcion} handler The function to invoke.
+ */
+export function on(element, evnt, handler) {
+ // Extract the event name and space from the event (the event can include a namespace (click.foo)).
+ var evntParts = evnt.split('.');
+ evnt = 'mmEvent' + ucFirst(evntParts[0]) + ucFirst(evntParts[1]);
+ element[evnt] = element[evnt] || [];
+ element[evnt].push(handler);
+ element.addEventListener(evntParts[0], handler);
+}
+/**
+ * Remove an event listener from an element.
+ * @param {HTMLElement} element The element to remove the event listeners from.
+ * @param {string} evnt The event to remove.
+ */
+export function off(element, evnt) {
+ // Extract the event name and space from the event (the event can include a namespace (click.foo)).
+ var evntParts = evnt.split('.');
+ evnt = 'mmEvent' + ucFirst(evntParts[0]) + ucFirst(evntParts[1]);
+ (element[evnt] || []).forEach(function (handler) {
+ element.removeEventListener(evntParts[0], handler);
+ });
+}
+/**
+ * Trigger the bound event listeners on an element.
+ * @param {HTMLElement} element The element of which to trigger the event listeners from.
+ * @param {string} evnt The event to trigger.
+ * @param {object} [options] Options to pass to the handler.
+ */
+export function trigger(element, evnt, options) {
+ var evntParts = evnt.split('.');
+ evnt = 'mmEvent' + ucFirst(evntParts[0]) + ucFirst(evntParts[1]);
+ (element[evnt] || []).forEach(function (handler) {
+ handler(options || {});
+ });
+}
diff --git a/dist/_modules/helpers.js b/dist/_modules/helpers.js
new file mode 100644
index 0000000..4729981
--- /dev/null
+++ b/dist/_modules/helpers.js
@@ -0,0 +1,125 @@
+/**
+ * Deep extend an object with the given defaults.
+ * Note that the extended object is not a clone, meaning the original object will also be updated.
+ *
+ * @param {object} orignl The object to extend to.
+ * @param {object} dfault The object to extend from.
+ * @return {object} The extended "orignl" object.
+ */
+export function extend(orignl, dfault) {
+ if (type(orignl) != 'object') {
+ orignl = {};
+ }
+ if (type(dfault) != 'object') {
+ dfault = {};
+ }
+ for (var k in dfault) {
+ if (!dfault.hasOwnProperty(k)) {
+ continue;
+ }
+ if (typeof orignl[k] == 'undefined') {
+ orignl[k] = dfault[k];
+ }
+ else if (type(orignl[k]) == 'object') {
+ extend(orignl[k], dfault[k]);
+ }
+ }
+ return orignl;
+}
+/**
+ * Detect the touch / dragging direction on a touch device.
+ *
+ * @param {HTMLElement} surface The element to monitor for touch events.
+ * @return {object} Object with "get" function.
+ */
+export function touchDirection(surface) {
+ var direction = '';
+ surface.addEventListener('touchmove', function (evnt) {
+ direction = '';
+ if (evnt.movementY > 0) {
+ direction = 'down';
+ }
+ else if (evnt.movementY < 0) {
+ direction = 'up';
+ }
+ });
+ return {
+ get: function () { return direction; }
+ };
+}
+/**
+ * Get the type of any given variable. Improvement of "typeof".
+ *
+ * @param {any} variable The variable.
+ * @return {string} The type of the variable in lowercase.
+ */
+export function type(variable) {
+ return {}.toString
+ .call(variable)
+ .match(/\s([a-zA-Z]+)/)[1]
+ .toLowerCase();
+}
+/**
+ * Find the value from an option or function.
+ * @param {HTMLElement} element Scope for the function.
+ * @param {any} [option] Value or function.
+ * @param {any} [dfault] Default fallback value.
+ * @return {any} The given evaluation of the given option, or the default fallback value.
+ */
+export function valueOrFn(element, option, dfault) {
+ if (typeof option == 'function') {
+ var value = option.call(element);
+ if (typeof value != 'undefined') {
+ return value;
+ }
+ }
+ if ((option === null ||
+ typeof option == 'function' ||
+ typeof option == 'undefined') &&
+ typeof dfault != 'undefined') {
+ return dfault;
+ }
+ return option;
+}
+/**
+ * Set and invoke a (single) transition-end function with fallback.
+ *
+ * @param {HTMLElement} element Scope for the function.
+ * @param {function} func Function to invoke.
+ * @param {number} duration The duration of the animation (for the fallback).
+ */
+export function transitionend(element, func, duration) {
+ var _ended = false, _fn = function (evnt) {
+ if (typeof evnt !== 'undefined') {
+ if (evnt.target !== element) {
+ return;
+ }
+ }
+ if (!_ended) {
+ element.removeEventListener('transitionend', _fn);
+ element.removeEventListener('webkitTransitionEnd', _fn);
+ func.call(element);
+ }
+ _ended = true;
+ };
+ element.addEventListener('transitionend', _fn);
+ element.addEventListener('webkitTransitionEnd', _fn);
+ setTimeout(_fn, duration * 1.1);
+}
+/**
+ * Get a (page wide) unique ID.
+ */
+export function uniqueId() {
+ return 'mm-' + __id++;
+}
+var __id = 0;
+/**
+ * Get the original ID from a possibly prefixed ID.
+ * @param id The possibly prefixed ID.
+ */
+export function originalId(id) {
+ if (id.slice(0, 3) == 'mm-') {
+ return id.slice(3);
+ }
+ return id;
+}
diff --git a/dist/_modules/i18n.js b/dist/_modules/i18n.js
new file mode 100644
index 0000000..0890d69
--- /dev/null
+++ b/dist/_modules/i18n.js
@@ -0,0 +1,34 @@
+import { extend } from './helpers';
+var translations = {};
+/**
+ * Add translations to a language.
+ * @param {object} text Object of key/value translations.
+ * @param {string} language The translated language.
+ */
+export function add(text, language) {
+ if (typeof translations[language] == 'undefined') {
+ translations[language] = {};
+ }
+ extend(translations[language], text);
+}
+/**
+ * Find a translated text in a language.
+ * @param {string} text The text to find the translation for.
+ * @param {string} language The language to search in.
+ * @return {string} The translated text.
+ */
+export function get(text, language) {
+ if (typeof language == 'string' &&
+ typeof translations[language] != 'undefined') {
+ return translations[language][text] || text;
+ }
+ return text;
+}
+/**
+ * Get all translated text in a language.
+ * @param {string} language The language to search for.
+ * @return {object} The translations.
+ */
+export function all(language) {
+ return translations;
+}
diff --git a/dist/_modules/matchmedia.js b/dist/_modules/matchmedia.js
new file mode 100644
index 0000000..8cf6255
--- /dev/null
+++ b/dist/_modules/matchmedia.js
@@ -0,0 +1,43 @@
+/** Collection of callback functions for media querys. */
+var listeners = {};
+/**
+ * Bind functions to a matchMedia listener (subscriber).
+ *
+ * @param {string|number} query Media query to match or number for min-width.
+ * @param {function} yes Function to invoke when the media query matches.
+ * @param {function} no Function to invoke when the media query doesn't match.
+ */
+export function add(query, yes, no) {
+ if (typeof query == 'number') {
+ query = '(min-width: ' + query + 'px)';
+ }
+ listeners[query] = listeners[query] || [];
+ listeners[query].push({ yes: yes, no: no });
+}
+/**
+ * Initialize the matchMedia listener.
+ */
+export function watch() {
+ var _loop_1 = function (query) {
+ var mqlist = window.matchMedia(query);
+ fire(query, mqlist);
+ mqlist.onchange = function (evnt) {
+ fire(query, mqlist);
+ };
+ };
+ for (var query in listeners) {
+ _loop_1(query);
+ }
+}
+/**
+ * Invoke the "yes" or "no" function for a matchMedia listener (publisher).
+ *
+ * @param {string} query Media query to check for.
+ * @param {MediaQueryList} mqlist Media query list to check with.
+ */
+export function fire(query, mqlist) {
+ var fn = mqlist.matches ? 'yes' : 'no';
+ for (var m = 0; m < listeners[query].length; m++) {
+ listeners[query][m][fn]();
+ }
+}
diff --git a/dist/_modules/support.js b/dist/_modules/support.js
new file mode 100644
index 0000000..5aaa886
--- /dev/null
+++ b/dist/_modules/support.js
@@ -0,0 +1,4 @@
+/** Whether or not touch gestures are supported by the browser. */
+export var touch = 'ontouchstart' in window ||
+ (navigator.msMaxTouchPoints ? true : false) ||
+ false;
diff --git a/dist/_version.js b/dist/_version.js
new file mode 100644
index 0000000..8f294ea
--- /dev/null
+++ b/dist/_version.js
@@ -0,0 +1 @@
+export default '8.5.3';
diff --git a/dist/addons/autoheight/_options.js b/dist/addons/autoheight/_options.js
new file mode 100644
index 0000000..49bb96b
--- /dev/null
+++ b/dist/addons/autoheight/_options.js
@@ -0,0 +1,27 @@
+var opts = {
+ height: 'default'
+};
+export default opts;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean' && options) {
+ options = {
+ height: 'auto'
+ };
+ }
+ if (typeof options == 'string') {
+ options = {
+ height: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/autoheight/mmenu.autoheight.css b/dist/addons/autoheight/mmenu.autoheight.css
new file mode 100644
index 0000000..cead9c5
--- /dev/null
+++ b/dist/addons/autoheight/mmenu.autoheight.css
@@ -0,0 +1 @@
+.mm-menu_autoheight:not(.mm-menu_offcanvas){position:relative}.mm-menu_autoheight.mm-menu_position-bottom,.mm-menu_autoheight.mm-menu_position-top{max-height:80%}.mm-menu_autoheight-measuring .mm-panel{display:block!important}.mm-menu_autoheight-measuring .mm-panels>.mm-panel{bottom:auto!important;height:auto!important}.mm-menu_autoheight-measuring .mm-listitem_vertical:not(.mm-listitem_opened) .mm-panel{display:none!important}
\ No newline at end of file
diff --git a/dist/addons/autoheight/mmenu.autoheight.js b/dist/addons/autoheight/mmenu.autoheight.js
new file mode 100644
index 0000000..09b2a9d
--- /dev/null
+++ b/dist/addons/autoheight/mmenu.autoheight.js
@@ -0,0 +1,84 @@
+import Mmenu from './../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.autoHeight = options;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.autoHeight);
+ this.opts.autoHeight = extend(options, Mmenu.options.autoHeight);
+ if (options.height != 'auto' && options.height != 'highest') {
+ return;
+ }
+ var setHeight = (function () {
+ var getCurrent = function () {
+ var panel = DOM.children(_this.node.pnls, '.mm-panel_opened')[0];
+ if (panel) {
+ panel = measurablePanel(panel);
+ }
+ // Fallback, just to be sure we have a panel.
+ if (!panel) {
+ panel = DOM.children(_this.node.pnls, '.mm-panel')[0];
+ }
+ return panel.scrollHeight;
+ };
+ var getHighest = function () {
+ var highest = 0;
+ DOM.children(_this.node.pnls, '.mm-panel').forEach(function (panel) {
+ panel = measurablePanel(panel);
+ highest = Math.max(highest, panel.scrollHeight);
+ });
+ return highest;
+ };
+ var measurablePanel = function (panel) {
+ // If it's a vertically expanding panel...
+ if (panel.parentElement.matches('.mm-listitem_vertical')) {
+ // ...find the first parent panel that isn't.
+ panel = DOM.parents(panel, '.mm-panel').filter(function (panel) {
+ return !panel.parentElement.matches('.mm-listitem_vertical');
+ })[0];
+ }
+ return panel;
+ };
+ return function () {
+ if (_this.opts.offCanvas && !_this.vars.opened) {
+ return;
+ }
+ var _hgh = 0;
+ var _dif = _this.node.menu.offsetHeight - _this.node.pnls.offsetHeight;
+ // The "measuring" classname undoes some CSS to be able to measure the height.
+ _this.node.menu.classList.add('mm-menu_autoheight-measuring');
+ // Measure the height.
+ if (options.height == 'auto') {
+ _hgh = getCurrent();
+ }
+ else if (options.height == 'highest') {
+ _hgh = getHighest();
+ }
+ // Set the height.
+ _this.node.menu.style.height = _hgh + _dif + 'px';
+ // Remove the "measuring" classname.
+ _this.node.menu.classList.remove('mm-menu_autoheight-measuring');
+ };
+ })();
+ // Add the autoheight class to the menu.
+ this.bind('initMenu:after', function () {
+ _this.node.menu.classList.add('mm-menu_autoheight');
+ });
+ if (this.opts.offCanvas) {
+ // Measure the height when opening the off-canvas menu.
+ this.bind('open:start', setHeight);
+ }
+ if (options.height == 'highest') {
+ // Measure the height when initiating panels.
+ this.bind('initPanels:after', setHeight);
+ }
+ if (options.height == 'auto') {
+ // Measure the height when updating listviews.
+ this.bind('updateListview', setHeight);
+ // Measure the height when opening a panel.
+ this.bind('openPanel:start', setHeight);
+ }
+}
diff --git a/dist/addons/backbutton/_options.js b/dist/addons/backbutton/_options.js
new file mode 100644
index 0000000..d8e286a
--- /dev/null
+++ b/dist/addons/backbutton/_options.js
@@ -0,0 +1,23 @@
+var options = {
+ close: false,
+ open: false
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ close: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/backbutton/mmenu.backbutton.js b/dist/addons/backbutton/mmenu.backbutton.js
new file mode 100644
index 0000000..fe98dc2
--- /dev/null
+++ b/dist/addons/backbutton/mmenu.backbutton.js
@@ -0,0 +1,58 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.backButton = options;
+export default function () {
+ var _this = this;
+ if (!this.opts.offCanvas) {
+ return;
+ }
+ var options = extendShorthandOptions(this.opts.backButton);
+ this.opts.backButton = extend(options, Mmenu.options.backButton);
+ var _menu = '#' + this.node.menu.id;
+ // Close menu
+ if (options.close) {
+ var states = [];
+ var setStates = function () {
+ states = [_menu];
+ DOM.children(_this.node.pnls, '.mm-panel_opened, .mm-panel_opened-parent').forEach(function (panel) {
+ states.push('#' + panel.id);
+ });
+ };
+ this.bind('open:finish', function () {
+ history.pushState(null, document.title, _menu);
+ });
+ this.bind('open:finish', setStates);
+ this.bind('openPanel:finish', setStates);
+ this.bind('close:finish', function () {
+ states = [];
+ history.back();
+ history.pushState(null, document.title, location.pathname + location.search);
+ });
+ window.addEventListener('popstate', function (evnt) {
+ if (_this.vars.opened) {
+ if (states.length) {
+ states = states.slice(0, -1);
+ var hash = states[states.length - 1];
+ if (hash == _menu) {
+ _this.close();
+ }
+ else {
+ _this.openPanel(_this.node.menu.querySelector(hash));
+ history.pushState(null, document.title, _menu);
+ }
+ }
+ }
+ });
+ }
+ if (options.open) {
+ window.addEventListener('popstate', function (evnt) {
+ if (!_this.vars.opened && location.hash == _menu) {
+ _this.open();
+ }
+ });
+ }
+}
diff --git a/dist/addons/columns/_options.js b/dist/addons/columns/_options.js
new file mode 100644
index 0000000..747ea2e
--- /dev/null
+++ b/dist/addons/columns/_options.js
@@ -0,0 +1,38 @@
+var options = {
+ add: false,
+ visible: {
+ min: 1,
+ max: 3
+ }
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ add: options
+ };
+ }
+ if (typeof options == 'number') {
+ options = {
+ add: true,
+ visible: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ if (typeof options.visible == 'number') {
+ options.visible = {
+ min: options.visible,
+ max: options.visible
+ };
+ }
+ return options;
+}
+;
diff --git a/dist/addons/columns/mmenu.columns.css b/dist/addons/columns/mmenu.columns.css
new file mode 100644
index 0000000..1eb1184
--- /dev/null
+++ b/dist/addons/columns/mmenu.columns.css
@@ -0,0 +1 @@
+[class*=mm-menu_columns-]{-webkit-transition-property:width;-o-transition-property:width;transition-property:width}[class*=mm-menu_columns-] .mm-panels>.mm-panel{right:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:width,transform;transition-property:width,transform;transition-property:width,transform,-webkit-transform}[class*=mm-menu_columns-] .mm-panels>.mm-panel_opened,[class*=mm-menu_columns-] .mm-panels>.mm-panel_opened-parent{display:block!important}[class*=mm-panel_columns-]{border-right:1px solid;border-color:inherit}.mm-menu_columns-1 .mm-panel_columns-0,.mm-menu_columns-2 .mm-panel_columns-1,.mm-menu_columns-3 .mm-panel_columns-2,.mm-menu_columns-4 .mm-panel_columns-3{border-right:none}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-0{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_columns-0 .mm-panels>.mm-panel{z-index:0}.mm-menu_columns-0 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-0 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_columns-0{width:80%;min-width:240px;max-width:0}.mm-wrapper_opening .mm-menu_columns-0~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-0~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:0px){.mm-wrapper_opening .mm-menu_columns-0~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:0px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-1{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_columns-1 .mm-panels>.mm-panel{z-index:1;width:100%}.mm-menu_columns-1 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-1 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(200%,0,0);transform:translate3d(200%,0,0)}.mm-menu_columns-1{width:80%;min-width:240px;max-width:440px}.mm-wrapper_opening .mm-menu_columns-1~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-1~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_columns-1~.mm-slideout{-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0)}}.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-440px,0,0);transform:translate3d(-440px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-2{-webkit-transform:translate3d(200%,0,0);transform:translate3d(200%,0,0)}.mm-menu_columns-2 .mm-panels>.mm-panel{z-index:2;width:50%}.mm-menu_columns-2 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-2 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(300%,0,0);transform:translate3d(300%,0,0)}.mm-menu_columns-2{width:80%;min-width:240px;max-width:880px}.mm-wrapper_opening .mm-menu_columns-2~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-2~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:1100px){.mm-wrapper_opening .mm-menu_columns-2~.mm-slideout{-webkit-transform:translate3d(880px,0,0);transform:translate3d(880px,0,0)}}.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:1100px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-880px,0,0);transform:translate3d(-880px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-3{-webkit-transform:translate3d(300%,0,0);transform:translate3d(300%,0,0)}.mm-menu_columns-3 .mm-panels>.mm-panel{z-index:3;width:33.34%}.mm-menu_columns-3 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-3 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(400%,0,0);transform:translate3d(400%,0,0)}.mm-menu_columns-3{width:80%;min-width:240px;max-width:1320px}.mm-wrapper_opening .mm-menu_columns-3~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-3~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:1650px){.mm-wrapper_opening .mm-menu_columns-3~.mm-slideout{-webkit-transform:translate3d(1320px,0,0);transform:translate3d(1320px,0,0)}}.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:1650px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-1320px,0,0);transform:translate3d(-1320px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-4{-webkit-transform:translate3d(400%,0,0);transform:translate3d(400%,0,0)}.mm-menu_columns-4 .mm-panels>.mm-panel{z-index:4;width:25%}.mm-menu_columns-4 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-4 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(500%,0,0);transform:translate3d(500%,0,0)}.mm-menu_columns-4{width:80%;min-width:240px;max-width:1760px}.mm-wrapper_opening .mm-menu_columns-4~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-4~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:2200px){.mm-wrapper_opening .mm-menu_columns-4~.mm-slideout{-webkit-transform:translate3d(1760px,0,0);transform:translate3d(1760px,0,0)}}.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:2200px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-1760px,0,0);transform:translate3d(-1760px,0,0)}}[class*=mm-menu_columns-].mm-menu_position-bottom,[class*=mm-menu_columns-].mm-menu_position-top{width:100%;max-width:100%;min-width:100%}.mm-wrapper_opening [class*=mm-menu_columns-].mm-menu_position-front{-webkit-transition-property:width,min-width,max-width,-webkit-transform;transition-property:width,min-width,max-width,-webkit-transform;-o-transition-property:width,min-width,max-width,transform;transition-property:width,min-width,max-width,transform;transition-property:width,min-width,max-width,transform,-webkit-transform}
\ No newline at end of file
diff --git a/dist/addons/columns/mmenu.columns.js b/dist/addons/columns/mmenu.columns.js
new file mode 100644
index 0000000..7cdb3d6
--- /dev/null
+++ b/dist/addons/columns/mmenu.columns.js
@@ -0,0 +1,103 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.columns = options;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.columns);
+ this.opts.columns = extend(options, Mmenu.options.columns);
+ // Add the columns
+ if (options.add) {
+ options.visible.min = Math.max(1, Math.min(6, options.visible.min));
+ options.visible.max = Math.max(options.visible.min, Math.min(6, options.visible.max));
+ /** Columns related clasnames for the menu. */
+ var colm = [];
+ /** Columns related clasnames for the panels. */
+ var colp = [];
+ /** Classnames to remove from panels in favor of showing columns. */
+ var rmvc = [
+ 'mm-panel_opened',
+ 'mm-panel_opened-parent',
+ 'mm-panel_highest'
+ ];
+ for (var i = 0; i <= options.visible.max; i++) {
+ colm.push('mm-menu_columns-' + i);
+ colp.push('mm-panel_columns-' + i);
+ }
+ rmvc.push.apply(rmvc, colp);
+ // Close all later opened panels
+ this.bind('openPanel:before', function (panel) {
+ /** The parent panel. */
+ var parent;
+ if (panel) {
+ parent = panel['mmParent'];
+ }
+ if (!parent) {
+ return;
+ }
+ parent = parent.closest('.mm-panel');
+ if (!parent) {
+ return;
+ }
+ var classname = parent.className;
+ if (!classname.length) {
+ return;
+ }
+ classname = classname.split('mm-panel_columns-')[1];
+ if (!classname) {
+ return;
+ }
+ var colnr = parseInt(classname.split(' ')[0], 10) + 1;
+ while (colnr > 0) {
+ panel = DOM.children(_this.node.pnls, '.mm-panel_columns-' + colnr)[0];
+ if (panel) {
+ colnr++;
+ panel.classList.add('mm-hidden');
+ // IE11:
+ rmvc.forEach(function (classname) {
+ panel.classList.remove(classname);
+ });
+ // Better browsers:
+ // panel.classList.remove(...rmvc);
+ }
+ else {
+ colnr = -1;
+ break;
+ }
+ }
+ });
+ this.bind('openPanel:start', function (panel) {
+ var columns = DOM.children(_this.node.pnls, '.mm-panel_opened-parent').length;
+ if (!panel.matches('.mm-panel_opened-parent')) {
+ columns++;
+ }
+ columns = Math.min(options.visible.max, Math.max(options.visible.min, columns));
+ // IE11:
+ colm.forEach(function (classname) {
+ _this.node.menu.classList.remove(classname);
+ });
+ // Better browsers:
+ // this.node.menu.classList.remove(...colm);
+ _this.node.menu.classList.add('mm-menu_columns-' + columns);
+ var panels = [];
+ DOM.children(_this.node.pnls, '.mm-panel').forEach(function (panel) {
+ // IE11:
+ colp.forEach(function (classname) {
+ panel.classList.remove(classname);
+ });
+ // Better browsers:
+ // panel.classList.remove(...colp);
+ if (panel.matches('.mm-panel_opened-parent')) {
+ panels.push(panel);
+ }
+ });
+ panels.push(panel);
+ panels.slice(-options.visible.max).forEach(function (panel, p) {
+ panel.classList.add('mm-panel_columns-' + p);
+ });
+ });
+ }
+}
diff --git a/dist/addons/counters/_options.js b/dist/addons/counters/_options.js
new file mode 100644
index 0000000..74e5f92
--- /dev/null
+++ b/dist/addons/counters/_options.js
@@ -0,0 +1,28 @@
+var options = {
+ add: false,
+ addTo: 'panels',
+ count: false
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ add: options,
+ addTo: 'panels',
+ count: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ if (options.addTo == 'panels') {
+ options.addTo = '.mm-listview';
+ }
+ return options;
+}
diff --git a/dist/addons/counters/mmenu.counters.css b/dist/addons/counters/mmenu.counters.css
new file mode 100644
index 0000000..7c18734
--- /dev/null
+++ b/dist/addons/counters/mmenu.counters.css
@@ -0,0 +1 @@
+.mm-counter{color:rgba(0,0,0,.3);display:block;padding-left:20px;float:right;text-align:right;color:var(--mm-color-text-dimmed)}.mm-listitem_nosubitems>.mm-counter{display:none}[dir=rtl] .mm-counter{text-align:left;float:left;padding-left:0;padding-right:20px}
\ No newline at end of file
diff --git a/dist/addons/counters/mmenu.counters.js b/dist/addons/counters/mmenu.counters.js
new file mode 100644
index 0000000..b91a1f6
--- /dev/null
+++ b/dist/addons/counters/mmenu.counters.js
@@ -0,0 +1,65 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.counters = options;
+// Add the classnames.
+Mmenu.configs.classNames.counters = {
+ counter: 'Counter'
+};
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.counters);
+ this.opts.counters = extend(options, Mmenu.options.counters);
+ // Refactor counter class
+ this.bind('initListview:after', function (listview) {
+ var cntrclss = _this.conf.classNames.counters.counter, counters = DOM.find(listview, '.' + cntrclss);
+ counters.forEach(function (counter) {
+ DOM.reClass(counter, cntrclss, 'mm-counter');
+ });
+ });
+ // Add the counters after a listview is initiated.
+ if (options.add) {
+ this.bind('initListview:after', function (listview) {
+ if (!listview.matches(options.addTo)) {
+ return;
+ }
+ var parent = listview.closest('.mm-panel')['mmParent'];
+ if (parent) {
+ // Check if no counter already excists.
+ if (!DOM.find(parent, '.mm-counter').length) {
+ var btn = DOM.children(parent, '.mm-btn')[0];
+ if (btn) {
+ btn.prepend(DOM.create('span.mm-counter'));
+ }
+ }
+ }
+ });
+ }
+ if (options.count) {
+ var count = function (listview) {
+ var panels = listview
+ ? [listview.closest('.mm-panel')]
+ : DOM.children(_this.node.pnls, '.mm-panel');
+ panels.forEach(function (panel) {
+ var parent = panel['mmParent'];
+ if (!parent) {
+ return;
+ }
+ var counter = DOM.find(parent, '.mm-counter')[0];
+ if (!counter) {
+ return;
+ }
+ var listitems = [];
+ DOM.children(panel, '.mm-listview').forEach(function (listview) {
+ listitems.push.apply(listitems, DOM.children(listview));
+ });
+ counter.innerHTML = DOM.filterLI(listitems).length.toString();
+ });
+ };
+ this.bind('initListview:after', count);
+ this.bind('updateListview', count);
+ }
+}
diff --git a/dist/addons/dividers/_options.js b/dist/addons/dividers/_options.js
new file mode 100644
index 0000000..bf3f013
--- /dev/null
+++ b/dist/addons/dividers/_options.js
@@ -0,0 +1,25 @@
+var options = {
+ add: false,
+ addTo: 'panels'
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ add: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ if (options.addTo == 'panels') {
+ options.addTo = '.mm-listview';
+ }
+ return options;
+}
diff --git a/dist/addons/dividers/mmenu.dividers.css b/dist/addons/dividers/mmenu.dividers.css
new file mode 100644
index 0000000..e95bc1d
--- /dev/null
+++ b/dist/addons/dividers/mmenu.dividers.css
@@ -0,0 +1 @@
+.mm-divider{position:relative;min-height:20px;padding:4.3px;background:#f3f3f3;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;min-height:var(--mm-line-height);padding:calc(((var(--mm-listitem-size) * .65) - var(--mm-line-height)) * .5);padding-right:10px;padding-left:20px;font-size:75%;text-transform:uppercase;background:var(--mm-color-background);opacity:1;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-divider:before{background:rgba(0,0,0,.05)}@supports ((position:-webkit-sticky) or (position:sticky)){.mm-divider{position:-webkit-sticky;position:sticky;z-index:2;top:0}.mm-navbar_sticky:not(.mm-hidden)~.mm-listview .mm-divider{top:var(--mm-navbar-size)}}.mm-divider:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:var(--mm-color-background-highlight)}
\ No newline at end of file
diff --git a/dist/addons/dividers/mmenu.dividers.js b/dist/addons/dividers/mmenu.dividers.js
new file mode 100644
index 0000000..220a0ac
--- /dev/null
+++ b/dist/addons/dividers/mmenu.dividers.js
@@ -0,0 +1,46 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.dividers = options;
+// Add the classnames.
+Mmenu.configs.classNames.divider = 'Divider';
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.dividers);
+ this.opts.dividers = extend(options, Mmenu.options.dividers);
+ // Refactor divider classname
+ this.bind('initListview:after', function (listview) {
+ DOM.children(listview).forEach(function (listitem) {
+ DOM.reClass(listitem, _this.conf.classNames.divider, 'mm-divider');
+ if (listitem.matches('.mm-divider')) {
+ listitem.classList.remove('mm-listitem');
+ }
+ });
+ });
+ // Add dividers
+ if (options.add) {
+ this.bind('initListview:after', function (listview) {
+ if (!listview.matches(options.addTo)) {
+ return;
+ }
+ DOM.find(listview, '.mm-divider').forEach(function (divider) {
+ divider.remove();
+ });
+ var lastletter = '', listitems = DOM.children(listview);
+ DOM.filterLI(listitems).forEach(function (listitem) {
+ var letter = DOM.children(listitem, '.mm-listitem__text')[0]
+ .textContent.trim()
+ .toLowerCase()[0];
+ if (letter.length && letter != lastletter) {
+ lastletter = letter;
+ var divider = DOM.create('li.mm-divider');
+ divider.textContent = letter;
+ listview.insertBefore(divider, listitem);
+ }
+ });
+ });
+ }
+}
diff --git a/dist/addons/drag/_drag.open.js b/dist/addons/drag/_drag.open.js
new file mode 100644
index 0000000..8b97e0d
--- /dev/null
+++ b/dist/addons/drag/_drag.open.js
@@ -0,0 +1,202 @@
+import DragEvents from '../../_modules/dragevents/index';
+import * as DOM from '../../_modules/dom';
+import * as events from '../../_modules/eventlisteners';
+import * as media from '../../_modules/matchmedia';
+/** Instance of the DragEvents class. */
+var dragInstance = null;
+/** THe node that can be dragged. */
+var dragNode = null;
+/** How far the page (or menu) can be dragged. */
+var maxDistance = 0;
+export default function (page) {
+ var _this = this;
+ /** Variables that vary for each menu position (top, right, bottom, left. front, back). */
+ var vars = {};
+ /** Whether or not the page or menu is actually being moved. */
+ var moving = false;
+ /**
+ * Add the dragging events.
+ */
+ var addEvents = function () {
+ if (dragNode) {
+ // Prepare the page or menu to be moved.
+ events.on(dragNode, 'dragStart', function (evnt) {
+ if (evnt['detail'].direction == vars.direction) {
+ moving = true;
+ // Class prevents interaction with the page.
+ _this.node.wrpr.classList.add('mm-wrapper_dragging');
+ // Prepare the menu to be opened.
+ _this._openSetup();
+ _this.trigger('open:start');
+ // Get the maximum distance to move out the page or menu.
+ maxDistance = _this.node.menu[vars.axis == 'x' ? 'clientWidth' : 'clientHeight'];
+ }
+ });
+ // Move the page or menu when dragging.
+ events.on(dragNode, 'dragMove', function (evnt) {
+ if (evnt['detail'].axis == vars.axis) {
+ if (moving) {
+ var distance = evnt['detail']['distance' + vars.axis.toUpperCase()];
+ switch (vars.position) {
+ case 'right':
+ case 'bottom':
+ distance = Math.min(Math.max(distance, -maxDistance), 0);
+ break;
+ default:
+ distance = Math.max(Math.min(distance, maxDistance), 0);
+ }
+ // Deviate for position front (the menu starts out of view).
+ if (vars.zposition == 'front') {
+ switch (vars.position) {
+ case 'right':
+ case 'bottom':
+ distance += maxDistance;
+ break;
+ default:
+ distance -= maxDistance;
+ break;
+ }
+ }
+ vars.slideOutNodes.forEach(function (node) {
+ node.style['transform'] =
+ 'translate' +
+ vars.axis.toUpperCase() +
+ '(' +
+ distance +
+ 'px)';
+ });
+ }
+ }
+ });
+ // Stop the page or menu from being moved.
+ events.on(dragNode, 'dragEnd', function (evnt) {
+ if (evnt['detail'].axis == vars.axis) {
+ if (moving) {
+ moving = false;
+ _this.node.wrpr.classList.remove('mm-wrapper_dragging');
+ vars.slideOutNodes.forEach(function (node) {
+ node.style['transform'] = '';
+ });
+ // Determine if the menu should open or close.
+ var open_1 = Math.abs(evnt['detail']['distance' + vars.axis.toUpperCase()]) >=
+ maxDistance * 0.75;
+ if (!open_1) {
+ var movement = evnt['detail']['movement' + vars.axis.toUpperCase()];
+ switch (vars.position) {
+ case 'right':
+ case 'bottom':
+ open_1 = movement <= 0;
+ break;
+ default:
+ open_1 = movement >= 0;
+ break;
+ }
+ }
+ if (open_1) {
+ _this._openStart();
+ }
+ else {
+ _this.close();
+ }
+ }
+ }
+ });
+ }
+ };
+ /**
+ * Remove the dragging events.
+ */
+ var removeEvents = function () {
+ if (dragNode) {
+ events.off(dragNode, 'dragStart');
+ events.off(dragNode, 'dragMove');
+ events.off(dragNode, 'dragEnd');
+ }
+ };
+ var addMatchMedia = function () {
+ var queries = Object.keys(_this.opts.extensions);
+ if (queries.length) {
+ // A media query that'll match if any of the other media query matches:
+ // set the defaults if it doesn't match.
+ media.add(queries.join(', '), function () { }, function () {
+ vars = getPositionVars(vars, [], _this.node.menu);
+ });
+ // The other media queries.
+ queries.forEach(function (query) {
+ media.add(query, function () {
+ vars = getPositionVars(vars, _this.opts.extensions[query], _this.node.menu);
+ }, function () { });
+ });
+ // No extensions, just use the defaults.
+ }
+ else {
+ vars = getPositionVars(vars, [], _this.node.menu);
+ }
+ };
+ // Remove events from previous "page"
+ removeEvents();
+ // Store new "page"
+ dragNode = page;
+ // Initialize the drag events.
+ dragInstance = new DragEvents(dragNode);
+ addMatchMedia();
+ addMatchMedia = function () { };
+ addEvents();
+}
+var getPositionVars = function (vars, extensions, menu) {
+ // Default position and z-position.
+ vars.position = 'left';
+ vars.zposition = 'back';
+ // Find position.
+ ['right', 'top', 'bottom'].forEach(function (pos) {
+ if (extensions.indexOf('position-' + pos) > -1) {
+ vars.position = pos;
+ }
+ });
+ // Find z-position.
+ ['front', 'top', 'bottom'].forEach(function (pos) {
+ if (extensions.indexOf('position-' + pos) > -1) {
+ vars.zposition = 'front';
+ }
+ });
+ // Set the area where the dragging can start.
+ dragInstance.area = {
+ top: vars.position == 'bottom' ? '75%' : 0,
+ right: vars.position == 'left' ? '75%' : 0,
+ bottom: vars.position == 'top' ? '75%' : 0,
+ left: vars.position == 'right' ? '75%' : 0
+ };
+ // What side of the menu to measure (width or height).
+ // What axis to drag the menu along (x or y).
+ switch (vars.position) {
+ case 'top':
+ case 'bottom':
+ vars.axis = 'y';
+ break;
+ default:
+ vars.axis = 'x';
+ }
+ // What direction to drag in.
+ switch (vars.position) {
+ case 'top':
+ vars.direction = 'Down';
+ break;
+ case 'right':
+ vars.direction = 'Left';
+ break;
+ case 'bottom':
+ vars.direction = 'Up';
+ break;
+ default:
+ vars.direction = 'Right';
+ }
+ // What nodes to slide out while dragging.
+ switch (vars.zposition) {
+ case 'front':
+ vars.slideOutNodes = [menu];
+ break;
+ default:
+ vars.slideOutNodes = DOM.find(document.body, '.mm-slideout');
+ }
+ return vars;
+};
diff --git a/dist/addons/drag/_options.js b/dist/addons/drag/_options.js
new file mode 100644
index 0000000..f7bae38
--- /dev/null
+++ b/dist/addons/drag/_options.js
@@ -0,0 +1,22 @@
+var options = {
+ open: false,
+ node: null
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ open: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
diff --git a/dist/addons/drag/mmenu.drag.css b/dist/addons/drag/mmenu.drag.css
new file mode 100644
index 0000000..d19e5c5
--- /dev/null
+++ b/dist/addons/drag/mmenu.drag.css
@@ -0,0 +1 @@
+.mm-wrapper_dragging .mm-menu,.mm-wrapper_dragging .mm-slideout{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important;-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.mm-wrapper_dragging .mm-menu{pointer-events:none!important}.mm-wrapper_dragging .mm-wrapper__blocker{display:none!important}
\ No newline at end of file
diff --git a/dist/addons/drag/mmenu.drag.js b/dist/addons/drag/mmenu.drag.js
new file mode 100644
index 0000000..36bb85c
--- /dev/null
+++ b/dist/addons/drag/mmenu.drag.js
@@ -0,0 +1,21 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import dragOpen from './_drag.open';
+import { extend } from '../../_modules/helpers';
+// Add the options and configs.
+Mmenu.options.drag = options;
+export default function () {
+ var _this = this;
+ if (!this.opts.offCanvas) {
+ return;
+ }
+ var options = extendShorthandOptions(this.opts.drag);
+ this.opts.drag = extend(options, Mmenu.options.drag);
+ // Drag open the menu
+ if (options.open) {
+ this.bind('setPage:after', function (page) {
+ dragOpen.call(_this, options.node || page);
+ });
+ }
+}
diff --git a/dist/addons/dropdown/_configs.js b/dist/addons/dropdown/_configs.js
new file mode 100644
index 0000000..fae440b
--- /dev/null
+++ b/dist/addons/dropdown/_configs.js
@@ -0,0 +1,19 @@
+var configs = {
+ offset: {
+ button: {
+ x: -5,
+ y: 5
+ },
+ viewport: {
+ x: 20,
+ y: 20
+ }
+ },
+ height: {
+ max: 880
+ },
+ width: {
+ max: 440
+ }
+};
+export default configs;
diff --git a/dist/addons/dropdown/_options.js b/dist/addons/dropdown/_options.js
new file mode 100644
index 0000000..8b30c85
--- /dev/null
+++ b/dist/addons/dropdown/_options.js
@@ -0,0 +1,31 @@
+var options = {
+ drop: false,
+ fitViewport: true,
+ event: 'click',
+ position: {},
+ tip: true
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean' && options) {
+ options = {
+ drop: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ if (typeof options.position == 'string') {
+ options.position = {
+ of: options.position
+ };
+ }
+ return options;
+}
+;
diff --git a/dist/addons/dropdown/mmenu.dropdown.css b/dist/addons/dropdown/mmenu.dropdown.css
new file mode 100644
index 0000000..c8e404d
--- /dev/null
+++ b/dist/addons/dropdown/mmenu.dropdown.css
@@ -0,0 +1 @@
+.mm-menu_dropdown{-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);height:80%}.mm-wrapper_dropdown .mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-wrapper_dropdown .mm-wrapper__blocker{-webkit-transition-delay:0s!important;-o-transition-delay:0s!important;transition-delay:0s!important;z-index:1}.mm-wrapper_dropdown .mm-menu_dropdown{z-index:2}.mm-wrapper_dropdown.mm-wrapper_opened:not(.mm-wrapper_opening) .mm-menu_dropdown{display:none}.mm-menu_tip-bottom:before,.mm-menu_tip-left:before,.mm-menu_tip-right:before,.mm-menu_tip-top:before{content:'';background:inherit;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);display:block;width:15px;height:15px;position:absolute;z-index:-1;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mm-menu_tip-left:before{left:22px}.mm-menu_tip-right:before{right:22px}.mm-menu_tip-top:before{top:-8px}.mm-menu_tip-bottom:before{bottom:-8px}
\ No newline at end of file
diff --git a/dist/addons/dropdown/mmenu.dropdown.js b/dist/addons/dropdown/mmenu.dropdown.js
new file mode 100644
index 0000000..238875c
--- /dev/null
+++ b/dist/addons/dropdown/mmenu.dropdown.js
@@ -0,0 +1,159 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import configs from './_configs';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend, originalId } from '../../_modules/helpers';
+// Add the options and configs.
+Mmenu.options.dropdown = options;
+Mmenu.configs.dropdown = configs;
+export default function () {
+ var _this = this;
+ if (!this.opts.offCanvas) {
+ return;
+ }
+ var options = extendShorthandOptions(this.opts.dropdown);
+ this.opts.dropdown = extend(options, Mmenu.options.dropdown);
+ var configs = this.conf.dropdown;
+ if (!options.drop) {
+ return;
+ }
+ var button;
+ this.bind('initMenu:after', function () {
+ _this.node.menu.classList.add('mm-menu_dropdown');
+ if (typeof options.position.of != 'string') {
+ var id = originalId(_this.node.menu.id);
+ if (id) {
+ options.position.of = '[href="#' + id + '"]';
+ }
+ }
+ if (typeof options.position.of != 'string') {
+ return;
+ }
+ // Get the button to put the menu next to
+ button = DOM.find(document.body, options.position.of)[0];
+ // Emulate hover effect
+ var events = options.event.split(' ');
+ if (events.length == 1) {
+ events[1] = events[0];
+ }
+ if (events[0] == 'hover') {
+ button.addEventListener('mouseenter', function () {
+ _this.open();
+ }, { passive: true });
+ }
+ if (events[1] == 'hover') {
+ _this.node.menu.addEventListener('mouseleave', function () {
+ _this.close();
+ }, { passive: true });
+ }
+ });
+ // Add/remove classname and style when opening/closing the menu
+ this.bind('open:start', function () {
+ _this.node.menu['mmStyle'] = _this.node.menu.getAttribute('style');
+ _this.node.wrpr.classList.add('mm-wrapper_dropdown');
+ });
+ this.bind('close:finish', function () {
+ _this.node.menu.setAttribute('style', _this.node.menu['mmStyle']);
+ _this.node.wrpr.classList.remove('mm-wrapper_dropdown');
+ });
+ /**
+ * Find the position (x, y) and sizes (width, height) for the menu.
+ *
+ * @param {string} dir The direction to measure ("x" for horizontal, "y" for vertical)
+ * @param {object} obj The object where (previously) measured values are stored.
+ * @return {object} The object where measered values are stored.
+ */
+ var getPosition = function (dir, obj) {
+ var css = obj[0], cls = obj[1];
+ var _outerSize = dir == 'x' ? 'offsetWidth' : 'offsetHeight', _startPos = dir == 'x' ? 'left' : 'top', _stopPos = dir == 'x' ? 'right' : 'bottom', _size = dir == 'x' ? 'width' : 'height', _winSize = dir == 'x' ? 'innerWidth' : 'innerHeight', _maxSize = dir == 'x' ? 'maxWidth' : 'maxHeight', _position = null;
+ var startPos = DOM.offset(button, _startPos), stopPos = startPos + button[_outerSize], windowSize = window[_winSize];
+ /** Offset for the menu relative to the button. */
+ var offs = configs.offset.button[dir] + configs.offset.viewport[dir];
+ // Position set in option
+ if (options.position[dir]) {
+ switch (options.position[dir]) {
+ case 'left':
+ case 'bottom':
+ _position = 'after';
+ break;
+ case 'right':
+ case 'top':
+ _position = 'before';
+ break;
+ }
+ }
+ // Position not set in option, find most space
+ if (_position === null) {
+ _position =
+ startPos + (stopPos - startPos) / 2 < windowSize / 2
+ ? 'after'
+ : 'before';
+ }
+ // Set position and max
+ var val, max;
+ if (_position == 'after') {
+ val = dir == 'x' ? startPos : stopPos;
+ max = windowSize - (val + offs);
+ css[_startPos] = val + configs.offset.button[dir] + 'px';
+ css[_stopPos] = 'auto';
+ if (options.tip) {
+ cls.push('mm-menu_tip-' + (dir == 'x' ? 'left' : 'top'));
+ }
+ }
+ else {
+ val = dir == 'x' ? stopPos : startPos;
+ max = val - offs;
+ css[_stopPos] =
+ 'calc( 100% - ' + (val - configs.offset.button[dir]) + 'px )';
+ css[_startPos] = 'auto';
+ if (options.tip) {
+ cls.push('mm-menu_tip-' + (dir == 'x' ? 'right' : 'bottom'));
+ }
+ }
+ if (options.fitViewport) {
+ css[_maxSize] = Math.min(configs[_size].max, max) + 'px';
+ }
+ return [css, cls];
+ };
+ function position() {
+ var _this = this;
+ if (!this.vars.opened) {
+ return;
+ }
+ this.node.menu.setAttribute('style', this.node.menu['mmStyle']);
+ var obj = [{}, []];
+ obj = getPosition.call(this, 'y', obj);
+ obj = getPosition.call(this, 'x', obj);
+ for (var s in obj[0]) {
+ this.node.menu.style[s] = obj[0][s];
+ }
+ if (options.tip) {
+ var classnames = [
+ 'mm-menu_tip-left',
+ 'mm-menu_tip-right',
+ 'mm-menu_tip-top',
+ 'mm-menu_tip-bottom'
+ ];
+ // IE11:
+ classnames.forEach(function (classname) {
+ _this.node.menu.classList.remove(classname);
+ });
+ obj[1].forEach(function (classname) {
+ _this.node.menu.classList.add(classname);
+ });
+ // Better browsers:
+ // this.node.menu.classList.remove(...classnames);
+ // this.node.menu.classList.add(...obj[1]);
+ }
+ }
+ this.bind('open:start', position);
+ window.addEventListener('resize', function (evnt) {
+ position.call(_this);
+ }, { passive: true });
+ if (!this.opts.offCanvas.blockUI) {
+ window.addEventListener('scroll', function (evnt) {
+ position.call(_this);
+ }, { passive: true });
+ }
+}
diff --git a/dist/addons/fixedelements/_configs.js b/dist/addons/fixedelements/_configs.js
new file mode 100644
index 0000000..277750a
--- /dev/null
+++ b/dist/addons/fixedelements/_configs.js
@@ -0,0 +1,5 @@
+var configs = {
+ insertMethod: 'append',
+ insertSelector: 'body'
+};
+export default configs;
diff --git a/dist/addons/fixedelements/mmenu.fixedelements.js b/dist/addons/fixedelements/mmenu.fixedelements.js
new file mode 100644
index 0000000..5394eac
--- /dev/null
+++ b/dist/addons/fixedelements/mmenu.fixedelements.js
@@ -0,0 +1,26 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import configs from './_configs';
+import * as DOM from '../../_modules/dom';
+// Add the configs.
+Mmenu.configs.fixedElements = configs;
+// Add the classnames.
+Mmenu.configs.classNames.fixedElements = {
+ fixed: 'Fixed'
+};
+export default function () {
+ var _this = this;
+ if (!this.opts.offCanvas) {
+ return;
+ }
+ var configs = this.conf.fixedElements;
+ var _fixd, fixed, wrppr;
+ this.bind('setPage:after', function (page) {
+ _fixd = _this.conf.classNames.fixedElements.fixed;
+ wrppr = DOM.find(document, configs.insertSelector)[0];
+ fixed = DOM.find(page, '.' + _fixd);
+ fixed.forEach(function (fxd) {
+ DOM.reClass(fxd, _fixd, 'mm-slideout');
+ wrppr[configs.insertMethod](fxd);
+ });
+ });
+}
diff --git a/dist/addons/iconbar/_options.js b/dist/addons/iconbar/_options.js
new file mode 100644
index 0000000..821e7b8
--- /dev/null
+++ b/dist/addons/iconbar/_options.js
@@ -0,0 +1,33 @@
+import { type } from '../../_modules/helpers';
+var options = {
+ use: false,
+ top: [],
+ bottom: [],
+ position: 'left',
+ type: 'default'
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (type(options) == 'array') {
+ options = {
+ use: true,
+ top: options
+ };
+ }
+ if (type(options) != 'object') {
+ options = {};
+ }
+ if (typeof options.use == 'undefined') {
+ options.use = true;
+ }
+ if (typeof options.use == 'boolean' && options.use) {
+ options.use = true;
+ }
+ return options;
+}
diff --git a/dist/addons/iconbar/mmenu.iconbar.css b/dist/addons/iconbar/mmenu.iconbar.css
new file mode 100644
index 0000000..947ab91
--- /dev/null
+++ b/dist/addons/iconbar/mmenu.iconbar.css
@@ -0,0 +1 @@
+:root{--mm-iconbar-size:50px}.mm-menu_iconbar-left .mm-navbars_bottom,.mm-menu_iconbar-left .mm-navbars_top,.mm-menu_iconbar-left .mm-panels{margin-left:50px;margin-left:var(--mm-iconbar-size)}.mm-menu_iconbar-left .mm-iconbar{border-right-width:1px;display:block;left:0}.mm-menu_iconbar-right .mm-navbars_bottom,.mm-menu_iconbar-right .mm-navbars_top,.mm-menu_iconbar-right .mm-panels{margin-right:50px;margin-right:var(--mm-iconbar-size)}.mm-menu_iconbar-right .mm-iconbar{border-left-width:1px;display:block;right:0}.mm-iconbar{width:50px;border-color:rgba(0,0,0,.1);background:#f3f3f3;color:rgba(0,0,0,.3);display:none;width:var(--mm-iconbar-size);overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;top:0;bottom:0;z-index:2;border:0 solid;border-color:var(--mm-color-border);background:var(--mm-color-background);color:var(--mm-color-text-dimmed);text-align:center}.mm-iconbar__bottom,.mm-iconbar__top{width:inherit;position:absolute}.mm-iconbar__bottom>*,.mm-iconbar__top>*{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;padding:12.5px 0}.mm-iconbar__bottom a,.mm-iconbar__bottom a:hover,.mm-iconbar__top a,.mm-iconbar__top a:hover{text-decoration:none}.mm-iconbar__top{top:0}.mm-iconbar__bottom{bottom:0}.mm-iconbar__tab_selected{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}
\ No newline at end of file
diff --git a/dist/addons/iconbar/mmenu.iconbar.js b/dist/addons/iconbar/mmenu.iconbar.js
new file mode 100644
index 0000000..8e3c49c
--- /dev/null
+++ b/dist/addons/iconbar/mmenu.iconbar.js
@@ -0,0 +1,103 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as media from '../../_modules/matchmedia';
+import { type, extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.iconbar = options;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.iconbar);
+ this.opts.iconbar = extend(options, Mmenu.options.iconbar);
+ if (!options.use) {
+ return;
+ }
+ var iconbar;
+ ['top', 'bottom'].forEach(function (position, n) {
+ var ctnt = options[position];
+ // Extend shorthand options
+ if (type(ctnt) != 'array') {
+ ctnt = [ctnt];
+ }
+ // Create node
+ var part = DOM.create('div.mm-iconbar__' + position);
+ // Add content
+ for (var c = 0, l = ctnt.length; c < l; c++) {
+ if (typeof ctnt[c] == 'string') {
+ part.innerHTML += ctnt[c];
+ }
+ else {
+ part.append(ctnt[c]);
+ }
+ }
+ if (part.children.length) {
+ if (!iconbar) {
+ iconbar = DOM.create('div.mm-iconbar');
+ }
+ iconbar.append(part);
+ }
+ });
+ // Add to menu
+ if (iconbar) {
+ // Add the iconbar.
+ this.bind('initMenu:after', function () {
+ _this.node.menu.prepend(iconbar);
+ });
+ // En-/disable the iconbar.
+ var classname_1 = 'mm-menu_iconbar-' + options.position;
+ var enable = function () {
+ _this.node.menu.classList.add(classname_1);
+ Mmenu.sr_aria(iconbar, 'hidden', false);
+ };
+ var disable = function () {
+ _this.node.menu.classList.remove(classname_1);
+ Mmenu.sr_aria(iconbar, 'hidden', true);
+ };
+ if (typeof options.use == 'boolean') {
+ this.bind('initMenu:after', enable);
+ }
+ else {
+ media.add(options.use, enable, disable);
+ }
+ // Tabs
+ if (options.type == 'tabs') {
+ iconbar.classList.add('mm-iconbar_tabs');
+ iconbar.addEventListener('click', function (evnt) {
+ var anchor = evnt.target;
+ if (!anchor.matches('a')) {
+ return;
+ }
+ if (anchor.matches('.mm-iconbar__tab_selected')) {
+ evnt.stopImmediatePropagation();
+ return;
+ }
+ try {
+ var panel = _this.node.menu.querySelector(anchor.getAttribute('href'))[0];
+ if (panel && panel.matches('.mm-panel')) {
+ evnt.preventDefault();
+ evnt.stopImmediatePropagation();
+ _this.openPanel(panel, false);
+ }
+ }
+ catch (err) { }
+ });
+ var selectTab_1 = function (panel) {
+ DOM.find(iconbar, 'a').forEach(function (anchor) {
+ anchor.classList.remove('mm-iconbar__tab_selected');
+ });
+ var anchor = DOM.find(iconbar, '[href="#' + panel.id + '"]')[0];
+ if (anchor) {
+ anchor.classList.add('mm-iconbar__tab_selected');
+ }
+ else {
+ var parent_1 = panel['mmParent'];
+ if (parent_1) {
+ selectTab_1(parent_1.closest('.mm-panel'));
+ }
+ }
+ };
+ this.bind('openPanel:start', selectTab_1);
+ }
+ }
+}
diff --git a/dist/addons/iconpanels/_options.js b/dist/addons/iconpanels/_options.js
new file mode 100644
index 0000000..321759e
--- /dev/null
+++ b/dist/addons/iconpanels/_options.js
@@ -0,0 +1,33 @@
+var options = {
+ add: false,
+ blockPanel: true,
+ hideDivider: false,
+ hideNavbar: true,
+ visible: 3
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ add: options
+ };
+ }
+ if (typeof options == 'number' ||
+ typeof options == 'string') {
+ options = {
+ add: true,
+ visible: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/iconpanels/mmenu.iconpanels.css b/dist/addons/iconpanels/mmenu.iconpanels.css
new file mode 100644
index 0000000..1a14373
--- /dev/null
+++ b/dist/addons/iconpanels/mmenu.iconpanels.css
@@ -0,0 +1 @@
+:root{--mm-iconpanel-size:50px}.mm-panel_iconpanel-1{width:calc(100% - 50px);width:calc(100% - (var(--mm-iconpanel-size) * 1))}.mm-panel_iconpanel-2{width:calc(100% - 100px);width:calc(100% - (var(--mm-iconpanel-size) * 2))}.mm-panel_iconpanel-3{width:calc(100% - 150px);width:calc(100% - (var(--mm-iconpanel-size) * 3))}.mm-panel_iconpanel-first~.mm-panel{width:calc(100% - 50px);width:calc(100% - var(--mm-iconpanel-size))}.mm-menu_iconpanel .mm-panels>.mm-panel{left:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:transform,width;transition-property:transform,width;transition-property:transform,width,-webkit-transform}.mm-menu_iconpanel .mm-panels>.mm-panel_opened,.mm-menu_iconpanel .mm-panels>.mm-panel_opened-parent{display:block!important}.mm-menu_iconpanel .mm-panels>.mm-panel_opened-parent{overflow-y:hidden;-webkit-transform:unset;-ms-transform:unset;transform:unset}.mm-menu_iconpanel .mm-panels>.mm-panel:not(.mm-panel_iconpanel-first):not(.mm-panel_iconpanel-0){border-left-width:1px;border-left-style:solid}.mm-menu_hidedivider .mm-panel_opened-parent .mm-divider,.mm-menu_hidenavbar .mm-panel_opened-parent .mm-navbar{opacity:0}.mm-panel__blocker{background:inherit;opacity:0;display:block;position:absolute;top:0;right:0;left:0;z-index:3;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-panel_opened-parent .mm-panel__blocker{opacity:.6;bottom:-100000px}[dir=rtl] .mm-menu_iconpanel .mm-panels>.mm-panel{left:0;right:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:transform,width;transition-property:transform,width;transition-property:transform,width,-webkit-transform}[dir=rtl] .mm-menu_iconpanel .mm-panels>.mm-panel:not(.mm-panel_iconpanel-first):not(.mm-panel_iconpanel-0){border-left:none;border-right:1px solid;border-color:inherit}
\ No newline at end of file
diff --git a/dist/addons/iconpanels/mmenu.iconpanels.js b/dist/addons/iconpanels/mmenu.iconpanels.js
new file mode 100644
index 0000000..fe58b4c
--- /dev/null
+++ b/dist/addons/iconpanels/mmenu.iconpanels.js
@@ -0,0 +1,99 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.iconPanels = options;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.iconPanels);
+ this.opts.iconPanels = extend(options, Mmenu.options.iconPanels);
+ var keepFirst = false;
+ if (options.visible == 'first') {
+ keepFirst = true;
+ options.visible = 1;
+ }
+ options.visible = Math.min(3, Math.max(1, options.visible));
+ options.visible++;
+ // Add the iconpanels
+ if (options.add) {
+ this.bind('initMenu:after', function () {
+ var classnames = ['mm-menu_iconpanel'];
+ if (options.hideNavbar) {
+ classnames.push('mm-menu_hidenavbar');
+ }
+ if (options.hideDivider) {
+ classnames.push('mm-menu_hidedivider');
+ }
+ // IE11:
+ classnames.forEach(function (classname) {
+ _this.node.menu.classList.add(classname);
+ });
+ // Better browsers:
+ // this.node.menu.classList.add(...classnames);
+ });
+ var classnames_1 = [];
+ if (!keepFirst) {
+ for (var i = 0; i <= options.visible; i++) {
+ classnames_1.push('mm-panel_iconpanel-' + i);
+ }
+ }
+ this.bind('openPanel:start', function (panel) {
+ var panels = DOM.children(_this.node.pnls, '.mm-panel');
+ panel = panel || panels[0];
+ if (panel.parentElement.matches('.mm-listitem_vertical')) {
+ return;
+ }
+ if (keepFirst) {
+ panels.forEach(function (panel, p) {
+ panel.classList[p == 0 ? 'add' : 'remove']('mm-panel_iconpanel-first');
+ });
+ }
+ else {
+ // Remove the "iconpanel" classnames from all panels.
+ panels.forEach(function (panel) {
+ // IE11:
+ classnames_1.forEach(function (classname) {
+ panel.classList.remove(classname);
+ });
+ // Better browsers:
+ // panel.classList.remove(...classnames);
+ });
+ // Filter out panels that are not opened.
+ panels = panels.filter(function (panel) {
+ return panel.matches('.mm-panel_opened-parent');
+ });
+ // Add the current panel to the list.
+ var panelAdded_1 = false;
+ panels.forEach(function (elem) {
+ if (panel === elem) {
+ panelAdded_1 = true;
+ }
+ });
+ if (!panelAdded_1) {
+ panels.push(panel);
+ }
+ // Remove the "hidden" classname from all opened panels.
+ panels.forEach(function (panel) {
+ panel.classList.remove('mm-hidden');
+ });
+ // Slice the opened panels to the max visible amount.
+ panels = panels.slice(-options.visible);
+ // Add the "iconpanel" classnames.
+ panels.forEach(function (panel, p) {
+ panel.classList.add('mm-panel_iconpanel-' + p);
+ });
+ }
+ });
+ this.bind('initPanel:after', function (panel) {
+ if (options.blockPanel &&
+ !panel.parentElement.matches('.mm-listitem_vertical') &&
+ !DOM.children(panel, '.mm-panel__blocker')[0]) {
+ var blocker = DOM.create('a.mm-panel__blocker');
+ blocker.setAttribute('href', '#' + panel.closest('.mm-panel').id);
+ panel.prepend(blocker);
+ }
+ });
+ }
+}
diff --git a/dist/addons/keyboardnavigation/_options.js b/dist/addons/keyboardnavigation/_options.js
new file mode 100644
index 0000000..d0590b7
--- /dev/null
+++ b/dist/addons/keyboardnavigation/_options.js
@@ -0,0 +1,23 @@
+var options = {
+ enable: false,
+ enhance: false
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean' || typeof options == 'string') {
+ options = {
+ enable: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/keyboardnavigation/mmenu.keyboardnavigation.css b/dist/addons/keyboardnavigation/mmenu.keyboardnavigation.css
new file mode 100644
index 0000000..de70aa4
--- /dev/null
+++ b/dist/addons/keyboardnavigation/mmenu.keyboardnavigation.css
@@ -0,0 +1 @@
+.mm-menu_keyboardfocus a:focus,.mm-menu_keyboardfocus.mm-menu_opened~.mm-wrapper__blocker a:focus{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis);outline:0}.mm-wrapper__blocker .mm-tabstart{cursor:default;display:block;width:100%;height:100%}.mm-wrapper__blocker .mm-tabend{opacity:0;position:absolute;bottom:0}
\ No newline at end of file
diff --git a/dist/addons/keyboardnavigation/mmenu.keyboardnavigation.js b/dist/addons/keyboardnavigation/mmenu.keyboardnavigation.js
new file mode 100644
index 0000000..e11d45a
--- /dev/null
+++ b/dist/addons/keyboardnavigation/mmenu.keyboardnavigation.js
@@ -0,0 +1,183 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as events from '../../_modules/eventlisteners';
+import * as support from '../../_modules/support';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.keyboardNavigation = options;
+export default function () {
+ var _this = this;
+ // Keyboard navigation on touchscreens opens the virtual keyboard :/
+ // Lets prevent that.
+ if (support.touch) {
+ return;
+ }
+ var options = extendShorthandOptions(this.opts.keyboardNavigation);
+ this.opts.keyboardNavigation = extend(options, Mmenu.options.keyboardNavigation);
+ // Enable keyboard navigation
+ if (options.enable) {
+ var menuStart_1 = DOM.create('button.mm-tabstart.mm-sronly'), menuEnd_1 = DOM.create('button.mm-tabend.mm-sronly'), blockerEnd_1 = DOM.create('button.mm-tabend.mm-sronly');
+ this.bind('initMenu:after', function () {
+ if (options.enhance) {
+ _this.node.menu.classList.add('mm-menu_keyboardfocus');
+ }
+ initWindow.call(_this, options.enhance);
+ });
+ this.bind('initOpened:before', function () {
+ _this.node.menu.prepend(menuStart_1);
+ _this.node.menu.append(menuEnd_1);
+ DOM.children(_this.node.menu, '.mm-navbars-top, .mm-navbars-bottom').forEach(function (navbars) {
+ navbars.querySelectorAll('.mm-navbar__title').forEach(function (title) {
+ title.setAttribute('tabindex', '-1');
+ });
+ });
+ });
+ this.bind('initBlocker:after', function () {
+ Mmenu.node.blck.append(blockerEnd_1);
+ DOM.children(Mmenu.node.blck, 'a')[0].classList.add('mm-tabstart');
+ });
+ var focusable_1 = 'input, select, textarea, button, label, a[href]';
+ var setFocus = function (panel) {
+ panel =
+ panel || DOM.children(_this.node.pnls, '.mm-panel_opened')[0];
+ var focus = null;
+ // Focus already is on an element in a navbar in this menu.
+ var navbar = document.activeElement.closest('.mm-navbar');
+ if (navbar) {
+ if (navbar.closest('.mm-menu') == _this.node.menu) {
+ return;
+ }
+ }
+ // Set the focus to the first focusable element by default.
+ if (options.enable == 'default') {
+ // First visible anchor in a listview in the current panel.
+ focus = DOM.find(panel, '.mm-listview a[href]:not(.mm-hidden)')[0];
+ // First focusable and visible element in the current panel.
+ if (!focus) {
+ focus = DOM.find(panel, focusable_1 + ':not(.mm-hidden)')[0];
+ }
+ // First focusable and visible element in a navbar.
+ if (!focus) {
+ var elements_1 = [];
+ DOM.children(_this.node.menu, '.mm-navbars_top, .mm-navbars_bottom').forEach(function (navbar) {
+ elements_1.push.apply(elements_1, DOM.find(navbar, focusable_1 + ':not(.mm-hidden)'));
+ });
+ focus = elements_1[0];
+ }
+ }
+ // Default.
+ if (!focus) {
+ focus = DOM.children(_this.node.menu, '.mm-tabstart')[0];
+ }
+ if (focus) {
+ focus.focus();
+ }
+ };
+ this.bind('open:finish', setFocus);
+ this.bind('openPanel:finish', setFocus);
+ // Add screenreader / aria support.
+ this.bind('initOpened:after:sr-aria', function () {
+ [_this.node.menu, Mmenu.node.blck].forEach(function (element) {
+ DOM.children(element, '.mm-tabstart, .mm-tabend').forEach(function (tabber) {
+ Mmenu.sr_aria(tabber, 'hidden', true);
+ Mmenu.sr_role(tabber, 'presentation');
+ });
+ });
+ });
+ }
+}
+/**
+ * Initialize the window for keyboard navigation.
+ * @param {boolean} enhance - Whether or not to also rich enhance the keyboard behavior.
+ **/
+var initWindow = function (enhance) {
+ var _this = this;
+ // Re-enable tabbing in general
+ events.off(document.body, 'keydown.tabguard');
+ // Intersept the target when tabbing.
+ events.off(document.body, 'focusin.tabguard');
+ events.on(document.body, 'focusin.tabguard', function (evnt) {
+ if (_this.node.wrpr.matches('.mm-wrapper_opened')) {
+ var target = evnt.target;
+ if (target.matches('.mm-tabend')) {
+ var next = void 0;
+ // Jump from menu to blocker.
+ if (target.parentElement.matches('.mm-menu')) {
+ if (Mmenu.node.blck) {
+ next = Mmenu.node.blck;
+ }
+ }
+ // Jump to opened menu.
+ if (target.parentElement.matches('.mm-wrapper__blocker')) {
+ next = DOM.find(document.body, '.mm-menu_offcanvas.mm-menu_opened')[0];
+ }
+ // If no available element found, stay in current element.
+ if (!next) {
+ next = target.parentElement;
+ }
+ if (next) {
+ DOM.children(next, '.mm-tabstart')[0].focus();
+ }
+ }
+ }
+ });
+ // Add Additional keyboard behavior.
+ events.off(document.body, 'keydown.navigate');
+ events.on(document.body, 'keydown.navigate', function (evnt) {
+ var target = evnt.target;
+ var menu = target.closest('.mm-menu');
+ if (menu) {
+ var api = menu['mmApi'];
+ if (!target.matches('input, textarea')) {
+ switch (evnt.keyCode) {
+ // press enter to toggle and check
+ case 13:
+ if (target.matches('.mm-toggle') ||
+ target.matches('.mm-check')) {
+ target.dispatchEvent(new Event('click'));
+ }
+ break;
+ // prevent spacebar or arrows from scrolling the page
+ case 32: // space
+ case 37: // left
+ case 38: // top
+ case 39: // right
+ case 40: // bottom
+ evnt.preventDefault();
+ break;
+ }
+ }
+ if (enhance) {
+ // special case for input
+ if (target.matches('input')) {
+ switch (evnt.keyCode) {
+ // empty searchfield with esc
+ case 27:
+ target.value = '';
+ break;
+ }
+ }
+ else {
+ var api_1 = menu['mmApi'];
+ switch (evnt.keyCode) {
+ // close submenu with backspace
+ case 8:
+ var parent_1 = DOM.find(menu, '.mm-panel_opened')[0]['mmParent'];
+ if (parent_1) {
+ api_1.openPanel(parent_1.closest('.mm-panel'));
+ }
+ break;
+ // close menu with esc
+ case 27:
+ if (menu.matches('.mm-menu_offcanvas')) {
+ api_1.close();
+ }
+ break;
+ }
+ }
+ }
+ }
+ });
+};
diff --git a/dist/addons/lazysubmenus/_options.js b/dist/addons/lazysubmenus/_options.js
new file mode 100644
index 0000000..7162392
--- /dev/null
+++ b/dist/addons/lazysubmenus/_options.js
@@ -0,0 +1,22 @@
+var options = {
+ load: false
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ load: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/lazysubmenus/mmenu.lazysubmenus.js b/dist/addons/lazysubmenus/mmenu.lazysubmenus.js
new file mode 100644
index 0000000..f2ee908
--- /dev/null
+++ b/dist/addons/lazysubmenus/mmenu.lazysubmenus.js
@@ -0,0 +1,103 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.lazySubmenus = options;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.lazySubmenus);
+ this.opts.lazySubmenus = extend(options, Mmenu.options.lazySubmenus);
+ if (options.load) {
+ // Prevent all sub panels from being initialized.
+ this.bind('initMenu:after', function () {
+ var panels = [];
+ // Find all potential subpanels.
+ DOM.find(_this.node.pnls, 'li').forEach(function (listitem) {
+ panels.push.apply(panels, DOM.children(listitem, _this.conf.panelNodetype.join(', ')));
+ });
+ // Filter out all non-panels and add the lazyload classes
+ panels
+ .filter(function (panel) { return !panel.matches('.mm-listview_inset'); })
+ .filter(function (panel) { return !panel.matches('.mm-nolistview'); })
+ .filter(function (panel) { return !panel.matches('.mm-nopanel'); })
+ .forEach(function (panel) {
+ var classnames = [
+ 'mm-panel_lazysubmenu',
+ 'mm-nolistview',
+ 'mm-nopanel'
+ ];
+ // IE11:
+ classnames.forEach(function (classname) {
+ panel.classList.add(classname);
+ });
+ // Better browsers:
+ // panel.classList.add(...classnames);
+ });
+ });
+ // Prepare current and one level sub panels for initPanels
+ this.bind('initPanels:before', function () {
+ var panels = DOM.children(_this.node.pnls, _this.conf.panelNodetype.join(', '));
+ panels.forEach(function (panel) {
+ var filter = '.mm-panel_lazysubmenu', children = DOM.find(panel, filter);
+ if (panel.matches(filter)) {
+ children.unshift(panel);
+ }
+ children
+ .filter(function (child) {
+ return !child.matches('.mm-panel_lazysubmenu .mm-panel_lazysubmenu');
+ })
+ .forEach(function (child) {
+ var classnames = [
+ 'mm-panel_lazysubmenu',
+ 'mm-nolistview',
+ 'mm-nopanel'
+ ];
+ // IE11:
+ classnames.forEach(function (classname) {
+ child.classList.remove(classname);
+ });
+ // Better browsers:
+ // child.classList.remove(...classnames);
+ });
+ });
+ });
+ // initPanels for the default opened panel
+ this.bind('initOpened:before', function () {
+ var panels = [];
+ DOM.find(_this.node.pnls, '.' + _this.conf.classNames.selected).forEach(function (listitem) {
+ panels.push.apply(panels, DOM.parents(listitem, '.mm-panel_lazysubmenu'));
+ });
+ if (panels.length) {
+ panels.forEach(function (panel) {
+ var classnames = [
+ 'mm-panel_lazysubmenu',
+ 'mm-nolistview',
+ 'mm-nopanel'
+ ];
+ // IE11:
+ classnames.forEach(function (classname) {
+ panel.classList.remove(classname);
+ });
+ // Better browsers:
+ // panel.classList.remove(...classnames);
+ });
+ _this.initPanel(panels[panels.length - 1]);
+ }
+ });
+ // initPanels for current- and sub panels before openPanel
+ this.bind('openPanel:before', function (panel) {
+ var filter = '.mm-panel_lazysubmenu', panels = DOM.find(panel, filter);
+ if (panel.matches(filter)) {
+ panels.unshift(panel);
+ }
+ panels = panels.filter(function (panel) {
+ return !panel.matches('.mm-panel_lazysubmenu .mm-panel_lazysubmenu');
+ });
+ panels.forEach(function (panel) {
+ _this.initPanel(panel);
+ });
+ });
+ }
+}
diff --git a/dist/addons/navbars/_configs.js b/dist/addons/navbars/_configs.js
new file mode 100644
index 0000000..24ecd61
--- /dev/null
+++ b/dist/addons/navbars/_configs.js
@@ -0,0 +1,7 @@
+var configs = {
+ breadcrumbs: {
+ separator: '/',
+ removeFirst: false
+ }
+};
+export default configs;
diff --git a/dist/addons/navbars/_navbar.breadcrumbs.js b/dist/addons/navbars/_navbar.breadcrumbs.js
new file mode 100644
index 0000000..22136e4
--- /dev/null
+++ b/dist/addons/navbars/_navbar.breadcrumbs.js
@@ -0,0 +1,53 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import * as DOM from '../../_modules/dom';
+export default function (navbar) {
+ var _this = this;
+ // Add content
+ var breadcrumbs = DOM.create('div.mm-navbar__breadcrumbs');
+ navbar.append(breadcrumbs);
+ this.bind('initNavbar:after', function (panel) {
+ if (panel.querySelector('.mm-navbar__breadcrumbs')) {
+ return;
+ }
+ DOM.children(panel, '.mm-navbar')[0].classList.add('mm-hidden');
+ var crumbs = [], breadcrumbs = DOM.create('span.mm-navbar__breadcrumbs'), current = panel, first = true;
+ while (current) {
+ current = current.closest('.mm-panel');
+ if (!current.parentElement.matches('.mm-listitem_vertical')) {
+ var title = DOM.find(current, '.mm-navbar__title span')[0];
+ if (title) {
+ var text = title.textContent;
+ if (text.length) {
+ crumbs.unshift(first
+ ? '' + text + ''
+ : '' +
+ text +
+ '');
+ }
+ }
+ first = false;
+ }
+ current = current['mmParent'];
+ }
+ if (_this.conf.navbars.breadcrumbs.removeFirst) {
+ crumbs.shift();
+ }
+ breadcrumbs.innerHTML = crumbs.join('' +
+ _this.conf.navbars.breadcrumbs.separator +
+ '');
+ DOM.children(panel, '.mm-navbar')[0].append(breadcrumbs);
+ });
+ // Update for to opened panel
+ this.bind('openPanel:start', function (panel) {
+ var crumbs = panel.querySelector('.mm-navbar__breadcrumbs');
+ breadcrumbs.innerHTML = crumbs ? crumbs.innerHTML : '';
+ });
+ // Add screenreader / aria support
+ this.bind('initNavbar:after:sr-aria', function (panel) {
+ DOM.find(panel, '.mm-breadcrumbs a').forEach(function (anchor) {
+ Mmenu.sr_aria(anchor, 'owns', anchor.getAttribute('href').slice(1));
+ });
+ });
+}
diff --git a/dist/addons/navbars/_navbar.close.js b/dist/addons/navbars/_navbar.close.js
new file mode 100644
index 0000000..b038bcf
--- /dev/null
+++ b/dist/addons/navbars/_navbar.close.js
@@ -0,0 +1,17 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import * as DOM from '../../_modules/dom';
+export default function (navbar) {
+ var _this = this;
+ // Add content
+ var close = DOM.create('a.mm-btn.mm-btn_close.mm-navbar__btn');
+ navbar.append(close);
+ // Update to page node
+ this.bind('setPage:after', function (page) {
+ close.setAttribute('href', '#' + page.id);
+ });
+ // Add screenreader / text support
+ this.bind('setPage:after:sr-text', function () {
+ close.innerHTML = Mmenu.sr_text(_this.i18n(_this.conf.screenReader.text.closeMenu));
+ Mmenu.sr_aria(close, 'owns', close.getAttribute('href').slice(1));
+ });
+}
diff --git a/dist/addons/navbars/_navbar.next.js b/dist/addons/navbars/_navbar.next.js
new file mode 100644
index 0000000..73bd9d3
--- /dev/null
+++ b/dist/addons/navbars/_navbar.next.js
@@ -0,0 +1,31 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import * as DOM from '../../_modules/dom';
+// DEPRECATED
+// Will be removed in version 8.2
+export default function (navbar) {
+ var _this = this;
+ // Add content
+ var next = DOM.create('a.mm-btn.mm-btn_next.mm-navbar__btn');
+ navbar.append(next);
+ // Update to opened panel
+ var org;
+ var _url, _txt;
+ this.bind('openPanel:start', function (panel) {
+ org = panel.querySelector('.' + _this.conf.classNames.navbars.panelNext);
+ _url = org ? org.getAttribute('href') : '';
+ _txt = org ? org.innerHTML : '';
+ if (_url) {
+ next.setAttribute('href', _url);
+ }
+ else {
+ next.removeAttribute('href');
+ }
+ next.classList[_url || _txt ? 'remove' : 'add']('mm-hidden');
+ next.innerHTML = _txt;
+ });
+ // Add screenreader / aria support
+ this.bind('openPanel:start:sr-aria', function (panel) {
+ Mmenu.sr_aria(next, 'hidden', next.matches('mm-hidden'));
+ Mmenu.sr_aria(next, 'owns', (next.getAttribute('href') || '').slice(1));
+ });
+}
diff --git a/dist/addons/navbars/_navbar.prev.js b/dist/addons/navbars/_navbar.prev.js
new file mode 100644
index 0000000..c8bf5f3
--- /dev/null
+++ b/dist/addons/navbars/_navbar.prev.js
@@ -0,0 +1,41 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import * as DOM from '../../_modules/dom';
+export default function (navbar) {
+ var _this = this;
+ // Add content.
+ var prev = DOM.create('a.mm-btn.mm-btn_prev.mm-navbar__btn');
+ navbar.append(prev);
+ this.bind('initNavbar:after', function (panel) {
+ DOM.children(panel, '.mm-navbar')[0].classList.add('mm-hidden');
+ });
+ // Update to opened panel.
+ var org;
+ var _url, _txt;
+ this.bind('openPanel:start', function (panel) {
+ if (panel.parentElement.matches('.mm-listitem_vertical')) {
+ return;
+ }
+ org = panel.querySelector('.' + _this.conf.classNames.navbars.panelPrev);
+ if (!org) {
+ org = panel.querySelector('.mm-navbar__btn.mm-btn_prev');
+ }
+ _url = org ? org.getAttribute('href') : '';
+ _txt = org ? org.innerHTML : '';
+ if (_url) {
+ prev.setAttribute('href', _url);
+ }
+ else {
+ prev.removeAttribute('href');
+ }
+ prev.classList[_url || _txt ? 'remove' : 'add']('mm-hidden');
+ prev.innerHTML = _txt;
+ });
+ // Add screenreader / aria support
+ this.bind('initNavbar:after:sr-aria', function (panel) {
+ Mmenu.sr_aria(panel.querySelector('.mm-navbar'), 'hidden', true);
+ });
+ this.bind('openPanel:start:sr-aria', function (panel) {
+ Mmenu.sr_aria(prev, 'hidden', prev.matches('.mm-hidden'));
+ Mmenu.sr_aria(prev, 'owns', (prev.getAttribute('href') || '').slice(1));
+ });
+}
diff --git a/dist/addons/navbars/_navbar.searchfield.js b/dist/addons/navbars/_navbar.searchfield.js
new file mode 100644
index 0000000..b9e3d0c
--- /dev/null
+++ b/dist/addons/navbars/_navbar.searchfield.js
@@ -0,0 +1,11 @@
+import * as DOM from '../../_modules/dom';
+import { type } from '../../_modules/helpers';
+export default function (navbar) {
+ if (type(this.opts.searchfield) != 'object') {
+ this.opts.searchfield = {};
+ }
+ var searchfield = DOM.create('div.mm-navbar__searchfield');
+ navbar.append(searchfield);
+ this.opts.searchfield.add = true;
+ this.opts.searchfield.addTo = [searchfield];
+}
diff --git a/dist/addons/navbars/_navbar.tabs.js b/dist/addons/navbars/_navbar.tabs.js
new file mode 100644
index 0000000..a8880d8
--- /dev/null
+++ b/dist/addons/navbars/_navbar.tabs.js
@@ -0,0 +1,40 @@
+import * as DOM from '../../_modules/dom';
+export default function (navbar) {
+ var _this = this;
+ navbar.classList.add('mm-navbar_tabs');
+ navbar.parentElement.classList.add('mm-navbars_has-tabs');
+ var anchors = DOM.children(navbar, 'a');
+ navbar.addEventListener('click', function (evnt) {
+ var anchor = evnt.target;
+ if (!anchor.matches('a')) {
+ return;
+ }
+ if (anchor.matches('.mm-navbar__tab_selected')) {
+ evnt.stopImmediatePropagation();
+ return;
+ }
+ try {
+ _this.openPanel(_this.node.menu.querySelector(anchor.getAttribute('href')), false);
+ evnt.stopImmediatePropagation();
+ }
+ catch (err) { }
+ });
+ function selectTab(panel) {
+ anchors.forEach(function (anchor) {
+ anchor.classList.remove('mm-navbar__tab_selected');
+ });
+ var anchor = anchors.filter(function (anchor) {
+ return anchor.matches('[href="#' + panel.id + '"]');
+ })[0];
+ if (anchor) {
+ anchor.classList.add('mm-navbar__tab_selected');
+ }
+ else {
+ var parent = panel['mmParent'];
+ if (parent) {
+ selectTab.call(this, parent.closest('.mm-panel'));
+ }
+ }
+ }
+ this.bind('openPanel:start', selectTab);
+}
diff --git a/dist/addons/navbars/_navbar.title.js b/dist/addons/navbars/_navbar.title.js
new file mode 100644
index 0000000..f125478
--- /dev/null
+++ b/dist/addons/navbars/_navbar.title.js
@@ -0,0 +1,60 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import * as DOM from '../../_modules/dom';
+export default function (navbar) {
+ var _this = this;
+ // Add content to the navbar.
+ var title = DOM.create('a.mm-navbar__title');
+ var titleText = DOM.create('span');
+ title.append(titleText);
+ navbar.append(title);
+ // Update the title to the opened panel.
+ var _url, _txt;
+ var original;
+ this.bind('openPanel:start', function (panel) {
+ // Do nothing in a vertically expanding panel.
+ if (panel.parentElement.matches('.mm-listitem_vertical')) {
+ return;
+ }
+ // Find the original title in the opened panel.
+ original = panel.querySelector('.' + _this.conf.classNames.navbars.panelTitle);
+ if (!original) {
+ original = panel.querySelector('.mm-navbar__title span');
+ }
+ // Get the URL for the title.
+ _url =
+ original && original.closest('a')
+ ? original.closest('a').getAttribute('href')
+ : '';
+ if (_url) {
+ title.setAttribute('href', _url);
+ }
+ else {
+ title.removeAttribute('href');
+ }
+ // Get the text for the title.
+ _txt = original ? original.innerHTML : '';
+ titleText.innerHTML = _txt;
+ });
+ // Add screenreader / aria support
+ var prev;
+ this.bind('openPanel:start:sr-aria', function (panel) {
+ if (_this.opts.screenReader.text) {
+ if (!prev) {
+ var navbars = DOM.children(_this.node.menu, '.mm-navbars_top, .mm-navbars_bottom');
+ navbars.forEach(function (navbar) {
+ var btn = navbar.querySelector('.mm-btn_prev');
+ if (btn) {
+ prev = btn;
+ }
+ });
+ }
+ if (prev) {
+ var hidden = true;
+ if (_this.opts.navbar.titleLink == 'parent') {
+ hidden = !prev.matches('.mm-hidden');
+ }
+ Mmenu.sr_aria(title, 'hidden', hidden);
+ }
+ }
+ });
+}
diff --git a/dist/addons/navbars/_options.js b/dist/addons/navbars/_options.js
new file mode 100644
index 0000000..a9e6e45
--- /dev/null
+++ b/dist/addons/navbars/_options.js
@@ -0,0 +1,30 @@
+var options = [];
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean' && options) {
+ options = {};
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ if (typeof options.content == 'undefined') {
+ options.content = ['prev', 'title'];
+ }
+ if (!(options.content instanceof Array)) {
+ options.content = [options.content];
+ }
+ if (typeof options.use == 'undefined') {
+ options.use = true;
+ }
+ if (typeof options.use == 'boolean' && options.use) {
+ options.use = true;
+ }
+ return options;
+}
+;
diff --git a/dist/addons/navbars/mmenu.navbars.css b/dist/addons/navbars/mmenu.navbars.css
new file mode 100644
index 0000000..665c2f8
--- /dev/null
+++ b/dist/addons/navbars/mmenu.navbars.css
@@ -0,0 +1 @@
+.mm-navbars_top{-ms-flex-negative:0;flex-shrink:0}.mm-navbars_top .mm-navbar:not(:last-child){border-bottom:none}.mm-navbars_bottom{-ms-flex-negative:0;flex-shrink:0}.mm-navbars_bottom .mm-navbar{border-bottom:none}.mm-navbars_bottom .mm-navbar:first-child{border-top:1px solid rgba(0,0,0,.1);border-top:1px solid var(--mm-color-border)}.mm-btn:not(.mm-hidden)+.mm-navbar__searchfield .mm-searchfield__input{padding-left:0}.mm-navbar__searchfield:not(:last-child) .mm-searchfield__input{padding-right:0}.mm-navbar__breadcrumbs{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;-webkit-box-flex:1;-ms-flex:1 1 50%;flex:1 1 50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:0 20px;overflow-x:auto;-webkit-overflow-scrolling:touch}.mm-navbar__breadcrumbs>*{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-right:6px}.mm-navbar__breadcrumbs>a{text-decoration:underline}.mm-navbar__breadcrumbs:not(:last-child){padding-right:0}.mm-btn:not(.mm-hidden)+.mm-navbar__breadcrumbs{padding-left:0}.mm-navbar_tabs>*{padding:0 10px;border:1px solid transparent}.mm-navbar__tab_selected{background:#f3f3f3;color:rgba(0,0,0,.75);background:var(--mm-color-background);color:var(--mm-color-text)}.mm-navbar__tab_selected:not(:first-child){border-left-color:rgba(0,0,0,.1)}.mm-navbar__tab_selected:not(:last-child){border-right-color:rgba(0,0,0,.1)}.mm-navbar__tab_selected:not(:first-child){border-left-color:var(--mm-color-border)}.mm-navbar__tab_selected:not(:last-child){border-right-color:var(--mm-color-border)}.mm-navbars_top .mm-navbar_tabs{border-bottom:none}.mm-navbars_top .mm-navbar_tabs>*{border-bottom-color:rgba(0,0,0,.1);border-bottom-color:var(--mm-color-border)}.mm-navbars_top .mm-navbar__tab_selected{border-top-color:rgba(0,0,0,.1);border-top-color:var(--mm-color-border);border-bottom-color:transparent}.mm-navbars_top.mm-navbars_has-tabs .mm-navbar{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-navbars_top.mm-navbars_has-tabs .mm-navbar_tabs~.mm-navbar{background:#f3f3f3;background:var(--mm-color-background)}.mm-navbars_bottom .mm-navbar_tabs:first-child{border-top:none}.mm-navbars_bottom .mm-navbar_tabs>*{border-top-color:rgba(0,0,0,.1);border-top-color:var(--mm-color-border)}.mm-navbars_bottom .mm-navbar__tab_selected{border-bottom-color:rgba(0,0,0,.1);border-bottom-color:var(--mm-color-border);border-top-color:transparent}.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar{background:#f3f3f3;background:var(--mm-color-background)}.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar_tabs,.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar_tabs~.mm-navbar{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}
\ No newline at end of file
diff --git a/dist/addons/navbars/mmenu.navbars.js b/dist/addons/navbars/mmenu.navbars.js
new file mode 100644
index 0000000..59fc210
--- /dev/null
+++ b/dist/addons/navbars/mmenu.navbars.js
@@ -0,0 +1,120 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import configs from './_configs';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as media from '../../_modules/matchmedia';
+// Add the options and configs.
+Mmenu.options.navbars = options;
+Mmenu.configs.navbars = configs;
+// Add the classnames.
+Mmenu.configs.classNames.navbars = {
+ panelPrev: 'Prev',
+ panelTitle: 'Title'
+};
+import breadcrumbs from './_navbar.breadcrumbs';
+import close from './_navbar.close';
+import prev from './_navbar.prev';
+import searchfield from './_navbar.searchfield';
+import title from './_navbar.title';
+Navbars.navbarContents = {
+ breadcrumbs: breadcrumbs,
+ close: close,
+ prev: prev,
+ searchfield: searchfield,
+ title: title
+};
+import tabs from './_navbar.tabs';
+Navbars.navbarTypes = {
+ tabs: tabs
+};
+export default function Navbars() {
+ var _this = this;
+ var navs = this.opts.navbars;
+ if (typeof navs == 'undefined') {
+ return;
+ }
+ if (!(navs instanceof Array)) {
+ navs = [navs];
+ }
+ var navbars = {};
+ if (!navs.length) {
+ return;
+ }
+ navs.forEach(function (options) {
+ options = extendShorthandOptions(options);
+ if (!options.use) {
+ return false;
+ }
+ // Create the navbar element.
+ var navbar = DOM.create('div.mm-navbar');
+ // Get the position for the navbar.
+ var position = options.position;
+ // Restrict the position to either "bottom" or "top" (default).
+ if (position !== 'bottom') {
+ position = 'top';
+ }
+ // Create the wrapper for the navbar position.
+ if (!navbars[position]) {
+ navbars[position] = DOM.create('div.mm-navbars_' + position);
+ }
+ navbars[position].append(navbar);
+ // Add content to the navbar.
+ for (var c = 0, l = options.content.length; c < l; c++) {
+ var ctnt = options.content[c];
+ // The content is a string.
+ if (typeof ctnt == 'string') {
+ var func = Navbars.navbarContents[ctnt];
+ // The content refers to one of the navbar-presets ("prev", "title", etc).
+ if (typeof func == 'function') {
+ // Call the preset function.
+ func.call(_this, navbar);
+ // The content is just HTML.
+ }
+ else {
+ // Add the HTML.
+ // Wrap the HTML in a single node
+ var node = DOM.create('span');
+ node.innerHTML = ctnt;
+ // If there was only a single node, use that.
+ var children = DOM.children(node);
+ if (children.length == 1) {
+ node = children[0];
+ }
+ navbar.append(node);
+ }
+ // The content is not a string, it must be an element.
+ }
+ else {
+ navbar.append(ctnt);
+ }
+ }
+ // The type option is set.
+ if (typeof options.type == 'string') {
+ // The function refers to one of the navbar-presets ("tabs").
+ var func = Navbars.navbarTypes[options.type];
+ if (typeof func == 'function') {
+ // Call the preset function.
+ func.call(_this, navbar);
+ }
+ }
+ // En-/disable the navbar.
+ var enable = function () {
+ navbar.classList.remove('mm-hidden');
+ Mmenu.sr_aria(navbar, 'hidden', false);
+ };
+ var disable = function () {
+ navbar.classList.add('mm-hidden');
+ Mmenu.sr_aria(navbar, 'hidden', true);
+ };
+ if (typeof options.use != 'boolean') {
+ media.add(options.use, enable, disable);
+ }
+ });
+ // Add to menu.
+ this.bind('initMenu:after', function () {
+ for (var position in navbars) {
+ _this.node.menu[position == 'bottom' ? 'append' : 'prepend'](navbars[position]);
+ }
+ });
+}
diff --git a/dist/addons/pagescroll/_configs.js b/dist/addons/pagescroll/_configs.js
new file mode 100644
index 0000000..3662db1
--- /dev/null
+++ b/dist/addons/pagescroll/_configs.js
@@ -0,0 +1,5 @@
+var configs = {
+ scrollOffset: 0,
+ updateOffset: 50
+};
+export default configs;
diff --git a/dist/addons/pagescroll/_options.js b/dist/addons/pagescroll/_options.js
new file mode 100644
index 0000000..de3cacb
--- /dev/null
+++ b/dist/addons/pagescroll/_options.js
@@ -0,0 +1,23 @@
+var options = {
+ scroll: false,
+ update: false
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ scroll: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/pagescroll/mmenu.pagescroll.js b/dist/addons/pagescroll/mmenu.pagescroll.js
new file mode 100644
index 0000000..ed60ddd
--- /dev/null
+++ b/dist/addons/pagescroll/mmenu.pagescroll.js
@@ -0,0 +1,111 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import configs from './_configs';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options and configs.
+Mmenu.options.pageScroll = options;
+Mmenu.configs.pageScroll = configs;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.pageScroll);
+ this.opts.pageScroll = extend(options, Mmenu.options.pageScroll);
+ var configs = this.conf.pageScroll;
+ /** The currently "active" section */
+ var section;
+ function scrollTo() {
+ if (section) {
+ // section.scrollIntoView({ behavior: 'smooth' });
+ window.scrollTo({
+ top: section.getBoundingClientRect().top +
+ document.scrollingElement.scrollTop -
+ configs.scrollOffset,
+ behavior: 'smooth'
+ });
+ }
+ section = null;
+ }
+ function anchorInPage(href) {
+ try {
+ if (href != '#' && href.slice(0, 1) == '#') {
+ return Mmenu.node.page.querySelector(href);
+ }
+ return null;
+ }
+ catch (err) {
+ return null;
+ }
+ }
+ // Scroll to section after clicking menu item.
+ if (options.scroll) {
+ this.bind('close:finish', function () {
+ scrollTo();
+ });
+ }
+ // Add click behavior.
+ // Prevents default behavior when clicking an anchor.
+ if (this.opts.offCanvas && options.scroll) {
+ this.clck.push(function (anchor, args) {
+ section = null;
+ // Don't continue if the clicked anchor is not in the menu.
+ if (!args.inMenu) {
+ return;
+ }
+ // Don't continue if the targeted section is not on the page.
+ var href = anchor.getAttribute('href');
+ section = anchorInPage(href);
+ if (!section) {
+ return;
+ }
+ // If the sidebar add-on is "expanded"...
+ if (_this.node.menu.matches('.mm-menu_sidebar-expanded') &&
+ _this.node.wrpr.matches('.mm-wrapper_sidebar-expanded')) {
+ // ... scroll the page to the section.
+ scrollTo();
+ // ... otherwise...
+ }
+ else {
+ // ... close the menu.
+ return {
+ close: true
+ };
+ }
+ });
+ }
+ // Update selected menu item after scrolling.
+ if (options.update) {
+ var scts_1 = [];
+ this.bind('initListview:after', function (listview) {
+ var listitems = DOM.children(listview, '.mm-listitem');
+ DOM.filterLIA(listitems).forEach(function (anchor) {
+ var href = anchor.getAttribute('href');
+ var section = anchorInPage(href);
+ if (section) {
+ scts_1.unshift(section);
+ }
+ });
+ });
+ var _selected_1 = -1;
+ window.addEventListener('scroll', function (evnt) {
+ var scrollTop = window.scrollY;
+ for (var s = 0; s < scts_1.length; s++) {
+ if (scts_1[s].offsetTop < scrollTop + configs.updateOffset) {
+ if (_selected_1 !== s) {
+ _selected_1 = s;
+ var panel = DOM.children(_this.node.pnls, '.mm-panel_opened')[0];
+ var listitems = DOM.find(panel, '.mm-listitem');
+ var anchors = DOM.filterLIA(listitems);
+ anchors = anchors.filter(function (anchor) {
+ return anchor.matches('[href="#' + scts_1[s].id + '"]');
+ });
+ if (anchors.length) {
+ _this.setSelected(anchors[0].parentElement);
+ }
+ }
+ break;
+ }
+ }
+ });
+ }
+}
diff --git a/dist/addons/searchfield/_configs.js b/dist/addons/searchfield/_configs.js
new file mode 100644
index 0000000..3bc4deb
--- /dev/null
+++ b/dist/addons/searchfield/_configs.js
@@ -0,0 +1,7 @@
+var configs = {
+ clear: false,
+ form: false,
+ input: false,
+ submit: false
+};
+export default configs;
diff --git a/dist/addons/searchfield/_options.js b/dist/addons/searchfield/_options.js
new file mode 100644
index 0000000..21e424a
--- /dev/null
+++ b/dist/addons/searchfield/_options.js
@@ -0,0 +1,55 @@
+var options = {
+ add: false,
+ addTo: 'panels',
+ cancel: false,
+ noResults: 'No results found.',
+ placeholder: 'Search',
+ panel: {
+ add: false,
+ dividers: true,
+ fx: 'none',
+ id: null,
+ splash: null,
+ title: 'Search'
+ },
+ search: true,
+ showTextItems: false,
+ showSubPanels: true
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ add: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ if (typeof options.panel == 'boolean') {
+ options.panel = {
+ add: options.panel
+ };
+ }
+ if (typeof options.panel != 'object') {
+ options.panel = {};
+ }
+ // Extend logical options.
+ if (options.addTo == 'panel') {
+ options.panel.add = true;
+ }
+ if (options.panel.add) {
+ options.showSubPanels = false;
+ if (options.panel.splash) {
+ options.cancel = true;
+ }
+ }
+ return options;
+}
+;
diff --git a/dist/addons/searchfield/mmenu.searchfield.css b/dist/addons/searchfield/mmenu.searchfield.css
new file mode 100644
index 0000000..f1ae636
--- /dev/null
+++ b/dist/addons/searchfield/mmenu.searchfield.css
@@ -0,0 +1 @@
+.mm-searchfield{height:44px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:var(--mm-navbar-size);padding:0;overflow:hidden}.mm-searchfield input{height:30.8px;line-height:30.8px}.mm-searchfield input,.mm-searchfield input:focus,.mm-searchfield input:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.75)}.mm-searchfield input{display:block;width:100%;max-width:100%;height:calc(var(--mm-navbar-size) * .7);min-height:unset;max-height:unset;margin:0;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box;border:none!important;border-radius:4px;line-height:calc(var(--mm-navbar-size) * .7);-webkit-box-shadow:none!important;box-shadow:none!important;outline:0!important;font:inherit;font-size:inherit}.mm-searchfield input,.mm-searchfield input:focus,.mm-searchfield input:hover{background:var(--mm-color-background-highlight);color:var(--mm-color-text)}.mm-searchfield input::-ms-clear{display:none}.mm-searchfield__input{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;width:100%;max-width:100%;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.mm-panel__noresultsmsg{color:rgba(0,0,0,.3);padding:50px 0;color:var(--mm-color-text-dimmed);text-align:center;font-size:150%}.mm-searchfield__btn{position:absolute;right:0;top:0;bottom:0}.mm-panel_search{left:0!important;right:0!important;width:100%!important;border-left:none!important}.mm-searchfield__cancel{line-height:44px;display:block;padding-right:10px;margin-right:-100px;line-height:var(--mm-navbar-size);text-decoration:none;-webkit-transition:margin .4s ease;-o-transition:margin .4s ease;transition:margin .4s ease}.mm-searchfield__cancel-active{margin-right:0}.mm-listitem_nosubitems>.mm-listitem__btn{display:none}.mm-listitem_nosubitems>.mm-listitem__text{padding-right:10px}.mm-listitem_onlysubitems>.mm-listitem__text:not(.mm-listitem__btn){z-index:-1;pointer-events:none}
\ No newline at end of file
diff --git a/dist/addons/searchfield/mmenu.searchfield.js b/dist/addons/searchfield/mmenu.searchfield.js
new file mode 100644
index 0000000..7d8b951
--- /dev/null
+++ b/dist/addons/searchfield/mmenu.searchfield.js
@@ -0,0 +1,507 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import configs from './_configs';
+import translate from './translations/translate';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as events from '../../_modules/eventlisteners';
+import { type, extend } from '../../_modules/helpers';
+// Add the translations.
+translate();
+// Add the options and configs.
+Mmenu.options.searchfield = options;
+Mmenu.configs.searchfield = configs;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.searchfield);
+ this.opts.searchfield = extend(options, Mmenu.options.searchfield);
+ var configs = this.conf.searchfield;
+ if (!options.add) {
+ return;
+ }
+ // Blur searchfield
+ this.bind('close:start', function () {
+ DOM.find(_this.node.menu, '.mm-searchfield').forEach(function (input) {
+ input.blur();
+ });
+ });
+ this.bind('initPanel:after', function (panel) {
+ var searchpanel = null;
+ // Add the search panel
+ if (options.panel.add) {
+ searchpanel = initSearchPanel.call(_this);
+ }
+ // Add the searchfield
+ var addTo = null;
+ switch (options.addTo) {
+ case 'panels':
+ addTo = [panel];
+ break;
+ case 'panel':
+ addTo = [searchpanel];
+ break;
+ default:
+ if (typeof options.addTo == 'string') {
+ addTo = DOM.find(_this.node.menu, options.addTo);
+ }
+ else if (type(options.addTo) == 'array') {
+ addTo = options.addTo;
+ }
+ break;
+ }
+ addTo.forEach(function (form) {
+ form = initSearchfield.call(_this, form);
+ if (options.search && form) {
+ initSearching.call(_this, form);
+ }
+ });
+ // Add the no-results message
+ if (options.noResults) {
+ initNoResultsMsg.call(_this, options.panel.add ? searchpanel : panel);
+ }
+ });
+ // Add click behavior.
+ // Prevents default behavior when clicking an anchor
+ this.clck.push(function (anchor, args) {
+ if (args.inMenu) {
+ if (anchor.matches('.mm-searchfield__btn')) {
+ // Clicking the clear button
+ if (anchor.matches('.mm-btn_close')) {
+ var form = anchor.closest('.mm-searchfield'), input = DOM.find(form, 'input')[0];
+ input.value = '';
+ _this.search(input);
+ return true;
+ }
+ // Clicking the submit button
+ if (anchor.matches('.mm-btn_next')) {
+ var form = anchor.closest('form');
+ if (form) {
+ form.submit();
+ }
+ return true;
+ }
+ }
+ }
+ });
+}
+var initSearchPanel = function () {
+ var options = this.opts.searchfield, configs = this.conf.searchfield;
+ var searchpanel = DOM.children(this.node.pnls, '.mm-panel_search')[0];
+ // Only once
+ if (searchpanel) {
+ return searchpanel;
+ }
+ searchpanel = DOM.create('div.mm-panel.mm-panel_search.mm-hidden');
+ if (options.panel.id) {
+ searchpanel.id = options.panel.id;
+ }
+ if (options.panel.title) {
+ searchpanel.setAttribute('data-mm-title', options.panel.title);
+ // searchpanel.dataset.mmTitle = options.panel.title; // IE10 has no dataset :(
+ }
+ var listview = DOM.create('ul');
+ searchpanel.append(listview);
+ this.node.pnls.append(searchpanel);
+ this.initListview(listview);
+ this._initNavbar(searchpanel);
+ switch (options.panel.fx) {
+ case false:
+ break;
+ case 'none':
+ searchpanel.classList.add('mm-panel_noanimation');
+ break;
+ default:
+ searchpanel.classList.add('mm-panel_fx-' + options.panel.fx);
+ break;
+ }
+ // Add splash content
+ if (options.panel.splash) {
+ var splash = DOM.create('div.mm-panel__content');
+ splash.innerHTML = options.panel.splash;
+ searchpanel.append(splash);
+ }
+ searchpanel.classList.add('mm-panel');
+ searchpanel.classList.add('mm-hidden');
+ this.node.pnls.append(searchpanel);
+ return searchpanel;
+};
+var initSearchfield = function (wrapper) {
+ var options = this.opts.searchfield, configs = this.conf.searchfield;
+ // No searchfield in vertical submenus
+ if (wrapper.parentElement.matches('.mm-listitem_vertical')) {
+ return null;
+ }
+ // Only one searchfield per panel
+ var form = DOM.find(wrapper, '.mm-searchfield')[0];
+ if (form) {
+ return form;
+ }
+ function addAttributes(element, attr) {
+ if (attr) {
+ for (var a in attr) {
+ element.setAttribute(a, attr[a]);
+ }
+ }
+ }
+ var form = DOM.create((configs.form ? 'form' : 'div') + '.mm-searchfield'), field = DOM.create('div.mm-searchfield__input'), input = DOM.create('input');
+ input.type = 'text';
+ input.autocomplete = 'off';
+ input.placeholder = this.i18n(options.placeholder);
+ field.append(input);
+ form.append(field);
+ wrapper.prepend(form);
+ // Add attributes to the input
+ addAttributes(input, configs.input);
+ // Add the clear button
+ if (configs.clear) {
+ var anchor = DOM.create('a.mm-btn.mm-btn_close.mm-searchfield__btn');
+ anchor.setAttribute('href', '#');
+ field.append(anchor);
+ }
+ // Add attributes and submit to the form
+ addAttributes(form, configs.form);
+ if (configs.form && configs.submit && !configs.clear) {
+ var anchor = DOM.create('a.mm-btn.mm-btn_next.mm-searchfield__btn');
+ anchor.setAttribute('href', '#');
+ field.append(anchor);
+ }
+ if (options.cancel) {
+ var anchor = DOM.create('a.mm-searchfield__cancel');
+ anchor.setAttribute('href', '#');
+ anchor.textContent = this.i18n('cancel');
+ form.append(anchor);
+ }
+ return form;
+};
+var initSearching = function (form) {
+ var _this = this;
+ var options = this.opts.searchfield, configs = this.conf.searchfield;
+ var data = {};
+ // In the searchpanel.
+ if (form.closest('.mm-panel_search')) {
+ data.panels = DOM.find(this.node.pnls, '.mm-panel');
+ data.noresults = [form.closest('.mm-panel')];
+ // In a panel
+ }
+ else if (form.closest('.mm-panel')) {
+ data.panels = [form.closest('.mm-panel')];
+ data.noresults = data.panels;
+ // Not in a panel, global
+ }
+ else {
+ data.panels = DOM.find(this.node.pnls, '.mm-panel');
+ data.noresults = [this.node.menu];
+ }
+ // Filter out search panel
+ data.panels = data.panels.filter(function (panel) { return !panel.matches('.mm-panel_search'); });
+ // Filter out vertical submenus
+ data.panels = data.panels.filter(function (panel) { return !panel.parentElement.matches('.mm-listitem_vertical'); });
+ // Find listitems and dividers.
+ data.listitems = [];
+ data.dividers = [];
+ data.panels.forEach(function (panel) {
+ var _a, _b;
+ (_a = data.listitems).push.apply(_a, DOM.find(panel, '.mm-listitem'));
+ (_b = data.dividers).push.apply(_b, DOM.find(panel, '.mm-divider'));
+ });
+ var searchpanel = DOM.children(this.node.pnls, '.mm-panel_search')[0], input = DOM.find(form, 'input')[0], cancel = DOM.find(form, '.mm-searchfield__cancel')[0];
+ input['mmSearchfield'] = data;
+ // Open the splash panel when focussing the input.
+ if (options.panel.add && options.panel.splash) {
+ events.off(input, 'focus.splash');
+ events.on(input, 'focus.splash', function (evnt) {
+ _this.openPanel(searchpanel);
+ });
+ }
+ if (options.cancel) {
+ // Show the cancel button when focussing the input.
+ events.off(input, 'focus.cancel');
+ events.on(input, 'focus.cancel', function (evnt) {
+ cancel.classList.add('mm-searchfield__cancel-active');
+ });
+ // Close the splash panel when clicking the cancel button.
+ events.off(cancel, 'click.splash');
+ events.on(cancel, 'click.splash', function (evnt) {
+ evnt.preventDefault();
+ cancel.classList.remove('mm-searchfield__cancel-active');
+ if (searchpanel.matches('.mm-panel_opened')) {
+ var parents = DOM.children(_this.node.pnls, '.mm-panel_opened-parent');
+ if (parents.length) {
+ _this.openPanel(parents[parents.length - 1]);
+ }
+ }
+ });
+ }
+ // Focus the input in the searchpanel when opening the searchpanel.
+ if (options.panel.add && options.addTo == 'panel') {
+ this.bind('openPanel:finish', function (panel) {
+ if (panel === searchpanel) {
+ input.focus();
+ }
+ });
+ }
+ // Search while typing.
+ events.off(input, 'input.search');
+ events.on(input, 'input.search', function (evnt) {
+ switch (evnt.keyCode) {
+ case 9: // tab
+ case 16: // shift
+ case 17: // control
+ case 18: // alt
+ case 37: // left
+ case 38: // top
+ case 39: // right
+ case 40: // bottom
+ break;
+ default:
+ _this.search(input);
+ break;
+ }
+ });
+ // Search initially.
+ this.search(input);
+};
+var initNoResultsMsg = function (wrapper) {
+ if (!wrapper) {
+ return;
+ }
+ var options = this.opts.searchfield, configs = this.conf.searchfield;
+ // Not in a panel
+ if (!wrapper.closest('.mm-panel')) {
+ wrapper = DOM.children(this.node.pnls, '.mm-panel')[0];
+ }
+ // Only once
+ if (DOM.children(wrapper, '.mm-panel__noresultsmsg').length) {
+ return;
+ }
+ // Add no-results message
+ var message = DOM.create('div.mm-panel__noresultsmsg.mm-hidden');
+ message.innerHTML = this.i18n(options.noResults);
+ wrapper.append(message);
+};
+Mmenu.prototype.search = function (input, query) {
+ var _this = this;
+ var _a;
+ var options = this.opts.searchfield, configs = this.conf.searchfield;
+ query = query || '' + input.value;
+ query = query.toLowerCase().trim();
+ var data = input['mmSearchfield'];
+ var form = input.closest('.mm-searchfield'), buttons = DOM.find(form, '.mm-btn'), searchpanel = DOM.children(this.node.pnls, '.mm-panel_search')[0];
+ /** The panels. */
+ var panels = data.panels;
+ /** The "no results" messages in a cloned array. */
+ var noresults = data.noresults;
+ /** The listitems in a cloned array. */
+ var listitems = data.listitems;
+ /** Tje dividers in a cloned array. */
+ var dividers = data.dividers;
+ // Reset previous results
+ listitems.forEach(function (listitem) {
+ listitem.classList.remove('mm-listitem_nosubitems');
+ listitem.classList.remove('mm-listitem_onlysubitems');
+ listitem.classList.remove('mm-hidden');
+ });
+ if (searchpanel) {
+ DOM.children(searchpanel, '.mm-listview')[0].innerHTML = '';
+ }
+ panels.forEach(function (panel) {
+ panel.scrollTop = 0;
+ });
+ // Search
+ if (query.length) {
+ // Initially hide all dividers.
+ dividers.forEach(function (divider) {
+ divider.classList.add('mm-hidden');
+ });
+ // Hide listitems that do not match.
+ listitems.forEach(function (listitem) {
+ var text = DOM.children(listitem, '.mm-listitem__text')[0];
+ var add = false;
+ // The listitem should be shown if:
+ // 1) The text matches the query and
+ // 2a) The text is a open-button and
+ // 2b) the option showSubPanels is set to true.
+ // or 3a) The text is not an anchor and
+ // 3b) the option showTextItems is set to true.
+ // or 4) The text is an anchor.
+ // 1
+ if (text &&
+ DOM.text(text)
+ .toLowerCase()
+ .indexOf(query) > -1) {
+ // 2a
+ if (text.matches('.mm-listitem__btn')) {
+ // 2b
+ if (options.showSubPanels) {
+ add = true;
+ }
+ }
+ // 3a
+ else if (!text.matches('a')) {
+ // 3b
+ if (options.showTextItems) {
+ add = true;
+ }
+ }
+ // 4
+ else {
+ add = true;
+ }
+ }
+ if (!add) {
+ listitem.classList.add('mm-hidden');
+ }
+ });
+ /** Whether or not the query yielded results. */
+ var hasResults = listitems.filter(function (listitem) { return !listitem.matches('.mm-hidden'); }).length;
+ // Show all mached listitems in the search panel
+ if (options.panel.add) {
+ // Clone all matched listitems into the search panel
+ var allitems_1 = [];
+ panels.forEach(function (panel) {
+ var listitems = DOM.filterLI(DOM.find(panel, '.mm-listitem'));
+ listitems = listitems.filter(function (listitem) { return !listitem.matches('.mm-hidden'); });
+ if (listitems.length) {
+ // Add a divider to indicate in what panel the listitems were.
+ if (options.panel.dividers) {
+ var divider = DOM.create('li.mm-divider');
+ var title = DOM.find(panel, '.mm-navbar__title')[0];
+ if (title) {
+ divider.innerHTML = title.innerHTML;
+ allitems_1.push(divider);
+ }
+ }
+ listitems.forEach(function (listitem) {
+ allitems_1.push(listitem.cloneNode(true));
+ });
+ }
+ });
+ // Remove toggles and checks.
+ allitems_1.forEach(function (listitem) {
+ listitem
+ .querySelectorAll('.mm-toggle, .mm-check')
+ .forEach(function (element) {
+ element.remove();
+ });
+ });
+ // Add to the search panel.
+ (_a = DOM.children(searchpanel, '.mm-listview')[0]).append.apply(_a, allitems_1);
+ // Open the search panel.
+ this.openPanel(searchpanel);
+ }
+ else {
+ // Also show listitems in sub-panels for matched listitems
+ if (options.showSubPanels) {
+ panels.forEach(function (panel) {
+ var listitems = DOM.find(panel, '.mm-listitem');
+ DOM.filterLI(listitems).forEach(function (listitem) {
+ var child = listitem['mmChild'];
+ if (child) {
+ DOM.find(child, '.mm-listitem').forEach(function (listitem) {
+ listitem.classList.remove('mm-hidden');
+ });
+ }
+ });
+ });
+ }
+ // Update parent for sub-panel
+ // .reverse() mutates the original array, therefor we "clone" it first using [...panels].
+ panels.slice().reverse().forEach(function (panel, p) {
+ var parent = panel['mmParent'];
+ if (parent) {
+ // The current panel has mached listitems
+ var listitems_1 = DOM.find(panel, '.mm-listitem');
+ if (DOM.filterLI(listitems_1).length) {
+ // Show parent
+ if (parent.matches('.mm-hidden')) {
+ parent.classList.remove('mm-hidden');
+ }
+ parent.classList.add('mm-listitem_onlysubitems');
+ }
+ else if (!input.closest('.mm-panel')) {
+ if (panel.matches('.mm-panel_opened') ||
+ panel.matches('.mm-panel_opened-parent')) {
+ // Compensate the timeout for the opening animation
+ setTimeout(function () {
+ _this.openPanel(parent.closest('.mm-panel'));
+ }, (p + 1) * (_this.conf.openingInterval * 1.5));
+ }
+ parent.classList.add('mm-listitem_nosubitems');
+ }
+ }
+ });
+ // Show parent panels of vertical submenus
+ panels.forEach(function (panel) {
+ var listitems = DOM.find(panel, '.mm-listitem');
+ DOM.filterLI(listitems).forEach(function (listitem) {
+ DOM.parents(listitem, '.mm-listitem_vertical').forEach(function (parent) {
+ if (parent.matches('.mm-hidden')) {
+ parent.classList.remove('mm-hidden');
+ parent.classList.add('mm-listitem_onlysubitems');
+ }
+ });
+ });
+ });
+ // Show first preceeding divider of parent
+ panels.forEach(function (panel) {
+ var listitems = DOM.find(panel, '.mm-listitem');
+ DOM.filterLI(listitems).forEach(function (listitem) {
+ var divider = DOM.prevAll(listitem, '.mm-divider')[0];
+ if (divider) {
+ divider.classList.remove('mm-hidden');
+ }
+ });
+ });
+ }
+ // Show submit / clear button
+ buttons.forEach(function (button) { return button.classList.remove('mm-hidden'); });
+ // Show/hide no results message
+ noresults.forEach(function (wrapper) {
+ DOM.find(wrapper, '.mm-panel__noresultsmsg').forEach(function (message) {
+ return message.classList[hasResults ? 'add' : 'remove']('mm-hidden');
+ });
+ });
+ if (options.panel.add) {
+ // Hide splash
+ if (options.panel.splash) {
+ DOM.find(searchpanel, '.mm-panel__content').forEach(function (splash) {
+ return splash.classList.add('mm-hidden');
+ });
+ }
+ // Re-show original listitems when in search panel
+ listitems.forEach(function (listitem) {
+ return listitem.classList.remove('mm-hidden');
+ });
+ dividers.forEach(function (divider) { return divider.classList.remove('mm-hidden'); });
+ }
+ // Don't search
+ }
+ else {
+ // Show all items
+ listitems.forEach(function (listitem) { return listitem.classList.remove('mm-hidden'); });
+ dividers.forEach(function (divider) { return divider.classList.remove('mm-hidden'); });
+ // Hide submit / clear button
+ buttons.forEach(function (button) { return button.classList.add('mm-hidden'); });
+ // Hide no results message
+ noresults.forEach(function (wrapper) {
+ DOM.find(wrapper, '.mm-panel__noresultsmsg').forEach(function (message) {
+ return message.classList.add('mm-hidden');
+ });
+ });
+ if (options.panel.add) {
+ // Show splash
+ if (options.panel.splash) {
+ DOM.find(searchpanel, '.mm-panel__content').forEach(function (splash) {
+ return splash.classList.remove('mm-hidden');
+ });
+ // Close panel
+ }
+ else if (!input.closest('.mm-panel_search')) {
+ var opened = DOM.children(this.node.pnls, '.mm-panel_opened-parent');
+ this.openPanel(opened.slice(-1)[0]);
+ }
+ }
+ }
+ // Update for other addons
+ this.trigger('updateListview');
+};
diff --git a/dist/addons/searchfield/translations/de.js b/dist/addons/searchfield/translations/de.js
new file mode 100644
index 0000000..64bb721
--- /dev/null
+++ b/dist/addons/searchfield/translations/de.js
@@ -0,0 +1,5 @@
+export default {
+ Search: 'Suche',
+ 'No results found.': 'Keine Ergebnisse gefunden.',
+ cancel: 'beenden'
+};
diff --git a/dist/addons/searchfield/translations/fa.js b/dist/addons/searchfield/translations/fa.js
new file mode 100644
index 0000000..c13a6e0
--- /dev/null
+++ b/dist/addons/searchfield/translations/fa.js
@@ -0,0 +1,5 @@
+export default {
+ Search: 'جستجو',
+ 'No results found.': 'نتیجهای یافت نشد.',
+ cancel: 'انصراف'
+};
diff --git a/dist/addons/searchfield/translations/nl.js b/dist/addons/searchfield/translations/nl.js
new file mode 100644
index 0000000..440ec0e
--- /dev/null
+++ b/dist/addons/searchfield/translations/nl.js
@@ -0,0 +1,5 @@
+export default {
+ Search: 'Zoeken',
+ 'No results found.': 'Geen resultaten gevonden.',
+ cancel: 'annuleren'
+};
diff --git a/dist/addons/searchfield/translations/ru.js b/dist/addons/searchfield/translations/ru.js
new file mode 100644
index 0000000..47438bd
--- /dev/null
+++ b/dist/addons/searchfield/translations/ru.js
@@ -0,0 +1,5 @@
+export default {
+ Search: 'Найти',
+ 'No results found.': 'Ничего не найдено.',
+ cancel: 'отменить'
+};
diff --git a/dist/addons/searchfield/translations/translate.js b/dist/addons/searchfield/translations/translate.js
new file mode 100644
index 0000000..42e19b8
--- /dev/null
+++ b/dist/addons/searchfield/translations/translate.js
@@ -0,0 +1,11 @@
+import { add } from '../../../_modules/i18n';
+import nl from './nl';
+import fa from './fa';
+import de from './de';
+import ru from './ru';
+export default function () {
+ add(nl, 'nl');
+ add(fa, 'fa');
+ add(de, 'de');
+ add(ru, 'ru');
+}
diff --git a/dist/addons/sectionindexer/_options.js b/dist/addons/sectionindexer/_options.js
new file mode 100644
index 0000000..2cd82c0
--- /dev/null
+++ b/dist/addons/sectionindexer/_options.js
@@ -0,0 +1,23 @@
+var options = {
+ add: false,
+ addTo: 'panels'
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ add: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/sectionindexer/mmenu.sectionindexer.css b/dist/addons/sectionindexer/mmenu.sectionindexer.css
new file mode 100644
index 0000000..c4a7a92
--- /dev/null
+++ b/dist/addons/sectionindexer/mmenu.sectionindexer.css
@@ -0,0 +1 @@
+.mm-sectionindexer{background:inherit;text-align:center;font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box;width:20px;position:absolute;top:0;bottom:0;right:-20px;z-index:5;-webkit-transition:right .4s ease;-o-transition:right .4s ease;transition:right .4s ease;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly}.mm-sectionindexer a{color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed);line-height:1;text-decoration:none;display:block}.mm-sectionindexer~.mm-panel{padding-right:0}.mm-sectionindexer_active{right:0}.mm-sectionindexer_active~.mm-panel{padding-right:20px}
\ No newline at end of file
diff --git a/dist/addons/sectionindexer/mmenu.sectionindexer.js b/dist/addons/sectionindexer/mmenu.sectionindexer.js
new file mode 100644
index 0000000..71f1937
--- /dev/null
+++ b/dist/addons/sectionindexer/mmenu.sectionindexer.js
@@ -0,0 +1,70 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as support from '../../_modules/support';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.sectionIndexer = options;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.sectionIndexer);
+ this.opts.sectionIndexer = extend(options, Mmenu.options.sectionIndexer);
+ if (!options.add) {
+ return;
+ }
+ this.bind('initPanels:after', function () {
+ // Add the indexer, only if it does not allready excists
+ if (!_this.node.indx) {
+ var buttons_1 = '';
+ 'abcdefghijklmnopqrstuvwxyz'.split('').forEach(function (letter) {
+ buttons_1 += '' + letter + '';
+ });
+ var indexer = DOM.create('div.mm-sectionindexer');
+ indexer.innerHTML = buttons_1;
+ _this.node.pnls.prepend(indexer);
+ _this.node.indx = indexer;
+ // Prevent default behavior when clicking an anchor
+ _this.node.indx.addEventListener('click', function (evnt) {
+ var anchor = evnt.target;
+ if (anchor.matches('a')) {
+ evnt.preventDefault();
+ }
+ });
+ // Scroll onMouseOver / onTouchStart
+ var mouseOverEvent = function (evnt) {
+ if (!evnt.target.matches('a')) {
+ return;
+ }
+ var letter = evnt.target.textContent, panel = DOM.children(_this.node.pnls, '.mm-panel_opened')[0];
+ var newTop = -1, oldTop = panel.scrollTop;
+ panel.scrollTop = 0;
+ DOM.find(panel, '.mm-divider')
+ .filter(function (divider) { return !divider.matches('.mm-hidden'); })
+ .forEach(function (divider) {
+ if (newTop < 0 &&
+ letter ==
+ divider.textContent
+ .trim()
+ .slice(0, 1)
+ .toLowerCase()) {
+ newTop = divider.offsetTop;
+ }
+ });
+ panel.scrollTop = newTop > -1 ? newTop : oldTop;
+ };
+ if (support.touch) {
+ _this.node.indx.addEventListener('touchstart', mouseOverEvent);
+ _this.node.indx.addEventListener('touchmove', mouseOverEvent);
+ }
+ else {
+ _this.node.indx.addEventListener('mouseover', mouseOverEvent);
+ }
+ }
+ // Show or hide the indexer
+ _this.bind('openPanel:start', function (panel) {
+ var active = DOM.find(panel, '.mm-divider').filter(function (divider) { return !divider.matches('.mm-hidden'); }).length;
+ _this.node.indx.classList[active ? 'add' : 'remove']('mm-sectionindexer_active');
+ });
+ });
+}
diff --git a/dist/addons/setselected/_options.js b/dist/addons/setselected/_options.js
new file mode 100644
index 0000000..2fe3937
--- /dev/null
+++ b/dist/addons/setselected/_options.js
@@ -0,0 +1,25 @@
+var options = {
+ current: true,
+ hover: false,
+ parent: false
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ hover: options,
+ parent: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/addons/setselected/mmenu.setselected.css b/dist/addons/setselected/mmenu.setselected.css
new file mode 100644
index 0000000..ba0c57f
--- /dev/null
+++ b/dist/addons/setselected/mmenu.setselected.css
@@ -0,0 +1 @@
+.mm-menu_selected-hover .mm-listitem__btn,.mm-menu_selected-hover .mm-listitem__text,.mm-menu_selected-parent .mm-listitem__btn,.mm-menu_selected-parent .mm-listitem__text{-webkit-transition:background-color .4s ease;-o-transition:background-color .4s ease;transition:background-color .4s ease}.mm-menu_selected-hover .mm-listview:hover>.mm-listitem_selected>.mm-listitem__text{background:0 0}.mm-menu_selected-hover .mm-listitem__btn:hover,.mm-menu_selected-hover .mm-listitem__text:hover{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-menu_selected-parent .mm-panel_opened-parent .mm-listitem:not(.mm-listitem_selected-parent)>.mm-listitem__text{background:0 0}.mm-menu_selected-parent .mm-listitem_selected-parent>.mm-listitem__btn,.mm-menu_selected-parent .mm-listitem_selected-parent>.mm-listitem__text{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}
\ No newline at end of file
diff --git a/dist/addons/setselected/mmenu.setselected.js b/dist/addons/setselected/mmenu.setselected.js
new file mode 100644
index 0000000..eb82c90
--- /dev/null
+++ b/dist/addons/setselected/mmenu.setselected.js
@@ -0,0 +1,66 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.setSelected = options;
+export default function () {
+ var _this = this;
+ var options = extendShorthandOptions(this.opts.setSelected);
+ this.opts.setSelected = extend(options, Mmenu.options.setSelected);
+ // Find current by URL
+ if (options.current == 'detect') {
+ var findCurrent_1 = function (url) {
+ url = url.split('?')[0].split('#')[0];
+ var anchor = _this.node.menu.querySelector('a[href="' + url + '"], a[href="' + url + '/"]');
+ if (anchor) {
+ _this.setSelected(anchor.parentElement);
+ }
+ else {
+ var arr = url.split('/').slice(0, -1);
+ if (arr.length) {
+ findCurrent_1(arr.join('/'));
+ }
+ }
+ };
+ this.bind('initMenu:after', function () {
+ findCurrent_1.call(_this, window.location.href);
+ });
+ // Remove current selected item
+ }
+ else if (!options.current) {
+ this.bind('initListview:after', function (listview) {
+ DOM.children(listview, '.mm-listitem_selected').forEach(function (listitem) {
+ listitem.classList.remove('mm-listitem_selected');
+ });
+ });
+ }
+ // Add :hover effect on items
+ if (options.hover) {
+ this.bind('initMenu:after', function () {
+ _this.node.menu.classList.add('mm-menu_selected-hover');
+ });
+ }
+ // Set parent item selected for submenus
+ if (options.parent) {
+ this.bind('openPanel:finish', function (panel) {
+ // Remove all
+ DOM.find(_this.node.pnls, '.mm-listitem_selected-parent').forEach(function (listitem) {
+ listitem.classList.remove('mm-listitem_selected-parent');
+ });
+ // Move up the DOM tree
+ var parent = panel['mmParent'];
+ while (parent) {
+ if (!parent.matches('.mm-listitem_vertical')) {
+ parent.classList.add('mm-listitem_selected-parent');
+ }
+ parent = parent.closest('.mm-panel');
+ parent = parent['mmParent'];
+ }
+ });
+ this.bind('initMenu:after', function () {
+ _this.node.menu.classList.add('mm-menu_selected-parent');
+ });
+ }
+}
diff --git a/dist/addons/sidebar/_options.js b/dist/addons/sidebar/_options.js
new file mode 100644
index 0000000..f45f9d7
--- /dev/null
+++ b/dist/addons/sidebar/_options.js
@@ -0,0 +1,62 @@
+var options = {
+ collapsed: {
+ use: false,
+ blockMenu: true,
+ hideDivider: false,
+ hideNavbar: true
+ },
+ expanded: {
+ use: false,
+ initial: 'open'
+ }
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'string' ||
+ (typeof options == 'boolean' && options) ||
+ typeof options == 'number') {
+ options = {
+ expanded: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ // Extend collapsed shorthand options.
+ if (typeof options.collapsed == 'boolean' && options.collapsed) {
+ options.collapsed = {
+ use: true
+ };
+ }
+ if (typeof options.collapsed == 'string' ||
+ typeof options.collapsed == 'number') {
+ options.collapsed = {
+ use: options.collapsed
+ };
+ }
+ if (typeof options.collapsed != 'object') {
+ options.collapsed = {};
+ }
+ // Extend expanded shorthand options.
+ if (typeof options.expanded == 'boolean' && options.expanded) {
+ options.expanded = {
+ use: true
+ };
+ }
+ if (typeof options.expanded == 'string' ||
+ typeof options.expanded == 'number') {
+ options.expanded = {
+ use: options.expanded
+ };
+ }
+ if (typeof options.expanded != 'object') {
+ options.expanded = {};
+ }
+ return options;
+}
diff --git a/dist/addons/sidebar/mmenu.sidebar.css b/dist/addons/sidebar/mmenu.sidebar.css
new file mode 100644
index 0000000..550ae42
--- /dev/null
+++ b/dist/addons/sidebar/mmenu.sidebar.css
@@ -0,0 +1 @@
+:root{--mm-sidebar-collapsed-size:50px;--mm-sidebar-expanded-size:440px}.mm-wrapper_sidebar-collapsed body,.mm-wrapper_sidebar-expanded body{position:relative}.mm-wrapper_sidebar-collapsed .mm-slideout,.mm-wrapper_sidebar-expanded .mm-slideout{-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:width,transform;transition-property:width,transform;transition-property:width,transform,-webkit-transform}.mm-wrapper_sidebar-collapsed .mm-page,.mm-wrapper_sidebar-expanded .mm-page{background:inherit;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:100vh}.mm-wrapper_sidebar-collapsed .mm-menu_sidebar-collapsed,.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;top:0!important;right:auto!important;bottom:0!important;left:0!important}.mm-wrapper_sidebar-collapsed .mm-slideout{width:calc(100% - 50px);-webkit-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0);width:calc(100% - var(--mm-sidebar-collapsed-size));-webkit-transform:translate3d(var(--mm-sidebar-collapsed-size),0,0);transform:translate3d(var(--mm-sidebar-collapsed-size),0,0)}.mm-wrapper_sidebar-collapsed:not(.mm-wrapper_opening) .mm-menu_hidedivider .mm-divider,.mm-wrapper_sidebar-collapsed:not(.mm-wrapper_opening) .mm-menu_hidenavbar .mm-navbar{opacity:0}.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded{width:440px;width:var(--mm-sidebar-expanded-size);min-width:0!important;max-width:100000px!important;border-right-width:1px;border-right-style:solid}.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded.mm-menu_pageshadow:after{content:none;display:none}.mm-wrapper_sidebar-expanded.mm-wrapper_blocking,.mm-wrapper_sidebar-expanded.mm-wrapper_blocking body{overflow:visible}.mm-wrapper_sidebar-expanded .mm-wrapper__blocker{display:none!important}.mm-wrapper_sidebar-expanded:not(.mm-wrapper_sidebar-closed) .mm-menu_sidebar-expanded.mm-menu_opened~.mm-slideout{width:calc(100% - 440px);-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0);width:calc(100% - var(--mm-sidebar-expanded-size));-webkit-transform:translate3d(var(--mm-sidebar-expanded-size),0,0);transform:translate3d(var(--mm-sidebar-expanded-size),0,0)}.mm-menu__blocker{background:rgba(3,2,1,0);display:block;position:absolute;top:0;right:0;bottom:0;left:0;z-index:3}.mm-menu_opened .mm-menu__blocker{display:none}[dir=rtl].mm-wrapper_sidebar-collapsed .mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[dir=rtl].mm-wrapper_sidebar-expanded .mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[dir=rtl].mm-wrapper_sidebar-expanded:not(.mm-wrapper_sidebar-closed) .mm-menu_sidebar-expanded.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}
\ No newline at end of file
diff --git a/dist/addons/sidebar/mmenu.sidebar.js b/dist/addons/sidebar/mmenu.sidebar.js
new file mode 100644
index 0000000..45ad4bc
--- /dev/null
+++ b/dist/addons/sidebar/mmenu.sidebar.js
@@ -0,0 +1,117 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as media from '../../_modules/matchmedia';
+import { extend } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.sidebar = options;
+export default function () {
+ var _this = this;
+ if (!this.opts.offCanvas) {
+ return;
+ }
+ var options = extendShorthandOptions(this.opts.sidebar);
+ this.opts.sidebar = extend(options, Mmenu.options.sidebar);
+ // Collapsed
+ if (options.collapsed.use) {
+ // Make the menu collapsable.
+ this.bind('initMenu:after', function () {
+ _this.node.menu.classList.add('mm-menu_sidebar-collapsed');
+ if (options.collapsed.blockMenu &&
+ _this.opts.offCanvas &&
+ !DOM.children(_this.node.menu, '.mm-menu__blocker')[0]) {
+ var anchor = DOM.create('a.mm-menu__blocker');
+ anchor.setAttribute('href', '#' + _this.node.menu.id);
+ _this.node.menu.prepend(anchor);
+ }
+ if (options.collapsed.hideNavbar) {
+ _this.node.menu.classList.add('mm-menu_hidenavbar');
+ }
+ if (options.collapsed.hideDivider) {
+ _this.node.menu.classList.add('mm-menu_hidedivider');
+ }
+ });
+ // En-/disable the collapsed sidebar.
+ var enable = function () {
+ _this.node.wrpr.classList.add('mm-wrapper_sidebar-collapsed');
+ };
+ var disable = function () {
+ _this.node.wrpr.classList.remove('mm-wrapper_sidebar-collapsed');
+ };
+ if (typeof options.collapsed.use == 'boolean') {
+ this.bind('initMenu:after', enable);
+ }
+ else {
+ media.add(options.collapsed.use, enable, disable);
+ }
+ }
+ // Expanded
+ if (options.expanded.use) {
+ // Make the menu expandable
+ this.bind('initMenu:after', function () {
+ _this.node.menu.classList.add('mm-menu_sidebar-expanded');
+ });
+ // En-/disable the expanded sidebar.
+ var enable = function () {
+ _this.node.wrpr.classList.add('mm-wrapper_sidebar-expanded');
+ if (!_this.node.wrpr.matches('.mm-wrapper_sidebar-closed')) {
+ _this.open();
+ }
+ };
+ var disable = function () {
+ _this.node.wrpr.classList.remove('mm-wrapper_sidebar-expanded');
+ _this.close();
+ };
+ if (typeof options.expanded.use == 'boolean') {
+ this.bind('initMenu:after', enable);
+ }
+ else {
+ media.add(options.expanded.use, enable, disable);
+ }
+ // Manually en-/disable the expanded sidebar (open / close the menu)
+ this.bind('close:start', function () {
+ if (_this.node.wrpr.matches('.mm-wrapper_sidebar-expanded')) {
+ _this.node.wrpr.classList.add('mm-wrapper_sidebar-closed');
+ if (options.expanded.initial == 'remember') {
+ window.localStorage.setItem('mmenuExpandedState', 'closed');
+ }
+ }
+ });
+ this.bind('open:start', function () {
+ if (_this.node.wrpr.matches('.mm-wrapper_sidebar-expanded')) {
+ _this.node.wrpr.classList.remove('mm-wrapper_sidebar-closed');
+ if (options.expanded.initial == 'remember') {
+ window.localStorage.setItem('mmenuExpandedState', 'open');
+ }
+ }
+ });
+ // Set the initial state
+ var initialState = options.expanded.initial;
+ if (options.expanded.initial == 'remember') {
+ var state = window.localStorage.getItem('mmenuExpandedState');
+ switch (state) {
+ case 'open':
+ case 'closed':
+ initialState = state;
+ break;
+ }
+ }
+ if (initialState == 'closed') {
+ this.bind('initMenu:after', function () {
+ _this.node.wrpr.classList.add('mm-wrapper_sidebar-closed');
+ });
+ }
+ // Add click behavior.
+ // Prevents default behavior when clicking an anchor
+ this.clck.push(function (anchor, args) {
+ if (args.inMenu && args.inListview) {
+ if (_this.node.wrpr.matches('.mm-wrapper_sidebar-expanded')) {
+ return {
+ close: options.expanded.initial == 'closed'
+ };
+ }
+ }
+ });
+ }
+}
diff --git a/dist/addons/toggles/mmenu.toggles.css b/dist/addons/toggles/mmenu.toggles.css
new file mode 100644
index 0000000..3d647cf
--- /dev/null
+++ b/dist/addons/toggles/mmenu.toggles.css
@@ -0,0 +1 @@
+input.mm-toggle{margin-top:5px;background:rgba(0,0,0,.1);display:inline-block;min-width:58px;width:58px;height:34px;margin:0 10px;margin-top:calc((var(--mm-listitem-size) - 34px)/ 2);border:none!important;background:var(--mm-color-border);border-radius:34px;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;cursor:pointer;-webkit-transition:background-color .2s ease;-o-transition:background-color .2s ease;transition:background-color .2s ease}input.mm-toggle:before{background:#f3f3f3}input.mm-toggle:before{content:'';display:block;width:32px;height:32px;margin:1px;border-radius:34px;background:var(--mm-color-background);-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;-o-transition:transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}input.mm-toggle:checked{background:#4bd963}input.mm-toggle:checked:before{-webkit-transform:translateX(24px);-ms-transform:translateX(24px);transform:translateX(24px)}input.mm-check{margin-top:2px;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;border:none!important;background:0 0!important;cursor:pointer;display:inline-block;width:40px;height:40px;margin:0 10px;margin-top:calc((var(--mm-listitem-size) - 40px)/ 2)}input.mm-check:before{content:'';display:block;width:40%;height:20%;margin:25% 0 0 20%;border-left:3px solid;border-bottom:3px solid;border-color:var(--mm-color-text);opacity:.3;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease}input.mm-check:checked:before{opacity:1}[dir=rtl] input.mm-toggle:checked~label.mm-toggle:before{float:left}
\ No newline at end of file
diff --git a/dist/addons/toggles/mmenu.toggles.js b/dist/addons/toggles/mmenu.toggles.js
new file mode 100644
index 0000000..03cb52b
--- /dev/null
+++ b/dist/addons/toggles/mmenu.toggles.js
@@ -0,0 +1,17 @@
+import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
+import * as DOM from '../../_modules/dom';
+// Add the classnames.
+Mmenu.configs.classNames.toggles = {
+ toggle: 'Toggle',
+ check: 'Check'
+};
+export default function () {
+ var _this = this;
+ this.bind('initPanel:after', function (panel) {
+ // Refactor toggle classes
+ DOM.find(panel, 'input').forEach(function (input) {
+ DOM.reClass(input, _this.conf.classNames.toggles.toggle, 'mm-toggle');
+ DOM.reClass(input, _this.conf.classNames.toggles.check, 'mm-check');
+ });
+ });
+}
diff --git a/dist/core/offcanvas/_configs.js b/dist/core/offcanvas/_configs.js
new file mode 100644
index 0000000..7e4e965
--- /dev/null
+++ b/dist/core/offcanvas/_configs.js
@@ -0,0 +1,13 @@
+var configs = {
+ clone: false,
+ menu: {
+ insertMethod: 'prepend',
+ insertSelector: 'body'
+ },
+ page: {
+ nodetype: 'div',
+ selector: null,
+ noSelector: []
+ }
+};
+export default configs;
diff --git a/dist/core/offcanvas/_options.js b/dist/core/offcanvas/_options.js
new file mode 100644
index 0000000..1212cff
--- /dev/null
+++ b/dist/core/offcanvas/_options.js
@@ -0,0 +1,18 @@
+var options = {
+ blockUI: true,
+ moveBackground: true
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/core/offcanvas/mmenu.offcanvas.css b/dist/core/offcanvas/mmenu.offcanvas.css
new file mode 100644
index 0000000..791bb7f
--- /dev/null
+++ b/dist/core/offcanvas/mmenu.offcanvas.css
@@ -0,0 +1 @@
+.mm-page{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.mm-slideout{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease;z-index:1}.mm-wrapper_opened{overflow-x:hidden;position:relative}.mm-wrapper_opened .mm-page{min-height:100vh}.mm-wrapper_background .mm-page{background:inherit}.mm-menu_offcanvas{position:fixed;right:auto;z-index:0}.mm-menu_offcanvas:not(.mm-menu_opened){display:none}.mm-menu_offcanvas{width:80%;min-width:240px;max-width:440px}.mm-wrapper_opening .mm-menu_offcanvas~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_offcanvas~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_offcanvas~.mm-slideout{-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0)}}.mm-wrapper__blocker{background:rgba(3,2,1,0);overflow:hidden;display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2}.mm-wrapper_blocking{overflow:hidden}.mm-wrapper_blocking body{overflow:hidden}.mm-wrapper_blocking .mm-wrapper__blocker{display:block}
\ No newline at end of file
diff --git a/dist/core/offcanvas/mmenu.offcanvas.js b/dist/core/offcanvas/mmenu.offcanvas.js
new file mode 100644
index 0000000..4fdc508
--- /dev/null
+++ b/dist/core/offcanvas/mmenu.offcanvas.js
@@ -0,0 +1,331 @@
+import Mmenu from './../oncanvas/mmenu.oncanvas';
+import options from './_options';
+import configs from './_configs';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as events from '../../_modules/eventlisteners';
+import { extend, transitionend, uniqueId, originalId } from '../../_modules/helpers';
+// Add the options and configs.
+Mmenu.options.offCanvas = options;
+Mmenu.configs.offCanvas = configs;
+export default function () {
+ var _this = this;
+ if (!this.opts.offCanvas) {
+ return;
+ }
+ var options = extendShorthandOptions(this.opts.offCanvas);
+ this.opts.offCanvas = extend(options, Mmenu.options.offCanvas);
+ var configs = this.conf.offCanvas;
+ // Add methods to the API.
+ this._api.push('open', 'close', 'setPage');
+ // Setup the menu.
+ this.vars.opened = false;
+ // Add off-canvas behavior.
+ this.bind('initMenu:before', function () {
+ // Clone if needed.
+ if (configs.clone) {
+ // Clone the original menu and store it.
+ _this.node.menu = _this.node.menu.cloneNode(true);
+ // Prefix all ID's in the cloned menu.
+ if (_this.node.menu.id) {
+ _this.node.menu.id = 'mm-' + _this.node.menu.id;
+ }
+ DOM.find(_this.node.menu, '[id]').forEach(function (elem) {
+ elem.id = 'mm-' + elem.id;
+ });
+ }
+ _this.node.wrpr = document.body;
+ // Prepend to the
+ document
+ .querySelector(configs.menu.insertSelector)[configs.menu.insertMethod](_this.node.menu);
+ });
+ this.bind('initMenu:after', function () {
+ // Setup the UI blocker.
+ initBlocker.call(_this);
+ // Setup the page.
+ _this.setPage(Mmenu.node.page);
+ // Setup window events.
+ initWindow.call(_this);
+ // Setup the menu.
+ _this.node.menu.classList.add('mm-menu_offcanvas');
+ // Open if url hash equals menu id (usefull when user clicks the hamburger icon before the menu is created)
+ var hash = window.location.hash;
+ if (hash) {
+ var id = originalId(_this.node.menu.id);
+ if (id && id == hash.slice(1)) {
+ setTimeout(function () {
+ _this.open();
+ }, 1000);
+ }
+ }
+ });
+ // Sync the blocker to target the page.
+ this.bind('setPage:after', function (page) {
+ if (Mmenu.node.blck) {
+ DOM.children(Mmenu.node.blck, 'a').forEach(function (anchor) {
+ anchor.setAttribute('href', '#' + page.id);
+ });
+ }
+ });
+ // Add screenreader / aria support
+ this.bind('open:start:sr-aria', function () {
+ Mmenu.sr_aria(_this.node.menu, 'hidden', false);
+ });
+ this.bind('close:finish:sr-aria', function () {
+ Mmenu.sr_aria(_this.node.menu, 'hidden', true);
+ });
+ this.bind('initMenu:after:sr-aria', function () {
+ Mmenu.sr_aria(_this.node.menu, 'hidden', true);
+ });
+ // Add screenreader / text support
+ this.bind('initBlocker:after:sr-text', function () {
+ DOM.children(Mmenu.node.blck, 'a').forEach(function (anchor) {
+ anchor.innerHTML = Mmenu.sr_text(_this.i18n(_this.conf.screenReader.text.closeMenu));
+ });
+ });
+ // Add click behavior.
+ // Prevents default behavior when clicking an anchor
+ this.clck.push(function (anchor, args) {
+ // Open menu if the clicked anchor links to the menu
+ var id = originalId(_this.node.menu.id);
+ if (id) {
+ if (anchor.matches('[href="#' + id + '"]')) {
+ // Opening this menu from within this menu
+ // -> Open menu
+ if (args.inMenu) {
+ _this.open();
+ return true;
+ }
+ // Opening this menu from within a second menu
+ // -> Close the second menu before opening this menu
+ var menu = anchor.closest('.mm-menu');
+ if (menu) {
+ var api = menu['mmApi'];
+ if (api && api.close) {
+ api.close();
+ transitionend(menu, function () {
+ _this.open();
+ }, _this.conf.transitionDuration);
+ return true;
+ }
+ }
+ // Opening this menu
+ _this.open();
+ return true;
+ }
+ }
+ // Close menu
+ id = Mmenu.node.page.id;
+ if (id) {
+ if (anchor.matches('[href="#' + id + '"]')) {
+ _this.close();
+ return true;
+ }
+ }
+ return;
+ });
+}
+/**
+ * Open the menu.
+ */
+Mmenu.prototype.open = function () {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('open:before');
+ if (this.vars.opened) {
+ return;
+ }
+ this._openSetup();
+ // Without the timeout, the animation won't work because the menu had display: none;
+ setTimeout(function () {
+ _this._openStart();
+ }, this.conf.openingInterval);
+ // Invoke "after" hook.
+ this.trigger('open:after');
+};
+Mmenu.prototype._openSetup = function () {
+ var _this = this;
+ var options = this.opts.offCanvas;
+ // Close other menus
+ this.closeAllOthers();
+ // Store style and position
+ Mmenu.node.page['mmStyle'] = Mmenu.node.page.getAttribute('style') || '';
+ // Trigger window-resize to measure height
+ events.trigger(window, 'resize.page', { force: true });
+ var clsn = ['mm-wrapper_opened'];
+ // Add options
+ if (options.blockUI) {
+ clsn.push('mm-wrapper_blocking');
+ }
+ if (options.blockUI == 'modal') {
+ clsn.push('mm-wrapper_modal');
+ }
+ if (options.moveBackground) {
+ clsn.push('mm-wrapper_background');
+ }
+ // IE11:
+ clsn.forEach(function (classname) {
+ _this.node.wrpr.classList.add(classname);
+ });
+ // Better browsers:
+ // this.node.wrpr.classList.add(...clsn);
+ // Open
+ // Without the timeout, the animation won't work because the menu had display: none;
+ setTimeout(function () {
+ _this.vars.opened = true;
+ }, this.conf.openingInterval);
+ this.node.menu.classList.add('mm-menu_opened');
+};
+/**
+ * Finish opening the menu.
+ */
+Mmenu.prototype._openStart = function () {
+ var _this = this;
+ // Callback when the page finishes opening.
+ transitionend(Mmenu.node.page, function () {
+ _this.trigger('open:finish');
+ }, this.conf.transitionDuration);
+ // Opening
+ this.trigger('open:start');
+ this.node.wrpr.classList.add('mm-wrapper_opening');
+};
+Mmenu.prototype.close = function () {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('close:before');
+ if (!this.vars.opened) {
+ return;
+ }
+ // Callback when the page finishes closing.
+ transitionend(Mmenu.node.page, function () {
+ _this.node.menu.classList.remove('mm-menu_opened');
+ var classnames = [
+ 'mm-wrapper_opened',
+ 'mm-wrapper_blocking',
+ 'mm-wrapper_modal',
+ 'mm-wrapper_background'
+ ];
+ // IE11:
+ classnames.forEach(function (classname) {
+ _this.node.wrpr.classList.remove(classname);
+ });
+ // Better browsers:
+ // this.node.wrpr.classList.remove(...classnames);
+ // Restore style and position
+ Mmenu.node.page.setAttribute('style', Mmenu.node.page['mmStyle']);
+ _this.vars.opened = false;
+ _this.trigger('close:finish');
+ }, this.conf.transitionDuration);
+ // Closing
+ this.trigger('close:start');
+ this.node.wrpr.classList.remove('mm-wrapper_opening');
+ // Invoke "after" hook.
+ this.trigger('close:after');
+};
+/**
+ * Close all other menus.
+ */
+Mmenu.prototype.closeAllOthers = function () {
+ var _this = this;
+ DOM.find(document.body, '.mm-menu_offcanvas').forEach(function (menu) {
+ if (menu !== _this.node.menu) {
+ var api = menu['mmApi'];
+ if (api && api.close) {
+ api.close();
+ }
+ }
+ });
+};
+/**
+ * Set the "page" node.
+ *
+ * @param {HTMLElement} page Element to set as the page.
+ */
+Mmenu.prototype.setPage = function (page) {
+ // Invoke "before" hook.
+ this.trigger('setPage:before', [page]);
+ var configs = this.conf.offCanvas;
+ // If no page was specified, find it.
+ if (!page) {
+ /** Array of elements that are / could be "the page". */
+ var pages = typeof configs.page.selector == 'string'
+ ? DOM.find(document.body, configs.page.selector)
+ : DOM.children(document.body, configs.page.nodetype);
+ // Filter out elements that are absolutely not "the page".
+ pages = pages.filter(function (page) { return !page.matches('.mm-menu, .mm-wrapper__blocker'); });
+ // Filter out elements that are configured to not be "the page".
+ if (configs.page.noSelector.length) {
+ pages = pages.filter(function (page) { return !page.matches(configs.page.noSelector.join(', ')); });
+ }
+ // Wrap multiple pages in a single element.
+ if (pages.length > 1) {
+ var wrapper_1 = DOM.create('div');
+ pages[0].before(wrapper_1);
+ pages.forEach(function (page) {
+ wrapper_1.append(page);
+ });
+ pages = [wrapper_1];
+ }
+ page = pages[0];
+ }
+ page.classList.add('mm-page');
+ page.classList.add('mm-slideout');
+ page.id = page.id || uniqueId();
+ Mmenu.node.page = page;
+ // Invoke "after" hook.
+ this.trigger('setPage:after', [page]);
+};
+/**
+ * Initialize the window.
+ */
+var initWindow = function () {
+ var _this = this;
+ // Prevent tabbing
+ // Because when tabbing outside the menu, the element that gains focus will be centered on the screen.
+ // In other words: The menu would move out of view.
+ events.off(document.body, 'keydown.tabguard');
+ events.on(document.body, 'keydown.tabguard', function (evnt) {
+ if (evnt.keyCode == 9) {
+ if (_this.node.wrpr.matches('.mm-wrapper_opened')) {
+ evnt.preventDefault();
+ }
+ }
+ });
+};
+/**
+ * Initialize "blocker" node
+ */
+var initBlocker = function () {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('initBlocker:before');
+ var options = this.opts.offCanvas, configs = this.conf.offCanvas;
+ if (!options.blockUI) {
+ return;
+ }
+ // Create the blocker node.
+ if (!Mmenu.node.blck) {
+ var blck = DOM.create('div.mm-wrapper__blocker.mm-slideout');
+ blck.innerHTML = '';
+ // Append the blocker node to the body.
+ document.querySelector(configs.menu.insertSelector).append(blck);
+ // Store the blocker node.
+ Mmenu.node.blck = blck;
+ }
+ // Close the menu when
+ // 1) clicking,
+ // 2) touching or
+ // 3) dragging the blocker node.
+ var closeMenu = function (evnt) {
+ evnt.preventDefault();
+ evnt.stopPropagation();
+ if (!_this.node.wrpr.matches('.mm-wrapper_modal')) {
+ _this.close();
+ }
+ };
+ Mmenu.node.blck.addEventListener('mousedown', closeMenu); // 1
+ Mmenu.node.blck.addEventListener('touchstart', closeMenu); // 2
+ Mmenu.node.blck.addEventListener('touchmove', closeMenu); // 3
+ // Invoke "after" hook.
+ this.trigger('initBlocker:after');
+};
diff --git a/dist/core/oncanvas/_configs.js b/dist/core/oncanvas/_configs.js
new file mode 100644
index 0000000..5c1ff12
--- /dev/null
+++ b/dist/core/oncanvas/_configs.js
@@ -0,0 +1,15 @@
+var configs = {
+ classNames: {
+ inset: 'Inset',
+ nolistview: 'NoListview',
+ nopanel: 'NoPanel',
+ panel: 'Panel',
+ selected: 'Selected',
+ vertical: 'Vertical'
+ },
+ language: null,
+ openingInterval: 25,
+ panelNodetype: ['ul', 'ol', 'div'],
+ transitionDuration: 400
+};
+export default configs;
diff --git a/dist/core/oncanvas/_options.js b/dist/core/oncanvas/_options.js
new file mode 100644
index 0000000..2c671c4
--- /dev/null
+++ b/dist/core/oncanvas/_options.js
@@ -0,0 +1,18 @@
+var options = {
+ hooks: {},
+ extensions: [],
+ wrappers: [],
+ navbar: {
+ add: true,
+ sticky: true,
+ title: 'Menu',
+ titleLink: 'parent'
+ },
+ onClick: {
+ close: null,
+ preventDefault: null,
+ setSelected: true
+ },
+ slidingSubmenus: true
+};
+export default options;
diff --git a/dist/core/oncanvas/mmenu.oncanvas.css b/dist/core/oncanvas/mmenu.oncanvas.css
new file mode 100644
index 0000000..b0163ff
--- /dev/null
+++ b/dist/core/oncanvas/mmenu.oncanvas.css
@@ -0,0 +1 @@
+:root{--mm-line-height:20px;--mm-listitem-size:44px;--mm-navbar-size:44px;--mm-offset-top:0;--mm-offset-right:0;--mm-offset-bottom:0;--mm-offset-left:0;--mm-color-border:rgba(0, 0, 0, 0.1);--mm-color-button:rgba(0, 0, 0, 0.3);--mm-color-text:rgba(0, 0, 0, 0.75);--mm-color-text-dimmed:rgba(0, 0, 0, 0.3);--mm-color-background:#f3f3f3;--mm-color-background-highlight:rgba(0, 0, 0, 0.05);--mm-color-background-emphasis:rgba(255, 255, 255, 0.4);--mm-shadow:0 0 10px rgba(0, 0, 0, 0.3)}.mm-hidden{display:none!important}.mm-wrapper{overflow-x:hidden;position:relative}.mm-menu{top:0;right:0;bottom:0;left:0;background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);line-height:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;top:var(--mm-offset-top);right:var(--mm-offset-right);bottom:var(--mm-offset-bottom);left:var(--mm-offset-left);z-index:0;background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text);line-height:var(--mm-line-height);-webkit-tap-highlight-color:var(--mm-color-background-emphasis);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mm-menu a,.mm-menu a:active,.mm-menu a:hover,.mm-menu a:link,.mm-menu a:visited{text-decoration:none;color:inherit}[dir=rtl] .mm-menu{direction:rtl}.mm-panel{background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);z-index:0;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;-webkit-overflow-scrolling:touch;overflow:scroll;overflow-x:hidden;overflow-y:auto;background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text);-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-panel:after{height:44px}.mm-panel:not(.mm-hidden){display:block}.mm-panel:after{content:'';display:block;height:var(--mm-listitem-size)}.mm-panel_opened{z-index:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-panel_opened-parent{-webkit-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0)}.mm-panel_highest{z-index:2}.mm-panel_noanimation{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.mm-panel_noanimation.mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-panels>.mm-panel{position:absolute;left:0;right:0;top:0;bottom:0}.mm-panel__content{padding:20px 20px 0}.mm-panels{background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);position:relative;height:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text)}[dir=rtl] .mm-panel:not(.mm-panel_opened){-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}[dir=rtl] .mm-panel.mm-panel_opened-parent{-webkit-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0)}.mm-listitem_vertical>.mm-panel{display:none;width:100%;padding:10px 0 10px 10px;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.mm-listitem_vertical>.mm-panel:after,.mm-listitem_vertical>.mm-panel:before{content:none;display:none}.mm-listitem_opened>.mm-panel{display:block}.mm-listitem_vertical>.mm-listitem__btn{height:44px;height:var(--mm-listitem-size);bottom:auto}.mm-listitem_vertical .mm-listitem:last-child:after{border-color:transparent}.mm-listitem_opened>.mm-listitem__btn:after{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg);right:19px}.mm-btn{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:50px;padding:0}.mm-btn:after,.mm-btn:before{border:2px solid rgba(0,0,0,.3);border:2px solid var(--mm-color-button)}.mm-btn_next:after,.mm-btn_prev:before{content:'';border-bottom:none;border-right:none;-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:8px;height:8px;margin:auto;position:absolute;top:0;bottom:0}.mm-btn_prev:before{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:23px;right:auto}.mm-btn_next:after{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);right:23px;left:auto}.mm-btn_close:after,.mm-btn_close:before{content:'';-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:5px;height:5px;margin:auto;position:absolute;top:0;bottom:0;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.mm-btn_close:before{border-right:none;border-bottom:none;right:18px}.mm-btn_close:after{border-left:none;border-top:none;right:25px}[dir=rtl] .mm-btn_next:after{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:23px;right:auto}[dir=rtl] .mm-btn_prev:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);right:23px;left:auto}[dir=rtl] .mm-btn_close:after,[dir=rtl] .mm-btn_close:before{right:auto}[dir=rtl] .mm-btn_close:before{left:25px}[dir=rtl] .mm-btn_close:after{left:18px}.mm-navbar{min-height:44px;border-bottom:1px solid rgba(0,0,0,.1);background:#f3f3f3;color:rgba(0,0,0,.3);display:-webkit-box;display:-ms-flexbox;display:flex;min-height:var(--mm-navbar-size);border-bottom:1px solid var(--mm-color-border);background:var(--mm-color-background);color:var(--mm-color-text-dimmed);text-align:center;opacity:1;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-navbar>*{min-height:44px}@supports ((position:-webkit-sticky) or (position:sticky)){.mm-navbar_sticky{position:-webkit-sticky;position:sticky;top:0;z-index:1}}.mm-navbar>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-sizing:border-box;box-sizing:border-box}.mm-navbar__btn{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.mm-navbar__title{-webkit-box-flex:1;-ms-flex:1 1 50%;flex:1 1 50%;display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:20px;padding-right:20px;overflow:hidden}.mm-navbar__title:not(:last-child){padding-right:0}.mm-navbar__title>span{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mm-navbar__btn:not(.mm-hidden)+.mm-navbar__title{padding-left:0}.mm-navbar__btn:not(.mm-hidden)+.mm-navbar__title:last-child{padding-right:50px}[dir=rtl] .mm-navbar{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.mm-listview{list-style:none;display:block;padding:0;margin:0}.mm-listitem{color:rgba(0,0,0,.75);border-color:rgba(0,0,0,.1);color:var(--mm-color-text);border-color:var(--mm-color-border);list-style:none;display:block;padding:0;margin:0;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.mm-listitem:after{content:'';border-color:inherit;border-bottom-width:1px;border-bottom-style:solid;display:block;position:absolute;left:20px;right:0;bottom:0}.mm-listitem a,.mm-listitem a:hover{text-decoration:none}.mm-listitem__btn,.mm-listitem__text{padding:12px;display:block;padding:calc((var(--mm-listitem-size) - var(--mm-line-height))/ 2);padding-left:0;padding-right:0;color:inherit}.mm-listitem__text{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding-left:20px;padding-right:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:10%;flex-basis:10%}.mm-listitem__btn{background:rgba(3,2,1,0);border-color:inherit;width:auto;padding-right:50px;position:relative}.mm-listitem__btn:not(.mm-listitem__text){border-left-width:1px;border-left-style:solid}.mm-listitem_selected>.mm-listitem__text{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-listitem_opened>.mm-listitem__btn,.mm-listitem_opened>.mm-panel{background:rgba(0,0,0,.05);background:var(--mm-color-background-highlight)}[dir=rtl] .mm-listitem:after{left:0;right:20px}[dir=rtl] .mm-listitem__text{padding-left:10px;padding-right:20px}[dir=rtl] .mm-listitem__btn{padding-left:50px;border-left-width:0;border-left-style:none}[dir=rtl] .mm-listitem__btn:not(.mm-listitem__text){padding-right:0;border-right-width:1px;border-right-style:solid}
\ No newline at end of file
diff --git a/dist/core/oncanvas/mmenu.oncanvas.js b/dist/core/oncanvas/mmenu.oncanvas.js
new file mode 100644
index 0000000..010bec9
--- /dev/null
+++ b/dist/core/oncanvas/mmenu.oncanvas.js
@@ -0,0 +1,774 @@
+import version from '../../_version';
+import options from './_options';
+import configs from './_configs';
+import translate from './translations/translate';
+import * as DOM from '../../_modules/dom';
+import * as i18n from '../../_modules/i18n';
+import * as media from '../../_modules/matchmedia';
+import { type, extend, transitionend, uniqueId, valueOrFn } from '../../_modules/helpers';
+// Add the translations.
+translate();
+/**
+ * Class for a mobile menu.
+ */
+var Mmenu = /** @class */ (function () {
+ /**
+ * Create a mobile menu.
+ * @param {HTMLElement|string} menu The menu node.
+ * @param {object} [options=Mmenu.options] Options for the menu.
+ * @param {object} [configs=Mmenu.configs] Configuration options for the menu.
+ */
+ function Mmenu(menu, options, configs) {
+ // Extend options and configuration from defaults.
+ this.opts = extend(options, Mmenu.options);
+ this.conf = extend(configs, Mmenu.configs);
+ // Methods to expose in the API.
+ this._api = [
+ 'bind',
+ 'initPanel',
+ 'initListview',
+ 'openPanel',
+ 'closePanel',
+ 'closeAllPanels',
+ 'setSelected'
+ ];
+ // Storage objects for nodes, variables, hooks and click handlers.
+ this.node = {};
+ this.vars = {};
+ this.hook = {};
+ this.clck = [];
+ // Get menu node from string or element.
+ this.node.menu =
+ typeof menu == 'string' ? document.querySelector(menu) : menu;
+ if (typeof this._deprecatedWarnings == 'function') {
+ this._deprecatedWarnings();
+ }
+ this._initWrappers();
+ this._initAddons();
+ this._initExtensions();
+ this._initHooks();
+ this._initAPI();
+ this._initMenu();
+ this._initPanels();
+ this._initOpened();
+ this._initAnchors();
+ media.watch();
+ return this;
+ }
+ /**
+ * Open a panel.
+ * @param {HTMLElement} panel Panel to open.
+ * @param {boolean} [animation=true] Whether or not to open the panel with an animation.
+ */
+ Mmenu.prototype.openPanel = function (panel, animation) {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('openPanel:before', [panel]);
+ // Find panel.
+ if (!panel) {
+ return;
+ }
+ if (!panel.matches('.mm-panel')) {
+ panel = panel.closest('.mm-panel');
+ }
+ if (!panel) {
+ return;
+ }
+ // /Find panel.
+ if (typeof animation != 'boolean') {
+ animation = true;
+ }
+ // Open a "vertical" panel.
+ if (panel.parentElement.matches('.mm-listitem_vertical')) {
+ // Open current and all vertical parent panels.
+ DOM.parents(panel, '.mm-listitem_vertical').forEach(function (listitem) {
+ listitem.classList.add('mm-listitem_opened');
+ DOM.children(listitem, '.mm-panel').forEach(function (panel) {
+ panel.classList.remove('mm-hidden');
+ });
+ });
+ // Open first non-vertical parent panel.
+ var parents = DOM.parents(panel, '.mm-panel').filter(function (panel) { return !panel.parentElement.matches('.mm-listitem_vertical'); });
+ this.trigger('openPanel:start', [panel]);
+ if (parents.length) {
+ this.openPanel(parents[0]);
+ }
+ this.trigger('openPanel:finish', [panel]);
+ // Open a "horizontal" panel.
+ }
+ else {
+ if (panel.matches('.mm-panel_opened')) {
+ return;
+ }
+ var panels = DOM.children(this.node.pnls, '.mm-panel'), current_1 = DOM.children(this.node.pnls, '.mm-panel_opened')[0];
+ // Close all child panels.
+ panels
+ .filter(function (parent) { return parent !== panel; })
+ .forEach(function (parent) {
+ parent.classList.remove('mm-panel_opened-parent');
+ });
+ // Open all parent panels.
+ var parent_1 = panel['mmParent'];
+ while (parent_1) {
+ parent_1 = parent_1.closest('.mm-panel');
+ if (parent_1) {
+ if (!parent_1.parentElement.matches('.mm-listitem_vertical')) {
+ parent_1.classList.add('mm-panel_opened-parent');
+ }
+ parent_1 = parent_1['mmParent'];
+ }
+ }
+ // Add classes for animation.
+ panels.forEach(function (panel) {
+ panel.classList.remove('mm-panel_highest');
+ });
+ panels
+ .filter(function (hidden) { return hidden !== current_1; })
+ .filter(function (hidden) { return hidden !== panel; })
+ .forEach(function (hidden) {
+ hidden.classList.add('mm-hidden');
+ });
+ panel.classList.remove('mm-hidden');
+ /** Start opening the panel. */
+ var openPanelStart_1 = function () {
+ if (current_1) {
+ current_1.classList.remove('mm-panel_opened');
+ }
+ panel.classList.add('mm-panel_opened');
+ if (panel.matches('.mm-panel_opened-parent')) {
+ if (current_1) {
+ current_1.classList.add('mm-panel_highest');
+ }
+ panel.classList.remove('mm-panel_opened-parent');
+ }
+ else {
+ if (current_1) {
+ current_1.classList.add('mm-panel_opened-parent');
+ }
+ panel.classList.add('mm-panel_highest');
+ }
+ // Invoke "start" hook.
+ _this.trigger('openPanel:start', [panel]);
+ };
+ /** Finish opening the panel. */
+ var openPanelFinish_1 = function () {
+ if (current_1) {
+ current_1.classList.remove('mm-panel_highest');
+ current_1.classList.add('mm-hidden');
+ }
+ panel.classList.remove('mm-panel_highest');
+ // Invoke "finish" hook.
+ _this.trigger('openPanel:finish', [panel]);
+ };
+ if (animation && !panel.matches('.mm-panel_noanimation')) {
+ // Without the timeout the animation will not work because the element had display: none;
+ setTimeout(function () {
+ // Callback
+ transitionend(panel, function () {
+ openPanelFinish_1();
+ }, _this.conf.transitionDuration);
+ openPanelStart_1();
+ }, this.conf.openingInterval);
+ }
+ else {
+ openPanelStart_1();
+ openPanelFinish_1();
+ }
+ }
+ // Invoke "after" hook.
+ this.trigger('openPanel:after', [panel]);
+ };
+ /**
+ * Close a panel.
+ * @param {HTMLElement} panel Panel to close.
+ */
+ Mmenu.prototype.closePanel = function (panel) {
+ // Invoke "before" hook.
+ this.trigger('closePanel:before', [panel]);
+ var li = panel.parentElement;
+ // Only works for "vertical" panels.
+ if (li.matches('.mm-listitem_vertical')) {
+ li.classList.remove('mm-listitem_opened');
+ panel.classList.add('mm-hidden');
+ // Invoke main hook.
+ this.trigger('closePanel', [panel]);
+ }
+ // Invoke "after" hook.
+ this.trigger('closePanel:after', [panel]);
+ };
+ /**
+ * Close all opened panels.
+ * @param {HTMLElement} panel Panel to open after closing all other panels.
+ */
+ Mmenu.prototype.closeAllPanels = function (panel) {
+ // Invoke "before" hook.
+ this.trigger('closeAllPanels:before');
+ // Close all "vertical" panels.
+ var listitems = this.node.pnls.querySelectorAll('.mm-listitem');
+ listitems.forEach(function (listitem) {
+ listitem.classList.remove('mm-listitem_selected');
+ listitem.classList.remove('mm-listitem_opened');
+ });
+ // Close all "horizontal" panels.
+ var panels = DOM.children(this.node.pnls, '.mm-panel'), opened = panel ? panel : panels[0];
+ DOM.children(this.node.pnls, '.mm-panel').forEach(function (panel) {
+ if (panel !== opened) {
+ panel.classList.remove('mm-panel_opened');
+ panel.classList.remove('mm-panel_opened-parent');
+ panel.classList.remove('mm-panel_highest');
+ panel.classList.add('mm-hidden');
+ }
+ });
+ // Open first panel.
+ this.openPanel(opened, false);
+ // Invoke "after" hook.
+ this.trigger('closeAllPanels:after');
+ };
+ /**
+ * Toggle a panel opened/closed.
+ * @param {HTMLElement} panel Panel to open or close.
+ */
+ Mmenu.prototype.togglePanel = function (panel) {
+ var listitem = panel.parentElement;
+ // Only works for "vertical" panels.
+ if (listitem.matches('.mm-listitem_vertical')) {
+ this[listitem.matches('.mm-listitem_opened')
+ ? 'closePanel'
+ : 'openPanel'](panel);
+ }
+ };
+ /**
+ * Display a listitem as being "selected".
+ * @param {HTMLElement} listitem Listitem to mark.
+ */
+ Mmenu.prototype.setSelected = function (listitem) {
+ // Invoke "before" hook.
+ this.trigger('setSelected:before', [listitem]);
+ // First, remove the selected class from all listitems.
+ DOM.find(this.node.menu, '.mm-listitem_selected').forEach(function (li) {
+ li.classList.remove('mm-listitem_selected');
+ });
+ // Next, add the selected class to the provided listitem.
+ listitem.classList.add('mm-listitem_selected');
+ // Invoke "after" hook.
+ this.trigger('setSelected:after', [listitem]);
+ };
+ /**
+ * Bind functions to a hook (subscriber).
+ * @param {string} hook The hook.
+ * @param {function} func The function.
+ */
+ Mmenu.prototype.bind = function (hook, func) {
+ // Create an array for the hook if it does not yet excist.
+ this.hook[hook] = this.hook[hook] || [];
+ // Push the function to the array.
+ this.hook[hook].push(func);
+ };
+ /**
+ * Invoke the functions bound to a hook (publisher).
+ * @param {string} hook The hook.
+ * @param {array} [args] Arguments for the function.
+ */
+ Mmenu.prototype.trigger = function (hook, args) {
+ if (this.hook[hook]) {
+ for (var h = 0, l = this.hook[hook].length; h < l; h++) {
+ this.hook[hook][h].apply(this, args);
+ }
+ }
+ };
+ /**
+ * Create the API.
+ */
+ Mmenu.prototype._initAPI = function () {
+ var _this = this;
+ // We need this=that because:
+ // 1) the "arguments" object can not be referenced in an arrow function in ES3 and ES5.
+ var that = this;
+ this.API = {};
+ this._api.forEach(function (fn) {
+ _this.API[fn] = function () {
+ var re = that[fn].apply(that, arguments); // 1)
+ return typeof re == 'undefined' ? that.API : re;
+ };
+ });
+ // Store the API in the HTML node for external usage.
+ this.node.menu['mmApi'] = this.API;
+ };
+ /**
+ * Bind the hooks specified in the options (publisher).
+ */
+ Mmenu.prototype._initHooks = function () {
+ for (var hook in this.opts.hooks) {
+ this.bind(hook, this.opts.hooks[hook]);
+ }
+ };
+ /**
+ * Initialize the wrappers specified in the options.
+ */
+ Mmenu.prototype._initWrappers = function () {
+ // Invoke "before" hook.
+ this.trigger('initWrappers:before');
+ for (var w = 0; w < this.opts.wrappers.length; w++) {
+ var wrpr = Mmenu.wrappers[this.opts.wrappers[w]];
+ if (typeof wrpr == 'function') {
+ wrpr.call(this);
+ }
+ }
+ // Invoke "after" hook.
+ this.trigger('initWrappers:after');
+ };
+ /**
+ * Initialize all available add-ons.
+ */
+ Mmenu.prototype._initAddons = function () {
+ // Invoke "before" hook.
+ this.trigger('initAddons:before');
+ for (var addon in Mmenu.addons) {
+ Mmenu.addons[addon].call(this);
+ }
+ // Invoke "after" hook.
+ this.trigger('initAddons:after');
+ };
+ /**
+ * Initialize the extensions specified in the options.
+ */
+ Mmenu.prototype._initExtensions = function () {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('initExtensions:before');
+ // Convert array to object with array.
+ if (type(this.opts.extensions) == 'array') {
+ this.opts.extensions = {
+ all: this.opts.extensions
+ };
+ }
+ // Loop over object.
+ Object.keys(this.opts.extensions).forEach(function (query) {
+ var classnames = _this.opts.extensions[query].map(function (extension) { return 'mm-menu_' + extension; });
+ if (classnames.length) {
+ media.add(query, function () {
+ // IE11:
+ classnames.forEach(function (classname) {
+ _this.node.menu.classList.add(classname);
+ });
+ // Better browsers:
+ // this.node.menu.classList.add(...classnames);
+ }, function () {
+ // IE11:
+ classnames.forEach(function (classname) {
+ _this.node.menu.classList.remove(classname);
+ });
+ // Better browsers:
+ // this.node.menu.classList.remove(...classnames);
+ });
+ }
+ });
+ // Invoke "after" hook.
+ this.trigger('initExtensions:after');
+ };
+ /**
+ * Initialize the menu.
+ */
+ Mmenu.prototype._initMenu = function () {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('initMenu:before');
+ // Add class to the wrapper.
+ this.node.wrpr = this.node.wrpr || this.node.menu.parentElement;
+ this.node.wrpr.classList.add('mm-wrapper');
+ // Add an ID to the menu if it does not yet have one.
+ this.node.menu.id = this.node.menu.id || uniqueId();
+ // Wrap the panels in a node.
+ var panels = DOM.create('div.mm-panels');
+ DOM.children(this.node.menu).forEach(function (panel) {
+ if (_this.conf.panelNodetype.indexOf(panel.nodeName.toLowerCase()) >
+ -1) {
+ panels.append(panel);
+ }
+ });
+ this.node.menu.append(panels);
+ this.node.pnls = panels;
+ // Add class to the menu.
+ this.node.menu.classList.add('mm-menu');
+ // Invoke "after" hook.
+ this.trigger('initMenu:after');
+ };
+ /**
+ * Initialize panels.
+ */
+ Mmenu.prototype._initPanels = function () {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('initPanels:before');
+ // Open / close panels.
+ this.clck.push(function (anchor, args) {
+ if (args.inMenu) {
+ var href = anchor.getAttribute('href');
+ if (href && href.length > 1 && href.slice(0, 1) == '#') {
+ try {
+ var panel = DOM.find(_this.node.menu, href)[0];
+ if (panel && panel.matches('.mm-panel')) {
+ if (anchor.parentElement.matches('.mm-listitem_vertical')) {
+ _this.togglePanel(panel);
+ }
+ else {
+ _this.openPanel(panel);
+ }
+ return true;
+ }
+ }
+ catch (err) { }
+ }
+ }
+ });
+ /** The panels to initiate */
+ var panels = DOM.children(this.node.pnls);
+ panels.forEach(function (panel) {
+ _this.initPanel(panel);
+ });
+ // Invoke "after" hook.
+ this.trigger('initPanels:after');
+ };
+ /**
+ * Initialize a single panel and its children.
+ * @param {HTMLElement} panel The panel to initialize.
+ */
+ Mmenu.prototype.initPanel = function (panel) {
+ var _this = this;
+ /** Query selector for possible node-types for panels. */
+ var panelNodetype = this.conf.panelNodetype.join(', ');
+ if (panel.matches(panelNodetype)) {
+ // Only once
+ if (!panel.matches('.mm-panel')) {
+ panel = this._initPanel(panel);
+ }
+ if (panel) {
+ /** The sub panels. */
+ var children_1 = [];
+ // Find panel > panel
+ children_1.push.apply(children_1, DOM.children(panel, '.' + this.conf.classNames.panel));
+ // Find panel listitem > panel
+ DOM.children(panel, '.mm-listview').forEach(function (listview) {
+ DOM.children(listview, '.mm-listitem').forEach(function (listitem) {
+ children_1.push.apply(children_1, DOM.children(listitem, panelNodetype));
+ });
+ });
+ // Initiate subpanel(s).
+ children_1.forEach(function (child) {
+ _this.initPanel(child);
+ });
+ }
+ }
+ };
+ /**
+ * Initialize a single panel.
+ * @param {HTMLElement} panel Panel to initialize.
+ * @return {HTMLElement|null} Initialized panel.
+ */
+ Mmenu.prototype._initPanel = function (panel) {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('initPanel:before', [panel]);
+ // Refactor panel classnames
+ DOM.reClass(panel, this.conf.classNames.panel, 'mm-panel');
+ DOM.reClass(panel, this.conf.classNames.nopanel, 'mm-nopanel');
+ DOM.reClass(panel, this.conf.classNames.inset, 'mm-listview_inset');
+ if (panel.matches('.mm-listview_inset')) {
+ panel.classList.add('mm-nopanel');
+ }
+ // Stop if not supposed to be a panel.
+ if (panel.matches('.mm-nopanel')) {
+ return null;
+ }
+ /** The original ID on the node. */
+ var id = panel.id || uniqueId();
+ // Vertical panel.
+ var vertical = panel.matches('.' + this.conf.classNames.vertical) ||
+ !this.opts.slidingSubmenus;
+ panel.classList.remove(this.conf.classNames.vertical);
+ // Wrap UL/OL in DIV
+ if (panel.matches('ul, ol')) {
+ panel.removeAttribute('id');
+ /** The panel. */
+ var wrapper = DOM.create('div');
+ // Wrap the listview in the panel.
+ panel.before(wrapper);
+ wrapper.append(panel);
+ panel = wrapper;
+ }
+ panel.id = id;
+ panel.classList.add('mm-panel');
+ panel.classList.add('mm-hidden');
+ /** The parent listitem. */
+ var parent = [panel.parentElement].filter(function (listitem) {
+ return listitem.matches('li');
+ })[0];
+ if (vertical) {
+ if (parent) {
+ parent.classList.add('mm-listitem_vertical');
+ }
+ }
+ else {
+ this.node.pnls.append(panel);
+ }
+ if (parent) {
+ // Store parent/child relation.
+ parent['mmChild'] = panel;
+ panel['mmParent'] = parent;
+ // Add open link to parent listitem
+ if (parent && parent.matches('.mm-listitem')) {
+ if (!DOM.children(parent, '.mm-btn').length) {
+ /** The text node. */
+ var item = DOM.children(parent, '.mm-listitem__text')[0];
+ if (item) {
+ /** The open link. */
+ var button = DOM.create('a.mm-btn.mm-btn_next.mm-listitem__btn');
+ button.setAttribute('href', '#' + panel.id);
+ // If the item has no link,
+ // Replace the item with the open link.
+ if (item.matches('span')) {
+ button.classList.add('mm-listitem__text');
+ button.innerHTML = item.innerHTML;
+ parent.insertBefore(button, item.nextElementSibling);
+ item.remove();
+ }
+ // Otherwise, insert the button after the text.
+ else {
+ parent.insertBefore(button, DOM.children(parent, '.mm-panel')[0]);
+ }
+ }
+ }
+ }
+ }
+ this._initNavbar(panel);
+ DOM.children(panel, 'ul, ol').forEach(function (listview) {
+ _this.initListview(listview);
+ });
+ // Invoke "after" hook.
+ this.trigger('initPanel:after', [panel]);
+ return panel;
+ };
+ /**
+ * Initialize a navbar.
+ * @param {HTMLElement} panel Panel for the navbar.
+ */
+ Mmenu.prototype._initNavbar = function (panel) {
+ // Invoke "before" hook.
+ this.trigger('initNavbar:before', [panel]);
+ // Only one navbar per panel.
+ if (DOM.children(panel, '.mm-navbar').length) {
+ return;
+ }
+ /** The parent listitem. */
+ var parentListitem = null;
+ /** The parent panel. */
+ var parentPanel = null;
+ // The parent panel was specified in the data-mm-parent attribute.
+ if (panel.getAttribute('data-mm-parent')) {
+ parentPanel = DOM.find(this.node.pnls, panel.getAttribute('data-mm-parent'))[0];
+ }
+ // if (panel.dataset.mmParent) { // IE10 has no dataset
+ // parentPanel = DOM.find(this.node.pnls, panel.dataset.mmParent)[0];
+ // }
+ // The parent panel from a listitem.
+ else {
+ parentListitem = panel['mmParent'];
+ if (parentListitem) {
+ parentPanel = parentListitem.closest('.mm-panel');
+ }
+ }
+ // No navbar needed for vertical submenus.
+ if (parentListitem && parentListitem.matches('.mm-listitem_vertical')) {
+ return;
+ }
+ /** The navbar element. */
+ var navbar = DOM.create('div.mm-navbar');
+ // Hide navbar if specified in options.
+ if (!this.opts.navbar.add) {
+ navbar.classList.add('mm-hidden');
+ }
+ // Sticky navbars.
+ else if (this.opts.navbar.sticky) {
+ navbar.classList.add('mm-navbar_sticky');
+ }
+ // Add the back button.
+ if (parentPanel) {
+ /** The back button. */
+ var prev = DOM.create('a.mm-btn.mm-btn_prev.mm-navbar__btn');
+ prev.setAttribute('href', '#' + parentPanel.id);
+ navbar.append(prev);
+ }
+ /** The anchor that opens the panel. */
+ var opener = null;
+ // The anchor is in a listitem.
+ if (parentListitem) {
+ opener = DOM.children(parentListitem, '.mm-listitem__text')[0];
+ }
+ // The anchor is in a panel.
+ else if (parentPanel) {
+ opener = DOM.find(parentPanel, 'a[href="#' + panel.id + '"]')[0];
+ }
+ // Add the title.
+ var title = DOM.create('a.mm-navbar__title');
+ var titleText = DOM.create('span');
+ title.append(titleText);
+ titleText.innerHTML =
+ // panel.dataset.mmTitle || // IE10 has no dataset :(
+ panel.getAttribute('data-mm-title') ||
+ (opener ? opener.textContent : '') ||
+ this.i18n(this.opts.navbar.title) ||
+ this.i18n('Menu');
+ switch (this.opts.navbar.titleLink) {
+ case 'anchor':
+ if (opener) {
+ title.setAttribute('href', opener.getAttribute('href'));
+ }
+ break;
+ case 'parent':
+ if (parentPanel) {
+ title.setAttribute('href', '#' + parentPanel.id);
+ }
+ break;
+ }
+ navbar.append(title);
+ panel.prepend(navbar);
+ // Invoke "after" hook.
+ this.trigger('initNavbar:after', [panel]);
+ };
+ /**
+ * Initialize a listview.
+ * @param {HTMLElement} listview Listview to initialize.
+ */
+ Mmenu.prototype.initListview = function (listview) {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('initListview:before', [listview]);
+ DOM.reClass(listview, this.conf.classNames.nolistview, 'mm-nolistview');
+ if (!listview.matches('.mm-nolistview')) {
+ listview.classList.add('mm-listview');
+ DOM.children(listview).forEach(function (listitem) {
+ listitem.classList.add('mm-listitem');
+ DOM.reClass(listitem, _this.conf.classNames.selected, 'mm-listitem_selected');
+ DOM.children(listitem, 'a, span').forEach(function (item) {
+ if (!item.matches('.mm-btn')) {
+ item.classList.add('mm-listitem__text');
+ }
+ });
+ });
+ }
+ // Invoke "after" hook.
+ this.trigger('initListview:after', [listview]);
+ };
+ /**
+ * Find and open the correct panel after creating the menu.
+ */
+ Mmenu.prototype._initOpened = function () {
+ // Invoke "before" hook.
+ this.trigger('initOpened:before');
+ /** The selected listitem(s). */
+ var listitems = this.node.pnls.querySelectorAll('.mm-listitem_selected');
+ /** The last selected listitem. */
+ var lastitem = null;
+ // Deselect the listitems.
+ listitems.forEach(function (listitem) {
+ lastitem = listitem;
+ listitem.classList.remove('mm-listitem_selected');
+ });
+ // Re-select the last listitem.
+ if (lastitem) {
+ lastitem.classList.add('mm-listitem_selected');
+ }
+ /** The current opened panel. */
+ var current = lastitem
+ ? lastitem.closest('.mm-panel')
+ : DOM.children(this.node.pnls, '.mm-panel')[0];
+ // Open the current opened panel.
+ this.openPanel(current, false);
+ // Invoke "after" hook.
+ this.trigger('initOpened:after');
+ };
+ /**
+ * Initialize anchors in / for the menu.
+ */
+ Mmenu.prototype._initAnchors = function () {
+ var _this = this;
+ // Invoke "before" hook.
+ this.trigger('initAnchors:before');
+ document.addEventListener('click', function (evnt) {
+ /** The clicked element. */
+ var target = evnt.target.closest('a[href]');
+ if (!target) {
+ return;
+ }
+ /** Arguments passed to the bound methods. */
+ var args = {
+ inMenu: target.closest('.mm-menu') === _this.node.menu,
+ inListview: target.matches('.mm-listitem > a'),
+ toExternal: target.matches('[rel="external"]') ||
+ target.matches('[target="_blank"]')
+ };
+ var onClick = {
+ close: null,
+ setSelected: null,
+ preventDefault: target.getAttribute('href').slice(0, 1) == '#'
+ };
+ // Find hooked behavior.
+ for (var c = 0; c < _this.clck.length; c++) {
+ var click = _this.clck[c].call(_this, target, args);
+ if (click) {
+ if (typeof click == 'boolean') {
+ evnt.preventDefault();
+ return;
+ }
+ if (type(click) == 'object') {
+ onClick = extend(click, onClick);
+ }
+ }
+ }
+ // Default behavior for anchors in lists.
+ if (args.inMenu && args.inListview && !args.toExternal) {
+ // Set selected item, Default: true
+ if (valueOrFn(target, _this.opts.onClick.setSelected, onClick.setSelected)) {
+ _this.setSelected(target.parentElement);
+ }
+ // Prevent default / don't follow link. Default: false.
+ if (valueOrFn(target, _this.opts.onClick.preventDefault, onClick.preventDefault)) {
+ evnt.preventDefault();
+ }
+ // Close menu. Default: false
+ if (valueOrFn(target, _this.opts.onClick.close, onClick.close)) {
+ if (_this.opts.offCanvas &&
+ typeof _this.close == 'function') {
+ _this.close();
+ }
+ }
+ }
+ }, true);
+ // Invoke "after" hook.
+ this.trigger('initAnchors:after');
+ };
+ /**
+ * Get the translation for a text.
+ * @param {string} text Text to translate.
+ * @return {string} The translated text.
+ */
+ Mmenu.prototype.i18n = function (text) {
+ return i18n.get(text, this.conf.language);
+ };
+ /** Plugin version. */
+ Mmenu.version = version;
+ /** Default options for menus. */
+ Mmenu.options = options;
+ /** Default configuration for menus. */
+ Mmenu.configs = configs;
+ /** Available add-ons for the plugin. */
+ Mmenu.addons = {};
+ /** Available wrappers for the plugin. */
+ Mmenu.wrappers = {};
+ /** Globally used HTML elements. */
+ Mmenu.node = {};
+ /** Globally used variables. */
+ Mmenu.vars = {};
+ return Mmenu;
+}());
+export default Mmenu;
diff --git a/dist/core/oncanvas/translations/de.js b/dist/core/oncanvas/translations/de.js
new file mode 100644
index 0000000..1bf890e
--- /dev/null
+++ b/dist/core/oncanvas/translations/de.js
@@ -0,0 +1,3 @@
+export default {
+ 'Menu': 'Menü'
+};
diff --git a/dist/core/oncanvas/translations/fa.js b/dist/core/oncanvas/translations/fa.js
new file mode 100644
index 0000000..9dbb686
--- /dev/null
+++ b/dist/core/oncanvas/translations/fa.js
@@ -0,0 +1,3 @@
+export default {
+ 'Menu': 'منو'
+};
diff --git a/dist/core/oncanvas/translations/nl.js b/dist/core/oncanvas/translations/nl.js
new file mode 100644
index 0000000..8ef4179
--- /dev/null
+++ b/dist/core/oncanvas/translations/nl.js
@@ -0,0 +1,3 @@
+export default {
+ 'Menu': 'Menu'
+};
diff --git a/dist/core/oncanvas/translations/ru.js b/dist/core/oncanvas/translations/ru.js
new file mode 100644
index 0000000..b624e86
--- /dev/null
+++ b/dist/core/oncanvas/translations/ru.js
@@ -0,0 +1,3 @@
+export default {
+ 'Menu': 'Меню'
+};
diff --git a/dist/core/oncanvas/translations/translate.js b/dist/core/oncanvas/translations/translate.js
new file mode 100644
index 0000000..42e19b8
--- /dev/null
+++ b/dist/core/oncanvas/translations/translate.js
@@ -0,0 +1,11 @@
+import { add } from '../../../_modules/i18n';
+import nl from './nl';
+import fa from './fa';
+import de from './de';
+import ru from './ru';
+export default function () {
+ add(nl, 'nl');
+ add(fa, 'fa');
+ add(de, 'de');
+ add(ru, 'ru');
+}
diff --git a/dist/core/screenreader/_configs.js b/dist/core/screenreader/_configs.js
new file mode 100644
index 0000000..7917a2c
--- /dev/null
+++ b/dist/core/screenreader/_configs.js
@@ -0,0 +1,9 @@
+var configs = {
+ text: {
+ closeMenu: 'Close menu',
+ closeSubmenu: 'Close submenu',
+ openSubmenu: 'Open submenu',
+ toggleSubmenu: 'Toggle submenu'
+ }
+};
+export default configs;
diff --git a/dist/core/screenreader/_options.js b/dist/core/screenreader/_options.js
new file mode 100644
index 0000000..567df79
--- /dev/null
+++ b/dist/core/screenreader/_options.js
@@ -0,0 +1,24 @@
+var options = {
+ aria: true,
+ text: true
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ aria: options,
+ text: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/core/screenreader/mmenu.screenreader.css b/dist/core/screenreader/mmenu.screenreader.css
new file mode 100644
index 0000000..44e688e
--- /dev/null
+++ b/dist/core/screenreader/mmenu.screenreader.css
@@ -0,0 +1 @@
+.mm-sronly{border:0!important;clip:rect(1px,1px,1px,1px)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;white-space:nowrap!important;width:1px!important;min-width:1px!important;height:1px!important;min-height:1px!important;padding:0!important;overflow:hidden!important;position:absolute!important}
\ No newline at end of file
diff --git a/dist/core/screenreader/mmenu.screenreader.js b/dist/core/screenreader/mmenu.screenreader.js
new file mode 100644
index 0000000..f9d57a4
--- /dev/null
+++ b/dist/core/screenreader/mmenu.screenreader.js
@@ -0,0 +1,189 @@
+import Mmenu from './../oncanvas/mmenu.oncanvas';
+import options from './_options';
+import configs from './_configs';
+import translate from './translations/translate';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import { extend } from '../../_modules/helpers';
+// Add the translations.
+translate();
+// Add the options and configs.
+Mmenu.options.screenReader = options;
+Mmenu.configs.screenReader = configs;
+export default function () {
+ var _this = this;
+ // Extend options.
+ var options = extendShorthandOptions(this.opts.screenReader);
+ this.opts.screenReader = extend(options, Mmenu.options.screenReader);
+ // Extend configs.
+ var configs = this.conf.screenReader;
+ // Add Aria-* attributes
+ if (options.aria) {
+ // Add screenreader / aria hooks for add-ons
+ // In orde to keep this list short, only extend hooks that are actually used by other add-ons.
+ this.bind('initAddons:after', function () {
+ _this.bind('initMenu:after', function () {
+ this.trigger('initMenu:after:sr-aria', [].slice.call(arguments));
+ });
+ _this.bind('initNavbar:after', function () {
+ this.trigger('initNavbar:after:sr-aria', [].slice.call(arguments));
+ });
+ _this.bind('openPanel:start', function () {
+ this.trigger('openPanel:start:sr-aria', [].slice.call(arguments));
+ });
+ _this.bind('close:start', function () {
+ this.trigger('close:start:sr-aria', [].slice.call(arguments));
+ });
+ _this.bind('close:finish', function () {
+ this.trigger('close:finish:sr-aria', [].slice.call(arguments));
+ });
+ _this.bind('open:start', function () {
+ this.trigger('open:start:sr-aria', [].slice.call(arguments));
+ });
+ _this.bind('initOpened:after', function () {
+ this.trigger('initOpened:after:sr-aria', [].slice.call(arguments));
+ });
+ });
+ // Update aria-hidden for hidden / visible listitems
+ this.bind('updateListview', function () {
+ _this.node.pnls
+ .querySelectorAll('.mm-listitem')
+ .forEach(function (listitem) {
+ Mmenu.sr_aria(listitem, 'hidden', listitem.matches('.mm-hidden'));
+ });
+ });
+ // Update aria-hidden for the panels when opening and closing a panel.
+ this.bind('openPanel:start', function (panel) {
+ /** Panels that should be considered "hidden". */
+ var hidden = DOM.find(_this.node.pnls, '.mm-panel')
+ .filter(function (hide) { return hide !== panel; })
+ .filter(function (hide) { return !hide.parentElement.matches('.mm-panel'); });
+ /** Panels that should be considered "visible". */
+ var visible = [panel];
+ DOM.find(panel, '.mm-listitem_vertical .mm-listitem_opened').forEach(function (listitem) {
+ visible.push.apply(visible, DOM.children(listitem, '.mm-panel'));
+ });
+ // Set the panels to be considered "hidden" or "visible".
+ hidden.forEach(function (panel) {
+ Mmenu.sr_aria(panel, 'hidden', true);
+ });
+ visible.forEach(function (panel) {
+ Mmenu.sr_aria(panel, 'hidden', false);
+ });
+ });
+ this.bind('closePanel', function (panel) {
+ Mmenu.sr_aria(panel, 'hidden', true);
+ });
+ // Add aria-haspopup and aria-owns to prev- and next buttons.
+ this.bind('initPanel:after', function (panel) {
+ DOM.find(panel, '.mm-btn').forEach(function (button) {
+ Mmenu.sr_aria(button, 'haspopup', true);
+ var href = button.getAttribute('href');
+ if (href) {
+ Mmenu.sr_aria(button, 'owns', href.replace('#', ''));
+ }
+ });
+ });
+ // Add aria-hidden for navbars in panels.
+ this.bind('initNavbar:after', function (panel) {
+ /** The navbar in the panel. */
+ var navbar = DOM.children(panel, '.mm-navbar')[0];
+ /** Whether or not the navbar should be considered "hidden". */
+ var hidden = navbar.matches('.mm-hidden');
+ // Set the navbar to be considered "hidden" or "visible".
+ Mmenu.sr_aria(navbar, 'hidden', hidden);
+ });
+ // Text
+ if (options.text) {
+ // Add aria-hidden to titles in navbars
+ if (this.opts.navbar.titleLink == 'parent') {
+ this.bind('initNavbar:after', function (panel) {
+ /** The navbar in the panel. */
+ var navbar = DOM.children(panel, '.mm-navbar')[0];
+ /** Whether or not the navbar should be considered "hidden". */
+ var hidden = navbar.querySelector('.mm-btn_prev')
+ ? true
+ : false;
+ // Set the navbar-title to be considered "hidden" or "visible".
+ Mmenu.sr_aria(DOM.find(navbar, '.mm-navbar__title')[0], 'hidden', hidden);
+ });
+ }
+ }
+ }
+ // Add screenreader text
+ if (options.text) {
+ // Add screenreader / text hooks for add-ons
+ // In orde to keep this list short, only extend hooks that are actually used by other add-ons.
+ this.bind('initAddons:after', function () {
+ _this.bind('setPage:after', function () {
+ this.trigger('setPage:after:sr-text', [].slice.call(arguments));
+ });
+ _this.bind('initBlocker:after', function () {
+ this.trigger('initBlocker:after:sr-text', [].slice.call(arguments));
+ });
+ });
+ // Add text to the prev-buttons.
+ this.bind('initNavbar:after', function (panel) {
+ var navbar = DOM.children(panel, '.mm-navbar')[0];
+ if (navbar) {
+ var button = DOM.children(navbar, '.mm-btn_prev')[0];
+ if (button) {
+ button.innerHTML = Mmenu.sr_text(_this.i18n(configs.text.closeSubmenu));
+ }
+ }
+ });
+ // Add text to the next-buttons.
+ this.bind('initListview:after', function (listview) {
+ var parent = listview.closest('.mm-panel')['mmParent'];
+ if (parent) {
+ var next = DOM.children(parent, '.mm-btn_next')[0];
+ if (next) {
+ var text = _this.i18n(configs.text[next.parentElement.matches('.mm-listitem_vertical')
+ ? 'toggleSubmenu'
+ : 'openSubmenu']);
+ next.innerHTML += Mmenu.sr_text(text);
+ }
+ }
+ });
+ }
+}
+// Methods
+(function () {
+ var attr = function (element, attr, value) {
+ element[attr] = value;
+ if (value) {
+ element.setAttribute(attr, value.toString());
+ }
+ else {
+ element.removeAttribute(attr);
+ }
+ };
+ /**
+ * Add aria (property and) attribute to a HTML element.
+ *
+ * @param {HTMLElement} element The node to add the attribute to.
+ * @param {string} name The (non-aria-prefixed) attribute name.
+ * @param {string|boolean} value The attribute value.
+ */
+ Mmenu.sr_aria = function (element, name, value) {
+ attr(element, 'aria-' + name, value);
+ };
+ /**
+ * Add role attribute to a HTML element.
+ *
+ * @param {HTMLElement} element The node to add the attribute to.
+ * @param {string|boolean} value The attribute value.
+ */
+ Mmenu.sr_role = function (element, value) {
+ attr(element, 'role', value);
+ };
+ /**
+ * Wrap a text in a screen-reader-only node.
+ *
+ * @param {string} text The text to wrap.
+ * @return {string} The wrapped text.
+ */
+ Mmenu.sr_text = function (text) {
+ return '' + text + '';
+ };
+})();
diff --git a/dist/core/screenreader/translations/de.js b/dist/core/screenreader/translations/de.js
new file mode 100644
index 0000000..9011118
--- /dev/null
+++ b/dist/core/screenreader/translations/de.js
@@ -0,0 +1,6 @@
+export default {
+ 'Close menu': 'Menü schließen',
+ 'Close submenu': 'Untermenü schließen',
+ 'Open submenu': 'Untermenü öffnen',
+ 'Toggle submenu': 'Untermenü wechseln'
+};
diff --git a/dist/core/screenreader/translations/fa.js b/dist/core/screenreader/translations/fa.js
new file mode 100644
index 0000000..da07a77
--- /dev/null
+++ b/dist/core/screenreader/translations/fa.js
@@ -0,0 +1,6 @@
+export default {
+ 'Close menu': 'بستن منو',
+ 'Close submenu': 'بستن زیرمنو',
+ 'Open submenu': 'بازکردن زیرمنو',
+ 'Toggle submenu': 'سوییچ زیرمنو'
+};
diff --git a/dist/core/screenreader/translations/nl.js b/dist/core/screenreader/translations/nl.js
new file mode 100644
index 0000000..8afcae7
--- /dev/null
+++ b/dist/core/screenreader/translations/nl.js
@@ -0,0 +1,6 @@
+export default {
+ 'Close menu': 'Menu sluiten',
+ 'Close submenu': 'Submenu sluiten',
+ 'Open submenu': 'Submenu openen',
+ 'Toggle submenu': 'Submenu wisselen'
+};
diff --git a/dist/core/screenreader/translations/ru.js b/dist/core/screenreader/translations/ru.js
new file mode 100644
index 0000000..b3dcd3c
--- /dev/null
+++ b/dist/core/screenreader/translations/ru.js
@@ -0,0 +1,6 @@
+export default {
+ 'Close menu': 'Закрыть меню',
+ 'Close submenu': 'Закрыть подменю',
+ 'Open submenu': 'Открыть подменю',
+ 'Toggle submenu': 'Переключить подменю'
+};
diff --git a/dist/core/screenreader/translations/translate.js b/dist/core/screenreader/translations/translate.js
new file mode 100644
index 0000000..42e19b8
--- /dev/null
+++ b/dist/core/screenreader/translations/translate.js
@@ -0,0 +1,11 @@
+import { add } from '../../../_modules/i18n';
+import nl from './nl';
+import fa from './fa';
+import de from './de';
+import ru from './ru';
+export default function () {
+ add(nl, 'nl');
+ add(fa, 'fa');
+ add(de, 'de');
+ add(ru, 'ru');
+}
diff --git a/dist/core/scrollbugfix/_options.js b/dist/core/scrollbugfix/_options.js
new file mode 100644
index 0000000..8b5017a
--- /dev/null
+++ b/dist/core/scrollbugfix/_options.js
@@ -0,0 +1,22 @@
+var options = {
+ fix: true
+};
+export default options;
+/**
+ * Extend shorthand options.
+ *
+ * @param {object} options The options to extend.
+ * @return {object} The extended options.
+ */
+export function extendShorthandOptions(options) {
+ if (typeof options == 'boolean') {
+ options = {
+ fix: options
+ };
+ }
+ if (typeof options != 'object') {
+ options = {};
+ }
+ return options;
+}
+;
diff --git a/dist/core/scrollbugfix/mmenu.scrollbugfix.js b/dist/core/scrollbugfix/mmenu.scrollbugfix.js
new file mode 100644
index 0000000..c9504bc
--- /dev/null
+++ b/dist/core/scrollbugfix/mmenu.scrollbugfix.js
@@ -0,0 +1,91 @@
+import Mmenu from './../oncanvas/mmenu.oncanvas';
+import options from './_options';
+import { extendShorthandOptions } from './_options';
+import * as DOM from '../../_modules/dom';
+import * as support from '../../_modules/support';
+import { extend, touchDirection } from '../../_modules/helpers';
+// Add the options.
+Mmenu.options.scrollBugFix = options;
+export default function () {
+ var _this = this;
+ // The scrollBugFix add-on fixes a scrolling bug
+ // 1) on touch devices
+ // 2) in an off-canvas menu
+ // 3) that -when opened- blocks the UI from interaction
+ if (!support.touch || // 1
+ !this.opts.offCanvas || // 2
+ !this.opts.offCanvas.blockUI // 3
+ ) {
+ return;
+ }
+ // Extend options.
+ var options = extendShorthandOptions(this.opts.scrollBugFix);
+ this.opts.scrollBugFix = extend(options, Mmenu.options.scrollBugFix);
+ if (!options.fix) {
+ return;
+ }
+ var touchDir = touchDirection(this.node.menu);
+ /**
+ * Prevent an event from doing its default and stop its propagation.
+ * @param {ScrollBehavior} evnt The event to stop.
+ */
+ function stop(evnt) {
+ evnt.preventDefault();
+ evnt.stopPropagation();
+ }
+ // Prevent the page from scrolling when scrolling in the menu.
+ this.node.menu.addEventListener('scroll', stop, {
+ // Make sure to tell the browser the event will be prevented.
+ passive: false
+ });
+ // Prevent the page from scrolling when dragging in the menu.
+ this.node.menu.addEventListener('touchmove', function (evnt) {
+ var panel = evnt.target.closest('.mm-panel');
+ if (panel) {
+ // When dragging a non-scrollable panel,
+ // we can simple preventDefault and stopPropagation.
+ if (panel.scrollHeight === panel.offsetHeight) {
+ stop(evnt);
+ }
+ // When dragging a scrollable panel,
+ // that is fully scrolled up (or down).
+ // It will not trigger the scroll event when dragging down (or up) (because you can't scroll up (or down)),
+ // so we need to match the dragging direction with the scroll position before preventDefault and stopPropagation,
+ // otherwise the panel would not scroll at all in any direction.
+ else if (
+ // When scrolled up and dragging down
+ (panel.scrollTop == 0 && touchDir.get() == 'down') ||
+ // When scrolled down and dragging up
+ (panel.scrollHeight ==
+ panel.scrollTop + panel.offsetHeight &&
+ touchDir.get() == 'up')) {
+ stop(evnt);
+ }
+ // When dragging anything other than a panel.
+ }
+ else {
+ stop(evnt);
+ }
+ }, {
+ // Make sure to tell the browser the event can be prevented.
+ passive: false
+ });
+ // Some small additional improvements
+ // Scroll the current opened panel to the top when opening the menu.
+ this.bind('open:start', function () {
+ var panel = DOM.children(_this.node.pnls, '.mm-panel_opened')[0];
+ if (panel) {
+ panel.scrollTop = 0;
+ }
+ });
+ // Fix issue after device rotation change.
+ window.addEventListener('orientationchange', function (evnt) {
+ var panel = DOM.children(_this.node.pnls, '.mm-panel_opened')[0];
+ if (panel) {
+ panel.scrollTop = 0;
+ // Apparently, changing the overflow-scrolling property triggers some event :)
+ panel.style['-webkit-overflow-scrolling'] = 'auto';
+ panel.style['-webkit-overflow-scrolling'] = 'touch';
+ }
+ });
+}
diff --git a/dist/extensions/borderstyle/mmenu.borderstyle.css b/dist/extensions/borderstyle/mmenu.borderstyle.css
new file mode 100644
index 0000000..414101b
--- /dev/null
+++ b/dist/extensions/borderstyle/mmenu.borderstyle.css
@@ -0,0 +1 @@
+.mm-menu_border-none .mm-listitem:after{content:none}.mm-menu_border-full .mm-listitem:after{left:0!important}
\ No newline at end of file
diff --git a/dist/extensions/effects/mmenu.effects.css b/dist/extensions/effects/mmenu.effects.css
new file mode 100644
index 0000000..d22a3f8
--- /dev/null
+++ b/dist/extensions/effects/mmenu.effects.css
@@ -0,0 +1 @@
+.mm-menu_fx-menu-slide{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-wrapper_opened .mm-menu_fx-menu-slide{-webkit-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0)}.mm-wrapper_opening .mm-menu_fx-menu-slide{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-wrapper_opened .mm-menu_fx-menu-slide.mm-menu_position-right{-webkit-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0)}.mm-wrapper_opening .mm-menu_fx-menu-slide.mm-menu_position-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-none .mm-panel,.mm-panel_fx-none{-webkit-transition-property:none;-o-transition-property:none;transition-property:none}.mm-menu_fx-panels-none .mm-panel.mm-panel_opened-parent,.mm-panel_fx-none.mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-slide-0 .mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-slide-100 .mm-panel_opened-parent{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}
\ No newline at end of file
diff --git a/dist/extensions/fullscreen/mmenu.fullscreen.css b/dist/extensions/fullscreen/mmenu.fullscreen.css
new file mode 100644
index 0000000..6e3d275
--- /dev/null
+++ b/dist/extensions/fullscreen/mmenu.fullscreen.css
@@ -0,0 +1 @@
+.mm-menu_fullscreen{width:100%;min-width:140px;max-width:10000px}.mm-wrapper_opening .mm-menu_fullscreen~.mm-slideout{-webkit-transform:translate3d(100vw,0,0);transform:translate3d(100vw,0,0)}@media all and (max-width:140px){.mm-wrapper_opening .mm-menu_fullscreen~.mm-slideout{-webkit-transform:translate3d(140px,0,0);transform:translate3d(140px,0,0)}}@media all and (min-width:10000px){.mm-wrapper_opening .mm-menu_fullscreen~.mm-slideout{-webkit-transform:translate3d(10000px,0,0);transform:translate3d(10000px,0,0)}}.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-100vw,0,0);transform:translate3d(-100vw,0,0)}@media all and (max-width:140px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-140px,0,0);transform:translate3d(-140px,0,0)}}@media all and (min-width:10000px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-10000px,0,0);transform:translate3d(-10000px,0,0)}}.mm-menu_fullscreen.mm-menu_position-top{height:100vh;min-height:140px;max-height:10000px}.mm-menu_fullscreen.mm-menu_position-bottom{height:100vh;min-height:140px;max-height:10000px}
\ No newline at end of file
diff --git a/dist/extensions/listview/mmenu.listview.css b/dist/extensions/listview/mmenu.listview.css
new file mode 100644
index 0000000..63240c9
--- /dev/null
+++ b/dist/extensions/listview/mmenu.listview.css
@@ -0,0 +1 @@
+.mm-menu_listview-justify .mm-panels>.mm-panel{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.mm-menu_listview-justify .mm-panels>.mm-panel:after{content:none;display:none}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listview{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;margin-top:0;margin-bottom:0}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listitem{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:50px}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listitem__text{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.mm-listview_inset{list-style:inside disc;width:100%;padding:0 30px 15px 30px;margin:0}.mm-listview_inset .mm-listitem{padding:5px 0}
\ No newline at end of file
diff --git a/dist/extensions/multiline/mmenu.multiline.css b/dist/extensions/multiline/mmenu.multiline.css
new file mode 100644
index 0000000..283a493
--- /dev/null
+++ b/dist/extensions/multiline/mmenu.multiline.css
@@ -0,0 +1 @@
+.mm-menu_multiline .mm-listitem__text{-o-text-overflow:clip;text-overflow:clip;white-space:normal}
\ No newline at end of file
diff --git a/dist/extensions/pagedim/mmenu.pagedim.css b/dist/extensions/pagedim/mmenu.pagedim.css
new file mode 100644
index 0000000..88bd20e
--- /dev/null
+++ b/dist/extensions/pagedim/mmenu.pagedim.css
@@ -0,0 +1 @@
+[class*=mm-menu_pagedim].mm-menu_opened~.mm-wrapper__blocker{opacity:0}.mm-wrapper_opening [class*=mm-menu_pagedim].mm-menu_opened~.mm-wrapper__blocker{opacity:.3;-webkit-transition:opacity .4s ease .4s;-o-transition:opacity .4s ease .4s;transition:opacity .4s ease .4s}.mm-menu_opened.mm-menu_pagedim~.mm-wrapper__blocker{background:inherit}.mm-menu_opened.mm-menu_pagedim-black~.mm-wrapper__blocker{background:#000}.mm-menu_opened.mm-menu_pagedim-white~.mm-wrapper__blocker{background:#fff}
\ No newline at end of file
diff --git a/dist/extensions/popup/mmenu.popup.css b/dist/extensions/popup/mmenu.popup.css
new file mode 100644
index 0000000..1dbacd0
--- /dev/null
+++ b/dist/extensions/popup/mmenu.popup.css
@@ -0,0 +1 @@
+.mm-menu_popup{-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease;opacity:0;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);height:80%;min-height:140px;max-height:880px;top:50%;left:50%;bottom:auto;right:auto;z-index:2;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.mm-menu_popup.mm-menu_opened~.mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-menu_popup.mm-menu_opened~.mm-wrapper__blocker{-webkit-transition-delay:0s!important;-o-transition-delay:0s!important;transition-delay:0s!important;z-index:1}.mm-wrapper_opening .mm-menu_popup{opacity:1}
\ No newline at end of file
diff --git a/dist/extensions/positioning/mmenu.positioning.css b/dist/extensions/positioning/mmenu.positioning.css
new file mode 100644
index 0000000..c17b19e
--- /dev/null
+++ b/dist/extensions/positioning/mmenu.positioning.css
@@ -0,0 +1 @@
+.mm-menu_position-right{left:auto;right:0}.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-440px,0,0);transform:translate3d(-440px,0,0)}}.mm-menu_position-bottom,.mm-menu_position-front,.mm-menu_position-top{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-menu_position-bottom.mm-menu_opened,.mm-menu_position-front.mm-menu_opened,.mm-menu_position-top.mm-menu_opened{z-index:2}.mm-menu_position-bottom.mm-menu_opened~.mm-slideout,.mm-menu_position-front.mm-menu_opened~.mm-slideout,.mm-menu_position-top.mm-menu_opened~.mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-menu_position-bottom.mm-menu_opened~.mm-wrapper__blocker,.mm-menu_position-front.mm-menu_opened~.mm-wrapper__blocker,.mm-menu_position-top.mm-menu_opened~.mm-wrapper__blocker{z-index:1}.mm-menu_position-front{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mm-menu_position-front.mm-menu_position-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_position-bottom,.mm-menu_position-top{width:100%;min-width:100%;max-width:100%}.mm-menu_position-top{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.mm-menu_position-top{height:80vh;min-height:140px;max-height:880px}.mm-menu_position-bottom{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);top:auto}.mm-menu_position-bottom{height:80vh;min-height:140px;max-height:880px}.mm-wrapper_opening .mm-menu_position-bottom,.mm-wrapper_opening .mm-menu_position-front,.mm-wrapper_opening .mm-menu_position-top{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}
\ No newline at end of file
diff --git a/dist/extensions/shadows/mmenu.shadows.css b/dist/extensions/shadows/mmenu.shadows.css
new file mode 100644
index 0000000..4b2e010
--- /dev/null
+++ b/dist/extensions/shadows/mmenu.shadows.css
@@ -0,0 +1 @@
+.mm-menu_shadow-page:after{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);content:'';display:block;width:20px;height:120%;position:absolute;left:100%;top:-10%;z-index:100;-webkit-clip-path:polygon(-20px 0,0 0,0 100%,-20px 100%);clip-path:polygon(-20px 0,0 0,0 100%,-20px 100%);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)}.mm-menu_shadow-page.mm-menu_position-right:after{left:auto;right:100%;-webkit-clip-path:polygon(20px 0,40px 0,40px 100%,20px 100%);clip-path:polygon(20px 0,40px 0,40px 100%,20px 100%)}.mm-menu_shadow-page.mm-menu_position-front:after{content:none;display:none}.mm-menu_shadow-menu{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)}.mm-menu_shadow-panels .mm-panels>.mm-panel{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)}
\ No newline at end of file
diff --git a/dist/extensions/themes/mmenu.themes.css b/dist/extensions/themes/mmenu.themes.css
new file mode 100644
index 0000000..5406b07
--- /dev/null
+++ b/dist/extensions/themes/mmenu.themes.css
@@ -0,0 +1 @@
+.mm-menu_theme-white{--mm-color-border:rgba( 0,0,0, 0.1 );--mm-color-button:rgba( 0,0,0, 0.3 );--mm-color-text:rgba( 0,0,0, 0.7 );--mm-color-text-dimmed:rgba( 0,0,0, 0.3 );--mm-color-background:#fff;--mm-color-background-highlight:rgba( 0,0,0, 0.06 );--mm-color-background-emphasis:rgba( 0,0,0, 0.03 );--mm-shadow:0 0 10px rgba( 0,0,0, 0.2 )}.mm-menu_theme-dark{--mm-color-border:rgba( 0,0,0, 0.3 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.85 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#333;--mm-color-background-highlight:rgba( 255,255,255, 0.08 );--mm-color-background-emphasis:rgba( 0,0,0, 0.1 );--mm-shadow:0 0 20px rgba( 0,0,0, 0.5 )}.mm-menu_theme-black{--mm-color-border:rgba( 255,255,255, 0.25 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.75 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#000;--mm-color-background-highlight:rgba( 255,255,255, 0.2 );--mm-color-background-emphasis:rgba( 255,255,255, 0.15 );--mm-shadow:none}
\ No newline at end of file
diff --git a/dist/mmenu.css b/dist/mmenu.css
new file mode 100644
index 0000000..4195835
--- /dev/null
+++ b/dist/mmenu.css
@@ -0,0 +1,10 @@
+/*!
+ * mmenu.js
+ * mmenujs.com
+ *
+ * Copyright (c) Fred Heusschen
+ * frebsite.nl
+ *
+ * License: CC-BY-NC-4.0
+ * http://creativecommons.org/licenses/by-nc/4.0/
+ */.mm-menu_theme-white{--mm-color-border:rgba( 0,0,0, 0.1 );--mm-color-button:rgba( 0,0,0, 0.3 );--mm-color-text:rgba( 0,0,0, 0.7 );--mm-color-text-dimmed:rgba( 0,0,0, 0.3 );--mm-color-background:#fff;--mm-color-background-highlight:rgba( 0,0,0, 0.06 );--mm-color-background-emphasis:rgba( 0,0,0, 0.03 );--mm-shadow:0 0 10px rgba( 0,0,0, 0.2 )}.mm-menu_theme-dark{--mm-color-border:rgba( 0,0,0, 0.3 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.85 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#333;--mm-color-background-highlight:rgba( 255,255,255, 0.08 );--mm-color-background-emphasis:rgba( 0,0,0, 0.1 );--mm-shadow:0 0 20px rgba( 0,0,0, 0.5 )}.mm-menu_theme-black{--mm-color-border:rgba( 255,255,255, 0.25 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.75 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#000;--mm-color-background-highlight:rgba( 255,255,255, 0.2 );--mm-color-background-emphasis:rgba( 255,255,255, 0.15 );--mm-shadow:none}:root{--mm-line-height:20px;--mm-listitem-size:44px;--mm-navbar-size:44px;--mm-offset-top:0;--mm-offset-right:0;--mm-offset-bottom:0;--mm-offset-left:0;--mm-color-border:rgba(0, 0, 0, 0.1);--mm-color-button:rgba(0, 0, 0, 0.3);--mm-color-text:rgba(0, 0, 0, 0.75);--mm-color-text-dimmed:rgba(0, 0, 0, 0.3);--mm-color-background:#f3f3f3;--mm-color-background-highlight:rgba(0, 0, 0, 0.05);--mm-color-background-emphasis:rgba(255, 255, 255, 0.4);--mm-shadow:0 0 10px rgba(0, 0, 0, 0.3)}.mm-hidden{display:none!important}.mm-wrapper{overflow-x:hidden;position:relative}.mm-menu{top:0;right:0;bottom:0;left:0;background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);line-height:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;top:var(--mm-offset-top);right:var(--mm-offset-right);bottom:var(--mm-offset-bottom);left:var(--mm-offset-left);z-index:0;background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text);line-height:var(--mm-line-height);-webkit-tap-highlight-color:var(--mm-color-background-emphasis);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mm-menu a,.mm-menu a:active,.mm-menu a:hover,.mm-menu a:link,.mm-menu a:visited{text-decoration:none;color:inherit}[dir=rtl] .mm-menu{direction:rtl}.mm-panel{background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);z-index:0;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;-webkit-overflow-scrolling:touch;overflow:scroll;overflow-x:hidden;overflow-y:auto;background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text);-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-panel:after{height:44px}.mm-panel:not(.mm-hidden){display:block}.mm-panel:after{content:'';display:block;height:var(--mm-listitem-size)}.mm-panel_opened{z-index:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-panel_opened-parent{-webkit-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0)}.mm-panel_highest{z-index:2}.mm-panel_noanimation{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.mm-panel_noanimation.mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-panels>.mm-panel{position:absolute;left:0;right:0;top:0;bottom:0}.mm-panel__content{padding:20px 20px 0}.mm-panels{background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);position:relative;height:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text)}[dir=rtl] .mm-panel:not(.mm-panel_opened){-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}[dir=rtl] .mm-panel.mm-panel_opened-parent{-webkit-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0)}.mm-listitem_vertical>.mm-panel{display:none;width:100%;padding:10px 0 10px 10px;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.mm-listitem_vertical>.mm-panel:after,.mm-listitem_vertical>.mm-panel:before{content:none;display:none}.mm-listitem_opened>.mm-panel{display:block}.mm-listitem_vertical>.mm-listitem__btn{height:44px;height:var(--mm-listitem-size);bottom:auto}.mm-listitem_vertical .mm-listitem:last-child:after{border-color:transparent}.mm-listitem_opened>.mm-listitem__btn:after{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg);right:19px}.mm-btn{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:50px;padding:0}.mm-btn:after,.mm-btn:before{border:2px solid rgba(0,0,0,.3);border:2px solid var(--mm-color-button)}.mm-btn_next:after,.mm-btn_prev:before{content:'';border-bottom:none;border-right:none;-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:8px;height:8px;margin:auto;position:absolute;top:0;bottom:0}.mm-btn_prev:before{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:23px;right:auto}.mm-btn_next:after{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);right:23px;left:auto}.mm-btn_close:after,.mm-btn_close:before{content:'';-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:5px;height:5px;margin:auto;position:absolute;top:0;bottom:0;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.mm-btn_close:before{border-right:none;border-bottom:none;right:18px}.mm-btn_close:after{border-left:none;border-top:none;right:25px}[dir=rtl] .mm-btn_next:after{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:23px;right:auto}[dir=rtl] .mm-btn_prev:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);right:23px;left:auto}[dir=rtl] .mm-btn_close:after,[dir=rtl] .mm-btn_close:before{right:auto}[dir=rtl] .mm-btn_close:before{left:25px}[dir=rtl] .mm-btn_close:after{left:18px}.mm-navbar{min-height:44px;border-bottom:1px solid rgba(0,0,0,.1);background:#f3f3f3;color:rgba(0,0,0,.3);display:-webkit-box;display:-ms-flexbox;display:flex;min-height:var(--mm-navbar-size);border-bottom:1px solid var(--mm-color-border);background:var(--mm-color-background);color:var(--mm-color-text-dimmed);text-align:center;opacity:1;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-navbar>*{min-height:44px}@supports ((position:-webkit-sticky) or (position:sticky)){.mm-navbar_sticky{position:-webkit-sticky;position:sticky;top:0;z-index:1}}.mm-navbar>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-sizing:border-box;box-sizing:border-box}.mm-navbar__btn{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.mm-navbar__title{-webkit-box-flex:1;-ms-flex:1 1 50%;flex:1 1 50%;display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:20px;padding-right:20px;overflow:hidden}.mm-navbar__title:not(:last-child){padding-right:0}.mm-navbar__title>span{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mm-navbar__btn:not(.mm-hidden)+.mm-navbar__title{padding-left:0}.mm-navbar__btn:not(.mm-hidden)+.mm-navbar__title:last-child{padding-right:50px}[dir=rtl] .mm-navbar{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.mm-listview{list-style:none;display:block;padding:0;margin:0}.mm-listitem{color:rgba(0,0,0,.75);border-color:rgba(0,0,0,.1);color:var(--mm-color-text);border-color:var(--mm-color-border);list-style:none;display:block;padding:0;margin:0;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.mm-listitem:after{content:'';border-color:inherit;border-bottom-width:1px;border-bottom-style:solid;display:block;position:absolute;left:20px;right:0;bottom:0}.mm-listitem a,.mm-listitem a:hover{text-decoration:none}.mm-listitem__btn,.mm-listitem__text{padding:12px;display:block;padding:calc((var(--mm-listitem-size) - var(--mm-line-height))/ 2);padding-left:0;padding-right:0;color:inherit}.mm-listitem__text{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding-left:20px;padding-right:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:10%;flex-basis:10%}.mm-listitem__btn{background:rgba(3,2,1,0);border-color:inherit;width:auto;padding-right:50px;position:relative}.mm-listitem__btn:not(.mm-listitem__text){border-left-width:1px;border-left-style:solid}.mm-listitem_selected>.mm-listitem__text{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-listitem_opened>.mm-listitem__btn,.mm-listitem_opened>.mm-panel{background:rgba(0,0,0,.05);background:var(--mm-color-background-highlight)}[dir=rtl] .mm-listitem:after{left:0;right:20px}[dir=rtl] .mm-listitem__text{padding-left:10px;padding-right:20px}[dir=rtl] .mm-listitem__btn{padding-left:50px;border-left-width:0;border-left-style:none}[dir=rtl] .mm-listitem__btn:not(.mm-listitem__text){padding-right:0;border-right-width:1px;border-right-style:solid}.mm-page{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.mm-slideout{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease;z-index:1}.mm-wrapper_opened{overflow-x:hidden;position:relative}.mm-wrapper_opened .mm-page{min-height:100vh}.mm-wrapper_background .mm-page{background:inherit}.mm-menu_offcanvas{position:fixed;right:auto;z-index:0}.mm-menu_offcanvas:not(.mm-menu_opened){display:none}.mm-menu_offcanvas{width:80%;min-width:240px;max-width:440px}.mm-wrapper_opening .mm-menu_offcanvas~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_offcanvas~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_offcanvas~.mm-slideout{-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0)}}.mm-wrapper__blocker{background:rgba(3,2,1,0);overflow:hidden;display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2}.mm-wrapper_blocking{overflow:hidden}.mm-wrapper_blocking body{overflow:hidden}.mm-wrapper_blocking .mm-wrapper__blocker{display:block}.mm-sronly{border:0!important;clip:rect(1px,1px,1px,1px)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;white-space:nowrap!important;width:1px!important;min-width:1px!important;height:1px!important;min-height:1px!important;padding:0!important;overflow:hidden!important;position:absolute!important}.mm-menu_autoheight:not(.mm-menu_offcanvas){position:relative}.mm-menu_autoheight.mm-menu_position-bottom,.mm-menu_autoheight.mm-menu_position-top{max-height:80%}.mm-menu_autoheight-measuring .mm-panel{display:block!important}.mm-menu_autoheight-measuring .mm-panels>.mm-panel{bottom:auto!important;height:auto!important}.mm-menu_autoheight-measuring .mm-listitem_vertical:not(.mm-listitem_opened) .mm-panel{display:none!important}[class*=mm-menu_columns-]{-webkit-transition-property:width;-o-transition-property:width;transition-property:width}[class*=mm-menu_columns-] .mm-panels>.mm-panel{right:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:width,transform;transition-property:width,transform;transition-property:width,transform,-webkit-transform}[class*=mm-menu_columns-] .mm-panels>.mm-panel_opened,[class*=mm-menu_columns-] .mm-panels>.mm-panel_opened-parent{display:block!important}[class*=mm-panel_columns-]{border-right:1px solid;border-color:inherit}.mm-menu_columns-1 .mm-panel_columns-0,.mm-menu_columns-2 .mm-panel_columns-1,.mm-menu_columns-3 .mm-panel_columns-2,.mm-menu_columns-4 .mm-panel_columns-3{border-right:none}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-0{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_columns-0 .mm-panels>.mm-panel{z-index:0}.mm-menu_columns-0 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-0 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_columns-0{width:80%;min-width:240px;max-width:0}.mm-wrapper_opening .mm-menu_columns-0~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-0~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:0px){.mm-wrapper_opening .mm-menu_columns-0~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:0px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-1{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_columns-1 .mm-panels>.mm-panel{z-index:1;width:100%}.mm-menu_columns-1 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-1 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(200%,0,0);transform:translate3d(200%,0,0)}.mm-menu_columns-1{width:80%;min-width:240px;max-width:440px}.mm-wrapper_opening .mm-menu_columns-1~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-1~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_columns-1~.mm-slideout{-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0)}}.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-440px,0,0);transform:translate3d(-440px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-2{-webkit-transform:translate3d(200%,0,0);transform:translate3d(200%,0,0)}.mm-menu_columns-2 .mm-panels>.mm-panel{z-index:2;width:50%}.mm-menu_columns-2 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-2 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(300%,0,0);transform:translate3d(300%,0,0)}.mm-menu_columns-2{width:80%;min-width:240px;max-width:880px}.mm-wrapper_opening .mm-menu_columns-2~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-2~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:1100px){.mm-wrapper_opening .mm-menu_columns-2~.mm-slideout{-webkit-transform:translate3d(880px,0,0);transform:translate3d(880px,0,0)}}.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:1100px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-880px,0,0);transform:translate3d(-880px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-3{-webkit-transform:translate3d(300%,0,0);transform:translate3d(300%,0,0)}.mm-menu_columns-3 .mm-panels>.mm-panel{z-index:3;width:33.34%}.mm-menu_columns-3 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-3 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(400%,0,0);transform:translate3d(400%,0,0)}.mm-menu_columns-3{width:80%;min-width:240px;max-width:1320px}.mm-wrapper_opening .mm-menu_columns-3~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-3~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:1650px){.mm-wrapper_opening .mm-menu_columns-3~.mm-slideout{-webkit-transform:translate3d(1320px,0,0);transform:translate3d(1320px,0,0)}}.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:1650px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-1320px,0,0);transform:translate3d(-1320px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-4{-webkit-transform:translate3d(400%,0,0);transform:translate3d(400%,0,0)}.mm-menu_columns-4 .mm-panels>.mm-panel{z-index:4;width:25%}.mm-menu_columns-4 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-4 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(500%,0,0);transform:translate3d(500%,0,0)}.mm-menu_columns-4{width:80%;min-width:240px;max-width:1760px}.mm-wrapper_opening .mm-menu_columns-4~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-4~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:2200px){.mm-wrapper_opening .mm-menu_columns-4~.mm-slideout{-webkit-transform:translate3d(1760px,0,0);transform:translate3d(1760px,0,0)}}.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:2200px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-1760px,0,0);transform:translate3d(-1760px,0,0)}}[class*=mm-menu_columns-].mm-menu_position-bottom,[class*=mm-menu_columns-].mm-menu_position-top{width:100%;max-width:100%;min-width:100%}.mm-wrapper_opening [class*=mm-menu_columns-].mm-menu_position-front{-webkit-transition-property:width,min-width,max-width,-webkit-transform;transition-property:width,min-width,max-width,-webkit-transform;-o-transition-property:width,min-width,max-width,transform;transition-property:width,min-width,max-width,transform;transition-property:width,min-width,max-width,transform,-webkit-transform}.mm-counter{color:rgba(0,0,0,.3);display:block;padding-left:20px;float:right;text-align:right;color:var(--mm-color-text-dimmed)}.mm-listitem_nosubitems>.mm-counter{display:none}[dir=rtl] .mm-counter{text-align:left;float:left;padding-left:0;padding-right:20px}.mm-divider{position:relative;min-height:20px;padding:4.3px;background:#f3f3f3;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;min-height:var(--mm-line-height);padding:calc(((var(--mm-listitem-size) * .65) - var(--mm-line-height)) * .5);padding-right:10px;padding-left:20px;font-size:75%;text-transform:uppercase;background:var(--mm-color-background);opacity:1;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-divider:before{background:rgba(0,0,0,.05)}@supports ((position:-webkit-sticky) or (position:sticky)){.mm-divider{position:-webkit-sticky;position:sticky;z-index:2;top:0}.mm-navbar_sticky:not(.mm-hidden)~.mm-listview .mm-divider{top:var(--mm-navbar-size)}}.mm-divider:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:var(--mm-color-background-highlight)}.mm-wrapper_dragging .mm-menu,.mm-wrapper_dragging .mm-slideout{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important;-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.mm-wrapper_dragging .mm-menu{pointer-events:none!important}.mm-wrapper_dragging .mm-wrapper__blocker{display:none!important}.mm-menu_dropdown{-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);height:80%}.mm-wrapper_dropdown .mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-wrapper_dropdown .mm-wrapper__blocker{-webkit-transition-delay:0s!important;-o-transition-delay:0s!important;transition-delay:0s!important;z-index:1}.mm-wrapper_dropdown .mm-menu_dropdown{z-index:2}.mm-wrapper_dropdown.mm-wrapper_opened:not(.mm-wrapper_opening) .mm-menu_dropdown{display:none}.mm-menu_tip-bottom:before,.mm-menu_tip-left:before,.mm-menu_tip-right:before,.mm-menu_tip-top:before{content:'';background:inherit;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);display:block;width:15px;height:15px;position:absolute;z-index:-1;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mm-menu_tip-left:before{left:22px}.mm-menu_tip-right:before{right:22px}.mm-menu_tip-top:before{top:-8px}.mm-menu_tip-bottom:before{bottom:-8px}:root{--mm-iconbar-size:50px}.mm-menu_iconbar-left .mm-navbars_bottom,.mm-menu_iconbar-left .mm-navbars_top,.mm-menu_iconbar-left .mm-panels{margin-left:50px;margin-left:var(--mm-iconbar-size)}.mm-menu_iconbar-left .mm-iconbar{border-right-width:1px;display:block;left:0}.mm-menu_iconbar-right .mm-navbars_bottom,.mm-menu_iconbar-right .mm-navbars_top,.mm-menu_iconbar-right .mm-panels{margin-right:50px;margin-right:var(--mm-iconbar-size)}.mm-menu_iconbar-right .mm-iconbar{border-left-width:1px;display:block;right:0}.mm-iconbar{width:50px;border-color:rgba(0,0,0,.1);background:#f3f3f3;color:rgba(0,0,0,.3);display:none;width:var(--mm-iconbar-size);overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;top:0;bottom:0;z-index:2;border:0 solid;border-color:var(--mm-color-border);background:var(--mm-color-background);color:var(--mm-color-text-dimmed);text-align:center}.mm-iconbar__bottom,.mm-iconbar__top{width:inherit;position:absolute}.mm-iconbar__bottom>*,.mm-iconbar__top>*{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;padding:12.5px 0}.mm-iconbar__bottom a,.mm-iconbar__bottom a:hover,.mm-iconbar__top a,.mm-iconbar__top a:hover{text-decoration:none}.mm-iconbar__top{top:0}.mm-iconbar__bottom{bottom:0}.mm-iconbar__tab_selected{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}:root{--mm-iconpanel-size:50px}.mm-panel_iconpanel-1{width:calc(100% - 50px);width:calc(100% - (var(--mm-iconpanel-size) * 1))}.mm-panel_iconpanel-2{width:calc(100% - 100px);width:calc(100% - (var(--mm-iconpanel-size) * 2))}.mm-panel_iconpanel-3{width:calc(100% - 150px);width:calc(100% - (var(--mm-iconpanel-size) * 3))}.mm-panel_iconpanel-first~.mm-panel{width:calc(100% - 50px);width:calc(100% - var(--mm-iconpanel-size))}.mm-menu_iconpanel .mm-panels>.mm-panel{left:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:transform,width;transition-property:transform,width;transition-property:transform,width,-webkit-transform}.mm-menu_iconpanel .mm-panels>.mm-panel_opened,.mm-menu_iconpanel .mm-panels>.mm-panel_opened-parent{display:block!important}.mm-menu_iconpanel .mm-panels>.mm-panel_opened-parent{overflow-y:hidden;-webkit-transform:unset;-ms-transform:unset;transform:unset}.mm-menu_iconpanel .mm-panels>.mm-panel:not(.mm-panel_iconpanel-first):not(.mm-panel_iconpanel-0){border-left-width:1px;border-left-style:solid}.mm-menu_hidedivider .mm-panel_opened-parent .mm-divider,.mm-menu_hidenavbar .mm-panel_opened-parent .mm-navbar{opacity:0}.mm-panel__blocker{background:inherit;opacity:0;display:block;position:absolute;top:0;right:0;left:0;z-index:3;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-panel_opened-parent .mm-panel__blocker{opacity:.6;bottom:-100000px}[dir=rtl] .mm-menu_iconpanel .mm-panels>.mm-panel{left:0;right:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:transform,width;transition-property:transform,width;transition-property:transform,width,-webkit-transform}[dir=rtl] .mm-menu_iconpanel .mm-panels>.mm-panel:not(.mm-panel_iconpanel-first):not(.mm-panel_iconpanel-0){border-left:none;border-right:1px solid;border-color:inherit}.mm-menu_keyboardfocus a:focus,.mm-menu_keyboardfocus.mm-menu_opened~.mm-wrapper__blocker a:focus{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis);outline:0}.mm-wrapper__blocker .mm-tabstart{cursor:default;display:block;width:100%;height:100%}.mm-wrapper__blocker .mm-tabend{opacity:0;position:absolute;bottom:0}.mm-navbars_top{-ms-flex-negative:0;flex-shrink:0}.mm-navbars_top .mm-navbar:not(:last-child){border-bottom:none}.mm-navbars_bottom{-ms-flex-negative:0;flex-shrink:0}.mm-navbars_bottom .mm-navbar{border-bottom:none}.mm-navbars_bottom .mm-navbar:first-child{border-top:1px solid rgba(0,0,0,.1);border-top:1px solid var(--mm-color-border)}.mm-btn:not(.mm-hidden)+.mm-navbar__searchfield .mm-searchfield__input{padding-left:0}.mm-navbar__searchfield:not(:last-child) .mm-searchfield__input{padding-right:0}.mm-navbar__breadcrumbs{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;-webkit-box-flex:1;-ms-flex:1 1 50%;flex:1 1 50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:0 20px;overflow-x:auto;-webkit-overflow-scrolling:touch}.mm-navbar__breadcrumbs>*{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-right:6px}.mm-navbar__breadcrumbs>a{text-decoration:underline}.mm-navbar__breadcrumbs:not(:last-child){padding-right:0}.mm-btn:not(.mm-hidden)+.mm-navbar__breadcrumbs{padding-left:0}.mm-navbar_tabs>*{padding:0 10px;border:1px solid transparent}.mm-navbar__tab_selected{background:#f3f3f3;color:rgba(0,0,0,.75);background:var(--mm-color-background);color:var(--mm-color-text)}.mm-navbar__tab_selected:not(:first-child){border-left-color:rgba(0,0,0,.1)}.mm-navbar__tab_selected:not(:last-child){border-right-color:rgba(0,0,0,.1)}.mm-navbar__tab_selected:not(:first-child){border-left-color:var(--mm-color-border)}.mm-navbar__tab_selected:not(:last-child){border-right-color:var(--mm-color-border)}.mm-navbars_top .mm-navbar_tabs{border-bottom:none}.mm-navbars_top .mm-navbar_tabs>*{border-bottom-color:rgba(0,0,0,.1);border-bottom-color:var(--mm-color-border)}.mm-navbars_top .mm-navbar__tab_selected{border-top-color:rgba(0,0,0,.1);border-top-color:var(--mm-color-border);border-bottom-color:transparent}.mm-navbars_top.mm-navbars_has-tabs .mm-navbar{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-navbars_top.mm-navbars_has-tabs .mm-navbar_tabs~.mm-navbar{background:#f3f3f3;background:var(--mm-color-background)}.mm-navbars_bottom .mm-navbar_tabs:first-child{border-top:none}.mm-navbars_bottom .mm-navbar_tabs>*{border-top-color:rgba(0,0,0,.1);border-top-color:var(--mm-color-border)}.mm-navbars_bottom .mm-navbar__tab_selected{border-bottom-color:rgba(0,0,0,.1);border-bottom-color:var(--mm-color-border);border-top-color:transparent}.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar{background:#f3f3f3;background:var(--mm-color-background)}.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar_tabs,.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar_tabs~.mm-navbar{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-searchfield{height:44px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:var(--mm-navbar-size);padding:0;overflow:hidden}.mm-searchfield input{height:30.8px;line-height:30.8px}.mm-searchfield input,.mm-searchfield input:focus,.mm-searchfield input:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.75)}.mm-searchfield input{display:block;width:100%;max-width:100%;height:calc(var(--mm-navbar-size) * .7);min-height:unset;max-height:unset;margin:0;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box;border:none!important;border-radius:4px;line-height:calc(var(--mm-navbar-size) * .7);-webkit-box-shadow:none!important;box-shadow:none!important;outline:0!important;font:inherit;font-size:inherit}.mm-searchfield input,.mm-searchfield input:focus,.mm-searchfield input:hover{background:var(--mm-color-background-highlight);color:var(--mm-color-text)}.mm-searchfield input::-ms-clear{display:none}.mm-searchfield__input{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;width:100%;max-width:100%;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box}.mm-panel__noresultsmsg{color:rgba(0,0,0,.3);padding:50px 0;color:var(--mm-color-text-dimmed);text-align:center;font-size:150%}.mm-searchfield__btn{position:absolute;right:0;top:0;bottom:0}.mm-panel_search{left:0!important;right:0!important;width:100%!important;border-left:none!important}.mm-searchfield__cancel{line-height:44px;display:block;padding-right:10px;margin-right:-100px;line-height:var(--mm-navbar-size);text-decoration:none;-webkit-transition:margin .4s ease;-o-transition:margin .4s ease;transition:margin .4s ease}.mm-searchfield__cancel-active{margin-right:0}.mm-listitem_nosubitems>.mm-listitem__btn{display:none}.mm-listitem_nosubitems>.mm-listitem__text{padding-right:10px}.mm-listitem_onlysubitems>.mm-listitem__text:not(.mm-listitem__btn){z-index:-1;pointer-events:none}.mm-sectionindexer{background:inherit;text-align:center;font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box;width:20px;position:absolute;top:0;bottom:0;right:-20px;z-index:5;-webkit-transition:right .4s ease;-o-transition:right .4s ease;transition:right .4s ease;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly}.mm-sectionindexer a{color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed);line-height:1;text-decoration:none;display:block}.mm-sectionindexer~.mm-panel{padding-right:0}.mm-sectionindexer_active{right:0}.mm-sectionindexer_active~.mm-panel{padding-right:20px}.mm-menu_selected-hover .mm-listitem__btn,.mm-menu_selected-hover .mm-listitem__text,.mm-menu_selected-parent .mm-listitem__btn,.mm-menu_selected-parent .mm-listitem__text{-webkit-transition:background-color .4s ease;-o-transition:background-color .4s ease;transition:background-color .4s ease}.mm-menu_selected-hover .mm-listview:hover>.mm-listitem_selected>.mm-listitem__text{background:0 0}.mm-menu_selected-hover .mm-listitem__btn:hover,.mm-menu_selected-hover .mm-listitem__text:hover{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-menu_selected-parent .mm-panel_opened-parent .mm-listitem:not(.mm-listitem_selected-parent)>.mm-listitem__text{background:0 0}.mm-menu_selected-parent .mm-listitem_selected-parent>.mm-listitem__btn,.mm-menu_selected-parent .mm-listitem_selected-parent>.mm-listitem__text{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}:root{--mm-sidebar-collapsed-size:50px;--mm-sidebar-expanded-size:440px}.mm-wrapper_sidebar-collapsed body,.mm-wrapper_sidebar-expanded body{position:relative}.mm-wrapper_sidebar-collapsed .mm-slideout,.mm-wrapper_sidebar-expanded .mm-slideout{-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:width,transform;transition-property:width,transform;transition-property:width,transform,-webkit-transform}.mm-wrapper_sidebar-collapsed .mm-page,.mm-wrapper_sidebar-expanded .mm-page{background:inherit;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:100vh}.mm-wrapper_sidebar-collapsed .mm-menu_sidebar-collapsed,.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;top:0!important;right:auto!important;bottom:0!important;left:0!important}.mm-wrapper_sidebar-collapsed .mm-slideout{width:calc(100% - 50px);-webkit-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0);width:calc(100% - var(--mm-sidebar-collapsed-size));-webkit-transform:translate3d(var(--mm-sidebar-collapsed-size),0,0);transform:translate3d(var(--mm-sidebar-collapsed-size),0,0)}.mm-wrapper_sidebar-collapsed:not(.mm-wrapper_opening) .mm-menu_hidedivider .mm-divider,.mm-wrapper_sidebar-collapsed:not(.mm-wrapper_opening) .mm-menu_hidenavbar .mm-navbar{opacity:0}.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded{width:440px;width:var(--mm-sidebar-expanded-size);min-width:0!important;max-width:100000px!important;border-right-width:1px;border-right-style:solid}.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded.mm-menu_pageshadow:after{content:none;display:none}.mm-wrapper_sidebar-expanded.mm-wrapper_blocking,.mm-wrapper_sidebar-expanded.mm-wrapper_blocking body{overflow:visible}.mm-wrapper_sidebar-expanded .mm-wrapper__blocker{display:none!important}.mm-wrapper_sidebar-expanded:not(.mm-wrapper_sidebar-closed) .mm-menu_sidebar-expanded.mm-menu_opened~.mm-slideout{width:calc(100% - 440px);-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0);width:calc(100% - var(--mm-sidebar-expanded-size));-webkit-transform:translate3d(var(--mm-sidebar-expanded-size),0,0);transform:translate3d(var(--mm-sidebar-expanded-size),0,0)}.mm-menu__blocker{background:rgba(3,2,1,0);display:block;position:absolute;top:0;right:0;bottom:0;left:0;z-index:3}.mm-menu_opened .mm-menu__blocker{display:none}[dir=rtl].mm-wrapper_sidebar-collapsed .mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[dir=rtl].mm-wrapper_sidebar-expanded .mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[dir=rtl].mm-wrapper_sidebar-expanded:not(.mm-wrapper_sidebar-closed) .mm-menu_sidebar-expanded.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}input.mm-toggle{margin-top:5px;background:rgba(0,0,0,.1);display:inline-block;min-width:58px;width:58px;height:34px;margin:0 10px;margin-top:calc((var(--mm-listitem-size) - 34px)/ 2);border:none!important;background:var(--mm-color-border);border-radius:34px;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;cursor:pointer;-webkit-transition:background-color .2s ease;-o-transition:background-color .2s ease;transition:background-color .2s ease}input.mm-toggle:before{background:#f3f3f3}input.mm-toggle:before{content:'';display:block;width:32px;height:32px;margin:1px;border-radius:34px;background:var(--mm-color-background);-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;-o-transition:transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}input.mm-toggle:checked{background:#4bd963}input.mm-toggle:checked:before{-webkit-transform:translateX(24px);-ms-transform:translateX(24px);transform:translateX(24px)}input.mm-check{margin-top:2px;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;border:none!important;background:0 0!important;cursor:pointer;display:inline-block;width:40px;height:40px;margin:0 10px;margin-top:calc((var(--mm-listitem-size) - 40px)/ 2)}input.mm-check:before{content:'';display:block;width:40%;height:20%;margin:25% 0 0 20%;border-left:3px solid;border-bottom:3px solid;border-color:var(--mm-color-text);opacity:.3;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease}input.mm-check:checked:before{opacity:1}[dir=rtl] input.mm-toggle:checked~label.mm-toggle:before{float:left}.mm-menu_border-none .mm-listitem:after{content:none}.mm-menu_border-full .mm-listitem:after{left:0!important}.mm-menu_fx-menu-slide{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-wrapper_opened .mm-menu_fx-menu-slide{-webkit-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0)}.mm-wrapper_opening .mm-menu_fx-menu-slide{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-wrapper_opened .mm-menu_fx-menu-slide.mm-menu_position-right{-webkit-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0)}.mm-wrapper_opening .mm-menu_fx-menu-slide.mm-menu_position-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-none .mm-panel,.mm-panel_fx-none{-webkit-transition-property:none;-o-transition-property:none;transition-property:none}.mm-menu_fx-panels-none .mm-panel.mm-panel_opened-parent,.mm-panel_fx-none.mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-slide-0 .mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-slide-100 .mm-panel_opened-parent{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mm-menu_fullscreen{width:100%;min-width:140px;max-width:10000px}.mm-wrapper_opening .mm-menu_fullscreen~.mm-slideout{-webkit-transform:translate3d(100vw,0,0);transform:translate3d(100vw,0,0)}@media all and (max-width:140px){.mm-wrapper_opening .mm-menu_fullscreen~.mm-slideout{-webkit-transform:translate3d(140px,0,0);transform:translate3d(140px,0,0)}}@media all and (min-width:10000px){.mm-wrapper_opening .mm-menu_fullscreen~.mm-slideout{-webkit-transform:translate3d(10000px,0,0);transform:translate3d(10000px,0,0)}}.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-100vw,0,0);transform:translate3d(-100vw,0,0)}@media all and (max-width:140px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-140px,0,0);transform:translate3d(-140px,0,0)}}@media all and (min-width:10000px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-10000px,0,0);transform:translate3d(-10000px,0,0)}}.mm-menu_fullscreen.mm-menu_position-top{height:100vh;min-height:140px;max-height:10000px}.mm-menu_fullscreen.mm-menu_position-bottom{height:100vh;min-height:140px;max-height:10000px}.mm-menu_listview-justify .mm-panels>.mm-panel{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.mm-menu_listview-justify .mm-panels>.mm-panel:after{content:none;display:none}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listview{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;margin-top:0;margin-bottom:0}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listitem{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:50px}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listitem__text{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.mm-listview_inset{list-style:inside disc;width:100%;padding:0 30px 15px 30px;margin:0}.mm-listview_inset .mm-listitem{padding:5px 0}.mm-menu_multiline .mm-listitem__text{-o-text-overflow:clip;text-overflow:clip;white-space:normal}[class*=mm-menu_pagedim].mm-menu_opened~.mm-wrapper__blocker{opacity:0}.mm-wrapper_opening [class*=mm-menu_pagedim].mm-menu_opened~.mm-wrapper__blocker{opacity:.3;-webkit-transition:opacity .4s ease .4s;-o-transition:opacity .4s ease .4s;transition:opacity .4s ease .4s}.mm-menu_opened.mm-menu_pagedim~.mm-wrapper__blocker{background:inherit}.mm-menu_opened.mm-menu_pagedim-black~.mm-wrapper__blocker{background:#000}.mm-menu_opened.mm-menu_pagedim-white~.mm-wrapper__blocker{background:#fff}.mm-menu_popup{-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease;opacity:0;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);height:80%;min-height:140px;max-height:880px;top:50%;left:50%;bottom:auto;right:auto;z-index:2;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.mm-menu_popup.mm-menu_opened~.mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-menu_popup.mm-menu_opened~.mm-wrapper__blocker{-webkit-transition-delay:0s!important;-o-transition-delay:0s!important;transition-delay:0s!important;z-index:1}.mm-wrapper_opening .mm-menu_popup{opacity:1}.mm-menu_position-right{left:auto;right:0}.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-440px,0,0);transform:translate3d(-440px,0,0)}}.mm-menu_position-bottom,.mm-menu_position-front,.mm-menu_position-top{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-menu_position-bottom.mm-menu_opened,.mm-menu_position-front.mm-menu_opened,.mm-menu_position-top.mm-menu_opened{z-index:2}.mm-menu_position-bottom.mm-menu_opened~.mm-slideout,.mm-menu_position-front.mm-menu_opened~.mm-slideout,.mm-menu_position-top.mm-menu_opened~.mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-menu_position-bottom.mm-menu_opened~.mm-wrapper__blocker,.mm-menu_position-front.mm-menu_opened~.mm-wrapper__blocker,.mm-menu_position-top.mm-menu_opened~.mm-wrapper__blocker{z-index:1}.mm-menu_position-front{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mm-menu_position-front.mm-menu_position-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_position-bottom,.mm-menu_position-top{width:100%;min-width:100%;max-width:100%}.mm-menu_position-top{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.mm-menu_position-top{height:80vh;min-height:140px;max-height:880px}.mm-menu_position-bottom{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);top:auto}.mm-menu_position-bottom{height:80vh;min-height:140px;max-height:880px}.mm-wrapper_opening .mm-menu_position-bottom,.mm-wrapper_opening .mm-menu_position-front,.mm-wrapper_opening .mm-menu_position-top{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_shadow-page:after{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);content:'';display:block;width:20px;height:120%;position:absolute;left:100%;top:-10%;z-index:100;-webkit-clip-path:polygon(-20px 0,0 0,0 100%,-20px 100%);clip-path:polygon(-20px 0,0 0,0 100%,-20px 100%);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)}.mm-menu_shadow-page.mm-menu_position-right:after{left:auto;right:100%;-webkit-clip-path:polygon(20px 0,40px 0,40px 100%,20px 100%);clip-path:polygon(20px 0,40px 0,40px 100%,20px 100%)}.mm-menu_shadow-page.mm-menu_position-front:after{content:none;display:none}.mm-menu_shadow-menu{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)}.mm-menu_shadow-panels .mm-panels>.mm-panel{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)}.mm-menu_theme-white{--mm-color-border:rgba( 0,0,0, 0.1 );--mm-color-button:rgba( 0,0,0, 0.3 );--mm-color-text:rgba( 0,0,0, 0.7 );--mm-color-text-dimmed:rgba( 0,0,0, 0.3 );--mm-color-background:#fff;--mm-color-background-highlight:rgba( 0,0,0, 0.06 );--mm-color-background-emphasis:rgba( 0,0,0, 0.03 );--mm-shadow:0 0 10px rgba( 0,0,0, 0.2 )}.mm-menu_theme-dark{--mm-color-border:rgba( 0,0,0, 0.3 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.85 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#333;--mm-color-background-highlight:rgba( 255,255,255, 0.08 );--mm-color-background-emphasis:rgba( 0,0,0, 0.1 );--mm-shadow:0 0 20px rgba( 0,0,0, 0.5 )}.mm-menu_theme-black{--mm-color-border:rgba( 255,255,255, 0.25 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.75 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#000;--mm-color-background-highlight:rgba( 255,255,255, 0.2 );--mm-color-background-emphasis:rgba( 255,255,255, 0.15 );--mm-shadow:none}body.modal-open .mm-slideout{z-index:unset}
\ No newline at end of file
diff --git a/dist/mmenu.js b/dist/mmenu.js
new file mode 100644
index 0000000..8520905
--- /dev/null
+++ b/dist/mmenu.js
@@ -0,0 +1,12 @@
+!function(e){var t={};function n(i){if(t[i])return t[i].exports;var s=t[i]={i:i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)n.d(i,s,function(t){return e[t]}.bind(null,s));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t);var i={hooks:{},extensions:[],wrappers:[],navbar:{add:!0,sticky:!0,title:"Menu",titleLink:"parent"},onClick:{close:null,preventDefault:null,setSelected:!0},slidingSubmenus:!0},s={classNames:{inset:"Inset",nolistview:"NoListview",nopanel:"NoPanel",panel:"Panel",selected:"Selected",vertical:"Vertical"},language:null,openingInterval:25,panelNodetype:["ul","ol","div"],transitionDuration:400};function a(e,t){for(var n in"object"!=o(e)&&(e={}),"object"!=o(t)&&(t={}),t)t.hasOwnProperty(n)&&(void 0===e[n]?e[n]=t[n]:"object"==o(e[n])&&a(e[n],t[n]));return e}function o(e){return{}.toString.call(e).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function r(e,t,n){if("function"==typeof t){var i=t.call(e);if(void 0!==i)return i}return null!==t&&"function"!=typeof t&&void 0!==t||void 0===n?t:n}function c(e,t,n){var i=!1,s=function(n){void 0!==n&&n.target!==e||(i||(e.removeEventListener("transitionend",s),e.removeEventListener("webkitTransitionEnd",s),t.call(e)),i=!0)};e.addEventListener("transitionend",s),e.addEventListener("webkitTransitionEnd",s),setTimeout(s,1.1*n)}function l(){return"mm-"+m++}var m=0;function d(e){return"mm-"==e.slice(0,3)?e.slice(3):e}var p={};function u(e,t){void 0===p[t]&&(p[t]={}),a(p[t],e)}var f={Menu:"منو"},h={Menu:"Menü"},v={Menu:"Меню"};function b(e){var t=e.split("."),n=document.createElement(t.shift());return t.forEach((function(e){n.classList.add(e)})),n}function g(e,t){return Array.prototype.slice.call(e.querySelectorAll(t))}function _(e,t){var n=Array.prototype.slice.call(e.children);return t?n.filter((function(e){return e.matches(t)})):n}function y(e,t){for(var n=[],i=e.parentElement;i;)n.push(i),i=i.parentElement;return t?n.filter((function(e){return e.matches(t)})):n}function w(e){return e.filter((function(e){return!e.matches(".mm-hidden")}))}function L(e){var t=[];return w(e).forEach((function(e){t.push.apply(t,_(e,"a.mm-listitem__text"))})),t.filter((function(e){return!e.matches(".mm-btn_next")}))}function E(e,t,n){e.matches("."+t)&&(e.classList.remove(t),e.classList.add(n))}var x={};function P(e,t,n){"number"==typeof e&&(e="(min-width: "+e+"px)"),x[e]=x[e]||[],x[e].push({yes:t,no:n})}function k(e,t){for(var n=t.matches?"yes":"no",i=0;i-1&&t.append(n)})),this.node.menu.append(t),this.node.pnls=t,this.node.menu.classList.add("mm-menu"),this.trigger("initMenu:after")},e.prototype._initPanels=function(){var e=this;this.trigger("initPanels:before"),this.clck.push((function(t,n){if(n.inMenu){var i=t.getAttribute("href");if(i&&i.length>1&&"#"==i.slice(0,1))try{var s=g(e.node.menu,i)[0];if(s&&s.matches(".mm-panel"))return t.parentElement.matches(".mm-listitem_vertical")?e.togglePanel(s):e.openPanel(s),!0}catch(e){}}})),_(this.node.pnls).forEach((function(t){e.initPanel(t)})),this.trigger("initPanels:after")},e.prototype.initPanel=function(e){var t=this,n=this.conf.panelNodetype.join(", ");if(e.matches(n)&&(e.matches(".mm-panel")||(e=this._initPanel(e)),e)){var i=[];i.push.apply(i,_(e,"."+this.conf.classNames.panel)),_(e,".mm-listview").forEach((function(e){_(e,".mm-listitem").forEach((function(e){i.push.apply(i,_(e,n))}))})),i.forEach((function(e){t.initPanel(e)}))}},e.prototype._initPanel=function(e){var t=this;if(this.trigger("initPanel:before",[e]),E(e,this.conf.classNames.panel,"mm-panel"),E(e,this.conf.classNames.nopanel,"mm-nopanel"),E(e,this.conf.classNames.inset,"mm-listview_inset"),e.matches(".mm-listview_inset")&&e.classList.add("mm-nopanel"),e.matches(".mm-nopanel"))return null;var n=e.id||l(),i=e.matches("."+this.conf.classNames.vertical)||!this.opts.slidingSubmenus;if(e.classList.remove(this.conf.classNames.vertical),e.matches("ul, ol")){e.removeAttribute("id");var s=b("div");e.before(s),s.append(e),e=s}e.id=n,e.classList.add("mm-panel"),e.classList.add("mm-hidden");var a=[e.parentElement].filter((function(e){return e.matches("li")}))[0];if(i?a&&a.classList.add("mm-listitem_vertical"):this.node.pnls.append(e),a&&(a.mmChild=e,e.mmParent=a,a&&a.matches(".mm-listitem")&&!_(a,".mm-btn").length)){var o=_(a,".mm-listitem__text")[0];if(o){var r=b("a.mm-btn.mm-btn_next.mm-listitem__btn");r.setAttribute("href","#"+e.id),o.matches("span")?(r.classList.add("mm-listitem__text"),r.innerHTML=o.innerHTML,a.insertBefore(r,o.nextElementSibling),o.remove()):a.insertBefore(r,_(a,".mm-panel")[0])}}return this._initNavbar(e),_(e,"ul, ol").forEach((function(e){t.initListview(e)})),this.trigger("initPanel:after",[e]),e},e.prototype._initNavbar=function(e){if(this.trigger("initNavbar:before",[e]),!_(e,".mm-navbar").length){var t=null,n=null;if(e.getAttribute("data-mm-parent")?n=g(this.node.pnls,e.getAttribute("data-mm-parent"))[0]:(t=e.mmParent)&&(n=t.closest(".mm-panel")),!t||!t.matches(".mm-listitem_vertical")){var i=b("div.mm-navbar");if(this.opts.navbar.add?this.opts.navbar.sticky&&i.classList.add("mm-navbar_sticky"):i.classList.add("mm-hidden"),n){var s=b("a.mm-btn.mm-btn_prev.mm-navbar__btn");s.setAttribute("href","#"+n.id),i.append(s)}var a=null;t?a=_(t,".mm-listitem__text")[0]:n&&(a=g(n,'a[href="#'+e.id+'"]')[0]);var o=b("a.mm-navbar__title"),r=b("span");switch(o.append(r),r.innerHTML=e.getAttribute("data-mm-title")||(a?a.textContent:"")||this.i18n(this.opts.navbar.title)||this.i18n("Menu"),this.opts.navbar.titleLink){case"anchor":a&&o.setAttribute("href",a.getAttribute("href"));break;case"parent":n&&o.setAttribute("href","#"+n.id)}i.append(o),e.prepend(i),this.trigger("initNavbar:after",[e])}}},e.prototype.initListview=function(e){var t=this;this.trigger("initListview:before",[e]),E(e,this.conf.classNames.nolistview,"mm-nolistview"),e.matches(".mm-nolistview")||(e.classList.add("mm-listview"),_(e).forEach((function(e){e.classList.add("mm-listitem"),E(e,t.conf.classNames.selected,"mm-listitem_selected"),_(e,"a, span").forEach((function(e){e.matches(".mm-btn")||e.classList.add("mm-listitem__text")}))}))),this.trigger("initListview:after",[e])},e.prototype._initOpened=function(){this.trigger("initOpened:before");var e=this.node.pnls.querySelectorAll(".mm-listitem_selected"),t=null;e.forEach((function(e){t=e,e.classList.remove("mm-listitem_selected")})),t&&t.classList.add("mm-listitem_selected");var n=t?t.closest(".mm-panel"):_(this.node.pnls,".mm-panel")[0];this.openPanel(n,!1),this.trigger("initOpened:after")},e.prototype._initAnchors=function(){var e=this;this.trigger("initAnchors:before"),document.addEventListener("click",(function(t){var n=t.target.closest("a[href]");if(n){for(var i={inMenu:n.closest(".mm-menu")===e.node.menu,inListview:n.matches(".mm-listitem > a"),toExternal:n.matches('[rel="external"]')||n.matches('[target="_blank"]')},s={close:null,setSelected:null,preventDefault:"#"==n.getAttribute("href").slice(0,1)},c=0;c1){var i=b("div");n[0].before(i),n.forEach((function(e){i.append(e)})),n=[i]}e=n[0]}e.classList.add("mm-page"),e.classList.add("mm-slideout"),e.id=e.id||l(),S.node.page=e,this.trigger("setPage:after",[e])};var H=function(){var e=this;N(document.body,"keydown.tabguard"),C(document.body,"keydown.tabguard",(function(t){9==t.keyCode&&e.node.wrpr.matches(".mm-wrapper_opened")&&t.preventDefault()}))},j=function(){var e=this;this.trigger("initBlocker:before");var t=this.opts.offCanvas,n=this.conf.offCanvas;if(t.blockUI){if(!S.node.blck){var i=b("div.mm-wrapper__blocker.mm-slideout");i.innerHTML="",document.querySelector(n.menu.insertSelector).append(i),S.node.blck=i}var s=function(t){t.preventDefault(),t.stopPropagation(),e.node.wrpr.matches(".mm-wrapper_modal")||e.close()};S.node.blck.addEventListener("mousedown",s),S.node.blck.addEventListener("touchstart",s),S.node.blck.addEventListener("touchmove",s),this.trigger("initBlocker:after")}},D={aria:!0,text:!0};var O={text:{closeMenu:"Close menu",closeSubmenu:"Close submenu",openSubmenu:"Open submenu",toggleSubmenu:"Toggle submenu"}},I={"Close menu":"بستن منو","Close submenu":"بستن زیرمنو","Open submenu":"بازکردن زیرمنو","Toggle submenu":"سوییچ زیرمنو"},q={"Close menu":"Menü schließen","Close submenu":"Untermenü schließen","Open submenu":"Untermenü öffnen","Toggle submenu":"Untermenü wechseln"},B={"Close menu":"Закрыть меню","Close submenu":"Закрыть подменю","Open submenu":"Открыть подменю","Toggle submenu":"Переключить подменю"};u({"Close menu":"Menu sluiten","Close submenu":"Submenu sluiten","Open submenu":"Submenu openen","Toggle submenu":"Submenu wisselen"},"nl"),u(I,"fa"),u(q,"de"),u(B,"ru"),S.options.screenReader=D,S.configs.screenReader=O;var z;z=function(e,t,n){e[t]=n,n?e.setAttribute(t,n.toString()):e.removeAttribute(t)},S.sr_aria=function(e,t,n){z(e,"aria-"+t,n)},S.sr_role=function(e,t){z(e,"role",t)},S.sr_text=function(e){return''+e+""};var R={fix:!0};var U="ontouchstart"in window||!!navigator.msMaxTouchPoints||!1;S.options.scrollBugFix=R;var W={height:"default"};S.options.autoHeight=W;var Y={close:!1,open:!1};S.options.backButton=Y;var F={add:!1,visible:{min:1,max:3}};S.options.columns=F;var X={add:!1,addTo:"panels",count:!1};S.options.counters=X,S.configs.classNames.counters={counter:"Counter"};var V={add:!1,addTo:"panels"};S.options.dividers=V,S.configs.classNames.divider="Divider";var Z={open:!1,node:null};var G="ontouchstart"in window||!!navigator.msMaxTouchPoints||!1,K={top:0,right:0,bottom:0,left:0},Q={start:15,swipe:15},J={x:["Right","Left"],y:["Down","Up"]},$=0,ee=1,te=2,ne=function(e,t){return"string"==typeof e&&"%"==e.slice(-1)&&(e=t*((e=parseInt(e.slice(0,-1),10))/100)),e},ie=function(){function e(e,t,n){this.surface=e,this.area=a(t,K),this.treshold=a(n,Q),this.surface.mmHasDragEvents||(this.surface.addEventListener(G?"touchstart":"mousedown",this.start.bind(this)),this.surface.addEventListener(G?"touchend":"mouseup",this.stop.bind(this)),this.surface.addEventListener(G?"touchleave":"mouseleave",this.stop.bind(this)),this.surface.addEventListener(G?"touchmove":"mousemove",this.move.bind(this))),this.surface.mmHasDragEvents=!0}return e.prototype.start=function(e){this.currentPosition={x:e.touches?e.touches[0].pageX:e.pageX||0,y:e.touches?e.touches[0].pageY:e.pageY||0};var t=this.surface.clientWidth,n=this.surface.clientHeight,i=ne(this.area.top,n);if(!("number"==typeof i&&this.currentPosition.ys))){var a=ne(this.area.bottom,n);if(!("number"==typeof a&&(a=n-a,this.currentPosition.y>a))){var o=ne(this.area.left,t);"number"==typeof o&&this.currentPosition.xthis.treshold.swipe){var i=this._swipeDirection();n.direction=i,this._dispatchEvents("swipe*",n)}}this.state=$},e.prototype.move=function(e){switch(this.state){case ee:case te:var t={x:e.changedTouches?e.touches[0].pageX:e.pageX||0,y:e.changedTouches?e.touches[0].pageY:e.pageY||0};this.movement={x:t.x-this.currentPosition.x,y:t.y-this.currentPosition.y},this.distance={x:t.x-this.startPosition.x,y:t.y-this.startPosition.y},this.currentPosition={x:t.x,y:t.y},this.axis=Math.abs(this.distance.x)>Math.abs(this.distance.y)?"x":"y";var n=this._dragDirection(),i=this._eventDetail(n);this.state==ee&&Math.abs(this.distance[this.axis])>this.treshold.start&&(this._dispatchEvents("drag*Start",i),this.state=te),this.state==te&&this._dispatchEvents("drag*Move",i)}},e.prototype._eventDetail=function(e){var t=this.distance.x,n=this.distance.y;return"x"==this.axis&&(t-=t>0?this.treshold.start:0-this.treshold.start),"y"==this.axis&&(n-=n>0?this.treshold.start:0-this.treshold.start),{axis:this.axis,direction:e,movementX:this.movement.x,movementY:this.movement.y,distanceX:t,distanceY:n}},e.prototype._dispatchEvents=function(e,t){var n=new CustomEvent(e.replace("*",""),{detail:t});this.surface.dispatchEvent(n);var i=new CustomEvent(e.replace("*",this.axis.toUpperCase()),{detail:t});this.surface.dispatchEvent(i);var s=new CustomEvent(e.replace("*",t.direction),{detail:t});this.surface.dispatchEvent(s)},e.prototype._dragDirection=function(){return J[this.axis][this.distance[this.axis]>0?0:1]},e.prototype._swipeDirection=function(){return J[this.axis][this.movement[this.axis]>0?0:1]},e}(),se=null,ae=null,oe=0,re=function(e){var t=this,n={},i=!1,s=function(){var e=Object.keys(t.opts.extensions);e.length?(P(e.join(", "),(function(){}),(function(){n=ce(n,[],t.node.menu)})),e.forEach((function(e){P(e,(function(){n=ce(n,t.opts.extensions[e],t.node.menu)}),(function(){}))}))):n=ce(n,[],t.node.menu)};ae&&(N(ae,"dragStart"),N(ae,"dragMove"),N(ae,"dragEnd")),se=new ie(ae=e),s(),s=function(){},ae&&(C(ae,"dragStart",(function(e){e.detail.direction==n.direction&&(i=!0,t.node.wrpr.classList.add("mm-wrapper_dragging"),t._openSetup(),t.trigger("open:start"),oe=t.node.menu["x"==n.axis?"clientWidth":"clientHeight"])})),C(ae,"dragMove",(function(e){if(e.detail.axis==n.axis&&i){var t=e.detail["distance"+n.axis.toUpperCase()];switch(n.position){case"right":case"bottom":t=Math.min(Math.max(t,-oe),0);break;default:t=Math.max(Math.min(t,oe),0)}if("front"==n.zposition)switch(n.position){case"right":case"bottom":t+=oe;break;default:t-=oe}n.slideOutNodes.forEach((function(e){e.style.transform="translate"+n.axis.toUpperCase()+"("+t+"px)"}))}})),C(ae,"dragEnd",(function(e){if(e.detail.axis==n.axis&&i){i=!1,t.node.wrpr.classList.remove("mm-wrapper_dragging"),n.slideOutNodes.forEach((function(e){e.style.transform=""}));var s=Math.abs(e.detail["distance"+n.axis.toUpperCase()])>=.75*oe;if(!s){var a=e.detail["movement"+n.axis.toUpperCase()];switch(n.position){case"right":case"bottom":s=a<=0;break;default:s=a>=0}}s?t._openStart():t.close()}})))},ce=function(e,t,n){switch(e.position="left",e.zposition="back",["right","top","bottom"].forEach((function(n){t.indexOf("position-"+n)>-1&&(e.position=n)})),["front","top","bottom"].forEach((function(n){t.indexOf("position-"+n)>-1&&(e.zposition="front")})),se.area={top:"bottom"==e.position?"75%":0,right:"left"==e.position?"75%":0,bottom:"top"==e.position?"75%":0,left:"right"==e.position?"75%":0},e.position){case"top":case"bottom":e.axis="y";break;default:e.axis="x"}switch(e.position){case"top":e.direction="Down";break;case"right":e.direction="Left";break;case"bottom":e.direction="Up";break;default:e.direction="Right"}switch(e.zposition){case"front":e.slideOutNodes=[n];break;default:e.slideOutNodes=g(document.body,".mm-slideout")}return e};S.options.drag=Z;var le={drop:!1,fitViewport:!0,event:"click",position:{},tip:!0};var me={offset:{button:{x:-5,y:5},viewport:{x:20,y:20}},height:{max:880},width:{max:440}};S.options.dropdown=le,S.configs.dropdown=me;var de={insertMethod:"append",insertSelector:"body"};S.configs.fixedElements=de,S.configs.classNames.fixedElements={fixed:"Fixed"};var pe={use:!1,top:[],bottom:[],position:"left",type:"default"};S.options.iconbar=pe;var ue={add:!1,blockPanel:!0,hideDivider:!1,hideNavbar:!0,visible:3};S.options.iconPanels=ue;var fe={enable:!1,enhance:!1};S.options.keyboardNavigation=fe;var he=function(e){var t=this;N(document.body,"keydown.tabguard"),N(document.body,"focusin.tabguard"),C(document.body,"focusin.tabguard",(function(e){if(t.node.wrpr.matches(".mm-wrapper_opened")){var n=e.target;if(n.matches(".mm-tabend")){var i=void 0;n.parentElement.matches(".mm-menu")&&S.node.blck&&(i=S.node.blck),n.parentElement.matches(".mm-wrapper__blocker")&&(i=g(document.body,".mm-menu_offcanvas.mm-menu_opened")[0]),i||(i=n.parentElement),i&&_(i,".mm-tabstart")[0].focus()}}})),N(document.body,"keydown.navigate"),C(document.body,"keydown.navigate",(function(t){var n=t.target,i=n.closest(".mm-menu");if(i){i.mmApi;if(!n.matches("input, textarea"))switch(t.keyCode){case 13:(n.matches(".mm-toggle")||n.matches(".mm-check"))&&n.dispatchEvent(new Event("click"));break;case 32:case 37:case 38:case 39:case 40:t.preventDefault()}if(e)if(n.matches("input"))switch(t.keyCode){case 27:n.value=""}else{var s=i.mmApi;switch(t.keyCode){case 8:var a=g(i,".mm-panel_opened")[0].mmParent;a&&s.openPanel(a.closest(".mm-panel"));break;case 27:i.matches(".mm-menu_offcanvas")&&s.close()}}}}))},ve={load:!1};S.options.lazySubmenus=ve;var be=[];var ge={breadcrumbs:{separator:"/",removeFirst:!1}};function _e(){var e=this,t=this.opts.navbars;if(void 0!==t){t instanceof Array||(t=[t]);var n={};t.length&&(t.forEach((function(t){if(!(t=function(e){return"boolean"==typeof e&&e&&(e={}),"object"!=typeof e&&(e={}),void 0===e.content&&(e.content=["prev","title"]),e.content instanceof Array||(e.content=[e.content]),void 0===e.use&&(e.use=!0),"boolean"==typeof e.use&&e.use&&(e.use=!0),e}(t)).use)return!1;var i=b("div.mm-navbar"),s=t.position;"bottom"!==s&&(s="top"),n[s]||(n[s]=b("div.mm-navbars_"+s)),n[s].append(i);for(var a=0,o=t.content.length;a"+r+"":''+r+"")}a=!1}s=s.mmParent}t.conf.navbars.breadcrumbs.removeFirst&&n.shift(),i.innerHTML=n.join(''+t.conf.navbars.breadcrumbs.separator+""),_(e,".mm-navbar")[0].append(i)}})),this.bind("openPanel:start",(function(e){var t=e.querySelector(".mm-navbar__breadcrumbs");n.innerHTML=t?t.innerHTML:""})),this.bind("initNavbar:after:sr-aria",(function(e){g(e,".mm-breadcrumbs a").forEach((function(e){S.sr_aria(e,"owns",e.getAttribute("href").slice(1))}))}))},close:function(e){var t=this,n=b("a.mm-btn.mm-btn_close.mm-navbar__btn");e.append(n),this.bind("setPage:after",(function(e){n.setAttribute("href","#"+e.id)})),this.bind("setPage:after:sr-text",(function(){n.innerHTML=S.sr_text(t.i18n(t.conf.screenReader.text.closeMenu)),S.sr_aria(n,"owns",n.getAttribute("href").slice(1))}))},prev:function(e){var t,n,i,s=this,a=b("a.mm-btn.mm-btn_prev.mm-navbar__btn");e.append(a),this.bind("initNavbar:after",(function(e){_(e,".mm-navbar")[0].classList.add("mm-hidden")})),this.bind("openPanel:start",(function(e){e.parentElement.matches(".mm-listitem_vertical")||((t=e.querySelector("."+s.conf.classNames.navbars.panelPrev))||(t=e.querySelector(".mm-navbar__btn.mm-btn_prev")),n=t?t.getAttribute("href"):"",i=t?t.innerHTML:"",n?a.setAttribute("href",n):a.removeAttribute("href"),a.classList[n||i?"remove":"add"]("mm-hidden"),a.innerHTML=i)})),this.bind("initNavbar:after:sr-aria",(function(e){S.sr_aria(e.querySelector(".mm-navbar"),"hidden",!0)})),this.bind("openPanel:start:sr-aria",(function(e){S.sr_aria(a,"hidden",a.matches(".mm-hidden")),S.sr_aria(a,"owns",(a.getAttribute("href")||"").slice(1))}))},searchfield:function(e){"object"!=o(this.opts.searchfield)&&(this.opts.searchfield={});var t=b("div.mm-navbar__searchfield");e.append(t),this.opts.searchfield.add=!0,this.opts.searchfield.addTo=[t]},title:function(e){var t,n,i,s,a=this,o=b("a.mm-navbar__title"),r=b("span");o.append(r),e.append(o),this.bind("openPanel:start",(function(e){e.parentElement.matches(".mm-listitem_vertical")||((i=e.querySelector("."+a.conf.classNames.navbars.panelTitle))||(i=e.querySelector(".mm-navbar__title span")),(t=i&&i.closest("a")?i.closest("a").getAttribute("href"):"")?o.setAttribute("href",t):o.removeAttribute("href"),n=i?i.innerHTML:"",r.innerHTML=n)})),this.bind("openPanel:start:sr-aria",(function(e){if(a.opts.screenReader.text){if(!s)_(a.node.menu,".mm-navbars_top, .mm-navbars_bottom").forEach((function(e){var t=e.querySelector(".mm-btn_prev");t&&(s=t)}));if(s){var t=!0;"parent"==a.opts.navbar.titleLink&&(t=!s.matches(".mm-hidden")),S.sr_aria(o,"hidden",t)}}}))}},_e.navbarTypes={tabs:function(e){var t=this;e.classList.add("mm-navbar_tabs"),e.parentElement.classList.add("mm-navbars_has-tabs");var n=_(e,"a");e.addEventListener("click",(function(e){var n=e.target;if(n.matches("a"))if(n.matches(".mm-navbar__tab_selected"))e.stopImmediatePropagation();else try{t.openPanel(t.node.menu.querySelector(n.getAttribute("href")),!1),e.stopImmediatePropagation()}catch(e){}})),this.bind("openPanel:start",(function e(t){n.forEach((function(e){e.classList.remove("mm-navbar__tab_selected")}));var i=n.filter((function(e){return e.matches('[href="#'+t.id+'"]')}))[0];if(i)i.classList.add("mm-navbar__tab_selected");else{var s=t.mmParent;s&&e.call(this,s.closest(".mm-panel"))}}))}};var ye={scroll:!1,update:!1};var we={scrollOffset:0,updateOffset:50};S.options.pageScroll=ye,S.configs.pageScroll=we;var Le={add:!1,addTo:"panels",cancel:!1,noResults:"No results found.",placeholder:"Search",panel:{add:!1,dividers:!0,fx:"none",id:null,splash:null,title:"Search"},search:!0,showTextItems:!1,showSubPanels:!0};var Ee={clear:!1,form:!1,input:!1,submit:!1},xe={Search:"جستجو","No results found.":"نتیجهای یافت نشد.",cancel:"انصراف"},Pe={Search:"Suche","No results found.":"Keine Ergebnisse gefunden.",cancel:"beenden"},ke={Search:"Найти","No results found.":"Ничего не найдено.",cancel:"отменить"};u({Search:"Zoeken","No results found.":"Geen resultaten gevonden.",cancel:"annuleren"},"nl"),u(xe,"fa"),u(Pe,"de"),u(ke,"ru"),S.options.searchfield=Le,S.configs.searchfield=Ee;var Se=function(){var e=this.opts.searchfield,t=(this.conf.searchfield,_(this.node.pnls,".mm-panel_search")[0]);if(t)return t;t=b("div.mm-panel.mm-panel_search.mm-hidden"),e.panel.id&&(t.id=e.panel.id),e.panel.title&&t.setAttribute("data-mm-title",e.panel.title);var n=b("ul");switch(t.append(n),this.node.pnls.append(t),this.initListview(n),this._initNavbar(t),e.panel.fx){case!1:break;case"none":t.classList.add("mm-panel_noanimation");break;default:t.classList.add("mm-panel_fx-"+e.panel.fx)}if(e.panel.splash){var i=b("div.mm-panel__content");i.innerHTML=e.panel.splash,t.append(i)}return t.classList.add("mm-panel"),t.classList.add("mm-hidden"),this.node.pnls.append(t),t},Me=function(e){var t=this.opts.searchfield,n=this.conf.searchfield;if(e.parentElement.matches(".mm-listitem_vertical"))return null;if(a=g(e,".mm-searchfield")[0])return a;function i(e,t){if(t)for(var n in t)e.setAttribute(n,t[n])}var s,a=b((n.form?"form":"div")+".mm-searchfield"),o=b("div.mm-searchfield__input"),r=b("input");(r.type="text",r.autocomplete="off",r.placeholder=this.i18n(t.placeholder),o.append(r),a.append(o),e.prepend(a),i(r,n.input),n.clear)&&((s=b("a.mm-btn.mm-btn_close.mm-searchfield__btn")).setAttribute("href","#"),o.append(s));(i(a,n.form),n.form&&n.submit&&!n.clear)&&((s=b("a.mm-btn.mm-btn_next.mm-searchfield__btn")).setAttribute("href","#"),o.append(s));t.cancel&&((s=b("a.mm-searchfield__cancel")).setAttribute("href","#"),s.textContent=this.i18n("cancel"),a.append(s));return a},Ae=function(e){var t=this,n=this.opts.searchfield,i=(this.conf.searchfield,{});e.closest(".mm-panel_search")?(i.panels=g(this.node.pnls,".mm-panel"),i.noresults=[e.closest(".mm-panel")]):e.closest(".mm-panel")?(i.panels=[e.closest(".mm-panel")],i.noresults=i.panels):(i.panels=g(this.node.pnls,".mm-panel"),i.noresults=[this.node.menu]),i.panels=i.panels.filter((function(e){return!e.matches(".mm-panel_search")})),i.panels=i.panels.filter((function(e){return!e.parentElement.matches(".mm-listitem_vertical")})),i.listitems=[],i.dividers=[],i.panels.forEach((function(e){var t,n;(t=i.listitems).push.apply(t,g(e,".mm-listitem")),(n=i.dividers).push.apply(n,g(e,".mm-divider"))}));var s=_(this.node.pnls,".mm-panel_search")[0],a=g(e,"input")[0],o=g(e,".mm-searchfield__cancel")[0];a.mmSearchfield=i,n.panel.add&&n.panel.splash&&(N(a,"focus.splash"),C(a,"focus.splash",(function(e){t.openPanel(s)}))),n.cancel&&(N(a,"focus.cancel"),C(a,"focus.cancel",(function(e){o.classList.add("mm-searchfield__cancel-active")})),N(o,"click.splash"),C(o,"click.splash",(function(e){if(e.preventDefault(),o.classList.remove("mm-searchfield__cancel-active"),s.matches(".mm-panel_opened")){var n=_(t.node.pnls,".mm-panel_opened-parent");n.length&&t.openPanel(n[n.length-1])}}))),n.panel.add&&"panel"==n.addTo&&this.bind("openPanel:finish",(function(e){e===s&&a.focus()})),N(a,"input.search"),C(a,"input.search",(function(e){switch(e.keyCode){case 9:case 16:case 17:case 18:case 37:case 38:case 39:case 40:break;default:t.search(a)}})),this.search(a)},Te=function(e){if(e){var t=this.opts.searchfield;this.conf.searchfield;if(e.closest(".mm-panel")||(e=_(this.node.pnls,".mm-panel")[0]),!_(e,".mm-panel__noresultsmsg").length){var n=b("div.mm-panel__noresultsmsg.mm-hidden");n.innerHTML=this.i18n(t.noResults),e.append(n)}}};S.prototype.search=function(e,t){var n,i=this,s=this.opts.searchfield;this.conf.searchfield;t=(t=t||""+e.value).toLowerCase().trim();var a=e.mmSearchfield,o=g(e.closest(".mm-searchfield"),".mm-btn"),r=_(this.node.pnls,".mm-panel_search")[0],c=a.panels,l=a.noresults,m=a.listitems,d=a.dividers;if(m.forEach((function(e){e.classList.remove("mm-listitem_nosubitems"),e.classList.remove("mm-listitem_onlysubitems"),e.classList.remove("mm-hidden")})),r&&(_(r,".mm-listview")[0].innerHTML=""),c.forEach((function(e){e.scrollTop=0})),t.length){d.forEach((function(e){e.classList.add("mm-hidden")})),m.forEach((function(e){var n,i=_(e,".mm-listitem__text")[0],a=!1;i&&(n=i,Array.prototype.slice.call(n.childNodes).filter((function(e){return 3==e.nodeType})).map((function(e){return e.textContent})).join(" ")).toLowerCase().indexOf(t)>-1&&(i.matches(".mm-listitem__btn")?s.showSubPanels&&(a=!0):i.matches("a")?a=!0:s.showTextItems&&(a=!0)),a||e.classList.add("mm-hidden")}));var p=m.filter((function(e){return!e.matches(".mm-hidden")})).length;if(s.panel.add){var u=[];c.forEach((function(e){var t=w(g(e,".mm-listitem"));if((t=t.filter((function(e){return!e.matches(".mm-hidden")}))).length){if(s.panel.dividers){var n=b("li.mm-divider"),i=g(e,".mm-navbar__title")[0];i&&(n.innerHTML=i.innerHTML,u.push(n))}t.forEach((function(e){u.push(e.cloneNode(!0))}))}})),u.forEach((function(e){e.querySelectorAll(".mm-toggle, .mm-check").forEach((function(e){e.remove()}))})),(n=_(r,".mm-listview")[0]).append.apply(n,u),this.openPanel(r)}else s.showSubPanels&&c.forEach((function(e){w(g(e,".mm-listitem")).forEach((function(e){var t=e.mmChild;t&&g(t,".mm-listitem").forEach((function(e){e.classList.remove("mm-hidden")}))}))})),c.slice().reverse().forEach((function(t,n){var s=t.mmParent;s&&(w(g(t,".mm-listitem")).length?(s.matches(".mm-hidden")&&s.classList.remove("mm-hidden"),s.classList.add("mm-listitem_onlysubitems")):e.closest(".mm-panel")||((t.matches(".mm-panel_opened")||t.matches(".mm-panel_opened-parent"))&&setTimeout((function(){i.openPanel(s.closest(".mm-panel"))}),(n+1)*(1.5*i.conf.openingInterval)),s.classList.add("mm-listitem_nosubitems")))})),c.forEach((function(e){w(g(e,".mm-listitem")).forEach((function(e){y(e,".mm-listitem_vertical").forEach((function(e){e.matches(".mm-hidden")&&(e.classList.remove("mm-hidden"),e.classList.add("mm-listitem_onlysubitems"))}))}))})),c.forEach((function(e){w(g(e,".mm-listitem")).forEach((function(e){var t=function(e,t){for(var n=[],i=e.previousElementSibling;i;)t&&!i.matches(t)||n.push(i),i=i.previousElementSibling;return n}(e,".mm-divider")[0];t&&t.classList.remove("mm-hidden")}))}));o.forEach((function(e){return e.classList.remove("mm-hidden")})),l.forEach((function(e){g(e,".mm-panel__noresultsmsg").forEach((function(e){return e.classList[p?"add":"remove"]("mm-hidden")}))})),s.panel.add&&(s.panel.splash&&g(r,".mm-panel__content").forEach((function(e){return e.classList.add("mm-hidden")})),m.forEach((function(e){return e.classList.remove("mm-hidden")})),d.forEach((function(e){return e.classList.remove("mm-hidden")})))}else if(m.forEach((function(e){return e.classList.remove("mm-hidden")})),d.forEach((function(e){return e.classList.remove("mm-hidden")})),o.forEach((function(e){return e.classList.add("mm-hidden")})),l.forEach((function(e){g(e,".mm-panel__noresultsmsg").forEach((function(e){return e.classList.add("mm-hidden")}))})),s.panel.add)if(s.panel.splash)g(r,".mm-panel__content").forEach((function(e){return e.classList.remove("mm-hidden")}));else if(!e.closest(".mm-panel_search")){var f=_(this.node.pnls,".mm-panel_opened-parent");this.openPanel(f.slice(-1)[0])}this.trigger("updateListview")};var Ce={add:!1,addTo:"panels"};S.options.sectionIndexer=Ce;var Ne={current:!0,hover:!1,parent:!1};S.options.setSelected=Ne;var He={collapsed:{use:!1,blockMenu:!0,hideDivider:!1,hideNavbar:!0},expanded:{use:!1,initial:"open"}};S.options.sidebar=He;S.configs.classNames.toggles={toggle:"Toggle",check:"Check"};
+/*!
+ * mmenu.js
+ * mmenujs.com
+ *
+ * Copyright (c) Fred Heusschen
+ * frebsite.nl
+ *
+ * License: CC-BY-NC-4.0
+ * http://creativecommons.org/licenses/by-nc/4.0/
+ */
+S.addons={offcanvas:function(){var e=this;if(this.opts.offCanvas){var t=function(e){return"object"!=typeof e&&(e={}),e}(this.opts.offCanvas);this.opts.offCanvas=a(t,S.options.offCanvas);var n=this.conf.offCanvas;this._api.push("open","close","setPage"),this.vars.opened=!1,this.bind("initMenu:before",(function(){n.clone&&(e.node.menu=e.node.menu.cloneNode(!0),e.node.menu.id&&(e.node.menu.id="mm-"+e.node.menu.id),g(e.node.menu,"[id]").forEach((function(e){e.id="mm-"+e.id}))),e.node.wrpr=document.body,document.querySelector(n.menu.insertSelector)[n.menu.insertMethod](e.node.menu)})),this.bind("initMenu:after",(function(){j.call(e),e.setPage(S.node.page),H.call(e),e.node.menu.classList.add("mm-menu_offcanvas");var t=window.location.hash;if(t){var n=d(e.node.menu.id);n&&n==t.slice(1)&&setTimeout((function(){e.open()}),1e3)}})),this.bind("setPage:after",(function(e){S.node.blck&&_(S.node.blck,"a").forEach((function(t){t.setAttribute("href","#"+e.id)}))})),this.bind("open:start:sr-aria",(function(){S.sr_aria(e.node.menu,"hidden",!1)})),this.bind("close:finish:sr-aria",(function(){S.sr_aria(e.node.menu,"hidden",!0)})),this.bind("initMenu:after:sr-aria",(function(){S.sr_aria(e.node.menu,"hidden",!0)})),this.bind("initBlocker:after:sr-text",(function(){_(S.node.blck,"a").forEach((function(t){t.innerHTML=S.sr_text(e.i18n(e.conf.screenReader.text.closeMenu))}))})),this.clck.push((function(t,n){var i=d(e.node.menu.id);if(i&&t.matches('[href="#'+i+'"]')){if(n.inMenu)return e.open(),!0;var s=t.closest(".mm-menu");if(s){var a=s.mmApi;if(a&&a.close)return a.close(),c(s,(function(){e.open()}),e.conf.transitionDuration),!0}return e.open(),!0}if((i=S.node.page.id)&&t.matches('[href="#'+i+'"]'))return e.close(),!0}))}},screenReader:function(){var e=this,t=function(e){return"boolean"==typeof e&&(e={aria:e,text:e}),"object"!=typeof e&&(e={}),e}(this.opts.screenReader);this.opts.screenReader=a(t,S.options.screenReader);var n=this.conf.screenReader;t.aria&&(this.bind("initAddons:after",(function(){e.bind("initMenu:after",(function(){this.trigger("initMenu:after:sr-aria",[].slice.call(arguments))})),e.bind("initNavbar:after",(function(){this.trigger("initNavbar:after:sr-aria",[].slice.call(arguments))})),e.bind("openPanel:start",(function(){this.trigger("openPanel:start:sr-aria",[].slice.call(arguments))})),e.bind("close:start",(function(){this.trigger("close:start:sr-aria",[].slice.call(arguments))})),e.bind("close:finish",(function(){this.trigger("close:finish:sr-aria",[].slice.call(arguments))})),e.bind("open:start",(function(){this.trigger("open:start:sr-aria",[].slice.call(arguments))})),e.bind("initOpened:after",(function(){this.trigger("initOpened:after:sr-aria",[].slice.call(arguments))}))})),this.bind("updateListview",(function(){e.node.pnls.querySelectorAll(".mm-listitem").forEach((function(e){S.sr_aria(e,"hidden",e.matches(".mm-hidden"))}))})),this.bind("openPanel:start",(function(t){var n=g(e.node.pnls,".mm-panel").filter((function(e){return e!==t})).filter((function(e){return!e.parentElement.matches(".mm-panel")})),i=[t];g(t,".mm-listitem_vertical .mm-listitem_opened").forEach((function(e){i.push.apply(i,_(e,".mm-panel"))})),n.forEach((function(e){S.sr_aria(e,"hidden",!0)})),i.forEach((function(e){S.sr_aria(e,"hidden",!1)}))})),this.bind("closePanel",(function(e){S.sr_aria(e,"hidden",!0)})),this.bind("initPanel:after",(function(e){g(e,".mm-btn").forEach((function(e){S.sr_aria(e,"haspopup",!0);var t=e.getAttribute("href");t&&S.sr_aria(e,"owns",t.replace("#",""))}))})),this.bind("initNavbar:after",(function(e){var t=_(e,".mm-navbar")[0],n=t.matches(".mm-hidden");S.sr_aria(t,"hidden",n)})),t.text&&"parent"==this.opts.navbar.titleLink&&this.bind("initNavbar:after",(function(e){var t=_(e,".mm-navbar")[0],n=!!t.querySelector(".mm-btn_prev");S.sr_aria(g(t,".mm-navbar__title")[0],"hidden",n)}))),t.text&&(this.bind("initAddons:after",(function(){e.bind("setPage:after",(function(){this.trigger("setPage:after:sr-text",[].slice.call(arguments))})),e.bind("initBlocker:after",(function(){this.trigger("initBlocker:after:sr-text",[].slice.call(arguments))}))})),this.bind("initNavbar:after",(function(t){var i=_(t,".mm-navbar")[0];if(i){var s=_(i,".mm-btn_prev")[0];s&&(s.innerHTML=S.sr_text(e.i18n(n.text.closeSubmenu)))}})),this.bind("initListview:after",(function(t){var i=t.closest(".mm-panel").mmParent;if(i){var s=_(i,".mm-btn_next")[0];if(s){var a=e.i18n(n.text[s.parentElement.matches(".mm-listitem_vertical")?"toggleSubmenu":"openSubmenu"]);s.innerHTML+=S.sr_text(a)}}})))},scrollBugFix:function(){var e=this;if(U&&this.opts.offCanvas&&this.opts.offCanvas.blockUI){var t=function(e){return"boolean"==typeof e&&(e={fix:e}),"object"!=typeof e&&(e={}),e}(this.opts.scrollBugFix);if(this.opts.scrollBugFix=a(t,S.options.scrollBugFix),t.fix){var n,i,s=(n=this.node.menu,i="",n.addEventListener("touchmove",(function(e){i="",e.movementY>0?i="down":e.movementY<0&&(i="up")})),{get:function(){return i}});this.node.menu.addEventListener("scroll",o,{passive:!1}),this.node.menu.addEventListener("touchmove",(function(e){var t=e.target.closest(".mm-panel");t?t.scrollHeight===t.offsetHeight?o(e):(0==t.scrollTop&&"down"==s.get()||t.scrollHeight==t.scrollTop+t.offsetHeight&&"up"==s.get())&&o(e):o(e)}),{passive:!1}),this.bind("open:start",(function(){var t=_(e.node.pnls,".mm-panel_opened")[0];t&&(t.scrollTop=0)})),window.addEventListener("orientationchange",(function(t){var n=_(e.node.pnls,".mm-panel_opened")[0];n&&(n.scrollTop=0,n.style["-webkit-overflow-scrolling"]="auto",n.style["-webkit-overflow-scrolling"]="touch")}))}}function o(e){e.preventDefault(),e.stopPropagation()}},autoHeight:function(){var e=this,t=function(e){return"boolean"==typeof e&&e&&(e={height:"auto"}),"string"==typeof e&&(e={height:e}),"object"!=typeof e&&(e={}),e}(this.opts.autoHeight);if(this.opts.autoHeight=a(t,S.options.autoHeight),"auto"==t.height||"highest"==t.height){var n,i=(n=function(e){return e.parentElement.matches(".mm-listitem_vertical")&&(e=y(e,".mm-panel").filter((function(e){return!e.parentElement.matches(".mm-listitem_vertical")}))[0]),e},function(){if(!e.opts.offCanvas||e.vars.opened){var i,s,a=0,o=e.node.menu.offsetHeight-e.node.pnls.offsetHeight;e.node.menu.classList.add("mm-menu_autoheight-measuring"),"auto"==t.height?((s=_(e.node.pnls,".mm-panel_opened")[0])&&(s=n(s)),s||(s=_(e.node.pnls,".mm-panel")[0]),a=s.scrollHeight):"highest"==t.height&&(i=0,_(e.node.pnls,".mm-panel").forEach((function(e){e=n(e),i=Math.max(i,e.scrollHeight)})),a=i),e.node.menu.style.height=a+o+"px",e.node.menu.classList.remove("mm-menu_autoheight-measuring")}});this.bind("initMenu:after",(function(){e.node.menu.classList.add("mm-menu_autoheight")})),this.opts.offCanvas&&this.bind("open:start",i),"highest"==t.height&&this.bind("initPanels:after",i),"auto"==t.height&&(this.bind("updateListview",i),this.bind("openPanel:start",i))}},backButton:function(){var e=this;if(this.opts.offCanvas){var t=function(e){return"boolean"==typeof e&&(e={close:e}),"object"!=typeof e&&(e={}),e}(this.opts.backButton);this.opts.backButton=a(t,S.options.backButton);var n="#"+this.node.menu.id;if(t.close){var i=[],s=function(){i=[n],_(e.node.pnls,".mm-panel_opened, .mm-panel_opened-parent").forEach((function(e){i.push("#"+e.id)}))};this.bind("open:finish",(function(){history.pushState(null,document.title,n)})),this.bind("open:finish",s),this.bind("openPanel:finish",s),this.bind("close:finish",(function(){i=[],history.back(),history.pushState(null,document.title,location.pathname+location.search)})),window.addEventListener("popstate",(function(t){if(e.vars.opened&&i.length){var s=(i=i.slice(0,-1))[i.length-1];s==n?e.close():(e.openPanel(e.node.menu.querySelector(s)),history.pushState(null,document.title,n))}}))}t.open&&window.addEventListener("popstate",(function(t){e.vars.opened||location.hash!=n||e.open()}))}},columns:function(){var e=this,t=function(e){return"boolean"==typeof e&&(e={add:e}),"number"==typeof e&&(e={add:!0,visible:e}),"object"!=typeof e&&(e={}),"number"==typeof e.visible&&(e.visible={min:e.visible,max:e.visible}),e}(this.opts.columns);if(this.opts.columns=a(t,S.options.columns),t.add){t.visible.min=Math.max(1,Math.min(6,t.visible.min)),t.visible.max=Math.max(t.visible.min,Math.min(6,t.visible.max));for(var n=[],i=[],s=["mm-panel_opened","mm-panel_opened-parent","mm-panel_highest"],o=0;o<=t.visible.max;o++)n.push("mm-menu_columns-"+o),i.push("mm-panel_columns-"+o);s.push.apply(s,i),this.bind("openPanel:before",(function(t){var n;if(t&&(n=t.mmParent),n&&(n=n.closest(".mm-panel"))){var i=n.className;if(i.length&&(i=i.split("mm-panel_columns-")[1]))for(var a=parseInt(i.split(" ")[0],10)+1;a>0;){if(!(t=_(e.node.pnls,".mm-panel_columns-"+a)[0])){a=-1;break}a++,t.classList.add("mm-hidden"),s.forEach((function(e){t.classList.remove(e)}))}}})),this.bind("openPanel:start",(function(s){var a=_(e.node.pnls,".mm-panel_opened-parent").length;s.matches(".mm-panel_opened-parent")||a++,a=Math.min(t.visible.max,Math.max(t.visible.min,a)),n.forEach((function(t){e.node.menu.classList.remove(t)})),e.node.menu.classList.add("mm-menu_columns-"+a);var o=[];_(e.node.pnls,".mm-panel").forEach((function(e){i.forEach((function(t){e.classList.remove(t)})),e.matches(".mm-panel_opened-parent")&&o.push(e)})),o.push(s),o.slice(-t.visible.max).forEach((function(e,t){e.classList.add("mm-panel_columns-"+t)}))}))}},counters:function(){var e=this,t=function(e){return"boolean"==typeof e&&(e={add:e,addTo:"panels",count:e}),"object"!=typeof e&&(e={}),"panels"==e.addTo&&(e.addTo=".mm-listview"),e}(this.opts.counters);if(this.opts.counters=a(t,S.options.counters),this.bind("initListview:after",(function(t){var n=e.conf.classNames.counters.counter;g(t,"."+n).forEach((function(e){E(e,n,"mm-counter")}))})),t.add&&this.bind("initListview:after",(function(e){if(e.matches(t.addTo)){var n=e.closest(".mm-panel").mmParent;if(n&&!g(n,".mm-counter").length){var i=_(n,".mm-btn")[0];i&&i.prepend(b("span.mm-counter"))}}})),t.count){var n=function(t){(t?[t.closest(".mm-panel")]:_(e.node.pnls,".mm-panel")).forEach((function(e){var t=e.mmParent;if(t){var n=g(t,".mm-counter")[0];if(n){var i=[];_(e,".mm-listview").forEach((function(e){i.push.apply(i,_(e))})),n.innerHTML=w(i).length.toString()}}}))};this.bind("initListview:after",n),this.bind("updateListview",n)}},dividers:function(){var e=this,t=function(e){return"boolean"==typeof e&&(e={add:e}),"object"!=typeof e&&(e={}),"panels"==e.addTo&&(e.addTo=".mm-listview"),e}(this.opts.dividers);this.opts.dividers=a(t,S.options.dividers),this.bind("initListview:after",(function(t){_(t).forEach((function(t){E(t,e.conf.classNames.divider,"mm-divider"),t.matches(".mm-divider")&&t.classList.remove("mm-listitem")}))})),t.add&&this.bind("initListview:after",(function(e){if(e.matches(t.addTo)){g(e,".mm-divider").forEach((function(e){e.remove()}));var n="";w(_(e)).forEach((function(t){var i=_(t,".mm-listitem__text")[0].textContent.trim().toLowerCase()[0];if(i.length&&i!=n){n=i;var s=b("li.mm-divider");s.textContent=i,e.insertBefore(s,t)}}))}}))},drag:function(){var e=this;if(this.opts.offCanvas){var t=function(e){return"boolean"==typeof e&&(e={open:e}),"object"!=typeof e&&(e={}),e}(this.opts.drag);this.opts.drag=a(t,S.options.drag),t.open&&this.bind("setPage:after",(function(n){re.call(e,t.node||n)}))}},dropdown:function(){var e=this;if(this.opts.offCanvas){var t=function(e){return"boolean"==typeof e&&e&&(e={drop:e}),"object"!=typeof e&&(e={}),"string"==typeof e.position&&(e.position={of:e.position}),e}(this.opts.dropdown);this.opts.dropdown=a(t,S.options.dropdown);var n=this.conf.dropdown;if(t.drop){var i;this.bind("initMenu:after",(function(){if(e.node.menu.classList.add("mm-menu_dropdown"),"string"!=typeof t.position.of){var n=d(e.node.menu.id);n&&(t.position.of='[href="#'+n+'"]')}if("string"==typeof t.position.of){i=g(document.body,t.position.of)[0];var s=t.event.split(" ");1==s.length&&(s[1]=s[0]),"hover"==s[0]&&i.addEventListener("mouseenter",(function(){e.open()}),{passive:!0}),"hover"==s[1]&&e.node.menu.addEventListener("mouseleave",(function(){e.close()}),{passive:!0})}})),this.bind("open:start",(function(){e.node.menu.mmStyle=e.node.menu.getAttribute("style"),e.node.wrpr.classList.add("mm-wrapper_dropdown")})),this.bind("close:finish",(function(){e.node.menu.setAttribute("style",e.node.menu.mmStyle),e.node.wrpr.classList.remove("mm-wrapper_dropdown")}));var s=function(e,s){var a,o,r,c=s[0],l=s[1],m="x"==e?"offsetWidth":"offsetHeight",d="x"==e?"left":"top",p="x"==e?"right":"bottom",u="x"==e?"width":"height",f="x"==e?"innerWidth":"innerHeight",h="x"==e?"maxWidth":"maxHeight",v=null,b=(a=d,i.getBoundingClientRect()[a]+document.body["left"===a?"scrollLeft":"scrollTop"]),g=b+i[m],_=window[f],y=n.offset.button[e]+n.offset.viewport[e];if(t.position[e])switch(t.position[e]){case"left":case"bottom":v="after";break;case"right":case"top":v="before"}return null===v&&(v=b+(g-b)/2<_/2?"after":"before"),"after"==v?(r=_-((o="x"==e?b:g)+y),c[d]=o+n.offset.button[e]+"px",c[p]="auto",t.tip&&l.push("mm-menu_tip-"+("x"==e?"left":"top"))):(r=(o="x"==e?g:b)-y,c[p]="calc( 100% - "+(o-n.offset.button[e])+"px )",c[d]="auto",t.tip&&l.push("mm-menu_tip-"+("x"==e?"right":"bottom"))),t.fitViewport&&(c[h]=Math.min(n[u].max,r)+"px"),[c,l]};this.bind("open:start",o),window.addEventListener("resize",(function(t){o.call(e)}),{passive:!0}),this.opts.offCanvas.blockUI||window.addEventListener("scroll",(function(t){o.call(e)}),{passive:!0})}}function o(){var e=this;if(this.vars.opened){this.node.menu.setAttribute("style",this.node.menu.mmStyle);var n=[{},[]];for(var i in n=s.call(this,"y",n),(n=s.call(this,"x",n))[0])this.node.menu.style[i]=n[0][i];if(t.tip){["mm-menu_tip-left","mm-menu_tip-right","mm-menu_tip-top","mm-menu_tip-bottom"].forEach((function(t){e.node.menu.classList.remove(t)})),n[1].forEach((function(t){e.node.menu.classList.add(t)}))}}}},fixedElements:function(){var e=this;if(this.opts.offCanvas){var t,n,i=this.conf.fixedElements;this.bind("setPage:after",(function(s){t=e.conf.classNames.fixedElements.fixed,n=g(document,i.insertSelector)[0],g(s,"."+t).forEach((function(e){E(e,t,"mm-slideout"),n[i.insertMethod](e)}))}))}},iconbar:function(){var e,t=this,n=function(e){return"array"==o(e)&&(e={use:!0,top:e}),"object"!=o(e)&&(e={}),void 0===e.use&&(e.use=!0),"boolean"==typeof e.use&&e.use&&(e.use=!0),e}(this.opts.iconbar);if((this.opts.iconbar=a(n,S.options.iconbar),n.use)&&(["top","bottom"].forEach((function(t,i){var s=n[t];"array"!=o(s)&&(s=[s]);for(var a=b("div.mm-iconbar__"+t),r=0,c=s.length;r'+e+"