├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE.txt ├── README.md ├── assets ├── .htaccess ├── css │ ├── mobile-menu.css │ └── mobile-menu.min.css └── js │ ├── mobile-menu.jquery.js │ └── mobile-menu.jquery.min.js ├── composer.json ├── config ├── autoload.ini ├── autoload.php └── config.php ├── dca └── tl_module.php ├── docs ├── README.md └── images │ ├── configuration.png │ └── preview.png ├── gulpfile.js ├── languages ├── de │ ├── modules.php │ └── tl_module.php └── en │ ├── modules.php │ └── tl_module.php ├── package.json ├── src └── MobileMenuModule.php ├── templates └── modules │ └── mod_mobile_menu.html5 └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: codefog 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # PHPStorm 2 | .idea 3 | 4 | # Composer 5 | /vendor 6 | /composer.lock 7 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Codefog 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mobile Menu extension for Contao Open Source CMS 2 | 3 | [![](https://img.shields.io/packagist/v/codefog/contao-mobile_menu.svg)](https://packagist.org/packages/codefog/contao-mobile_menu) 4 | [![](https://img.shields.io/packagist/l/codefog/contao-mobile_menu.svg)](https://github.com/codefog/contao-mobile_menu/blob/master/LICENSE.txt) 5 | [![](https://img.shields.io/packagist/dt/codefog/contao-mobile_menu.svg)](https://packagist.org/packages/codefog/contao-mobile_menu) 6 | 7 | Mobile Menu is an extension for the [Contao Open Source CMS](https://contao.org). 8 | 9 | Add the mobile menu to your website that can be accessed on tablets and phone devices. The extension inserts a mobile menu trigger that can be any HTML code, e.g. image, text or both combined. When the trigger is clicked a left panel is shown. It can contain any content as well - navigation menu, contact details, search box, etc. 10 | 11 | The navigation module inside the panel will automatically be granted an extra functionality. By default the subitems are hidden but they can be toggled by clicking the parent record. Another click on the parent record will take the visitor to its page. 12 | 13 | The script requires a jQuery to be included on your page. 14 | 15 | ![](docs/images/preview.png) 16 | 17 | ## Documentation 18 | 19 | [Read the documentation](docs/README.md) 20 | 21 | ## Copyright 22 | 23 | This project has been created and is maintained by [Codefog](https://codefog.pl). 24 | -------------------------------------------------------------------------------- /assets/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Order allow,deny 3 | Allow from all 4 | 5 | 6 | Require all granted 7 | -------------------------------------------------------------------------------- /assets/css/mobile-menu.css: -------------------------------------------------------------------------------- 1 | /** 2 | * mobile_menu extension for Contao Open Source CMS 3 | * 4 | * Copyright (C) 2011-2015 Codefog 5 | * 6 | * @package mobile_menu 7 | * @author Codefog 8 | * @author Kamil Kuzminski 9 | * @license LGPL 10 | */ 11 | 12 | /* Menu */ 13 | .mobile_menu { 14 | position: fixed; 15 | z-index: 100; 16 | display: none; 17 | } 18 | 19 | .mobile_menu .inner { 20 | height: 100%; 21 | background: #000000; 22 | overflow-y: scroll; 23 | } 24 | 25 | /* Menu shadows */ 26 | .mobile_menu.active.position_left { 27 | box-shadow: 2px 0 5px 0 rgba(0, 0, 0, 0.5); 28 | } 29 | 30 | .mobile_menu.active.position_top { 31 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.5); 32 | } 33 | 34 | .mobile_menu.active.position_right { 35 | box-shadow: -2px 0 5px 0 rgba(0, 0, 0, 0.5); 36 | } 37 | 38 | .mobile_menu.active.position_bottom { 39 | box-shadow: 0 -2px 5px 0 rgba(0, 0, 0, 0.5); 40 | } 41 | 42 | .mobile_menu.active.no_shadow { 43 | box-shadow: none !important; 44 | } 45 | 46 | /* Trigger */ 47 | .mobile_menu_trigger { 48 | display: none; 49 | } 50 | 51 | /* Wrapper */ 52 | .mobile_menu_wrapper { 53 | position: relative; 54 | width: 100%; 55 | overflow: hidden; 56 | } 57 | 58 | /* Overlay */ 59 | .mobile_menu_overlay { 60 | position: fixed; 61 | top: 0; 62 | left: 0; 63 | width: 100%; 64 | height: 100vh; 65 | z-index: 99; 66 | } 67 | 68 | .mobile_menu_overlay.background { 69 | background: rgba(0,0,0,0.5); 70 | } 71 | 72 | /* Navigation */ 73 | .mobile_menu li.submenu_hide > ul { 74 | display: none; 75 | } 76 | 77 | .mobile_menu li.submenu_show > ul { 78 | display: block; 79 | } 80 | 81 | /* Hide menu on IE8-9 */ 82 | body.ie8 .mobile_menu, 83 | body.ie8 .mobile_menu_trigger, 84 | body.ie9 .mobile_menu, 85 | body.ie9 .mobile_menu_trigger { 86 | display: none !important; 87 | } -------------------------------------------------------------------------------- /assets/css/mobile-menu.min.css: -------------------------------------------------------------------------------- 1 | .mobile_menu{position:fixed;z-index:100;display:none}.mobile_menu .inner{height:100%;background:#000;overflow-y:scroll}.mobile_menu.active.position_left{box-shadow:2px 0 5px 0 rgba(0,0,0,.5)}.mobile_menu.active.position_top{box-shadow:0 2px 5px 0 rgba(0,0,0,.5)}.mobile_menu.active.position_right{box-shadow:-2px 0 5px 0 rgba(0,0,0,.5)}.mobile_menu.active.position_bottom{box-shadow:0 -2px 5px 0 rgba(0,0,0,.5)}.mobile_menu.active.no_shadow{box-shadow:none!important}.mobile_menu_trigger{display:none}.mobile_menu_wrapper{position:relative;width:100%;overflow:hidden}.mobile_menu_overlay{position:fixed;top:0;left:0;width:100%;height:100vh;z-index:99}.mobile_menu_overlay.background{background:rgba(0,0,0,.5)}.mobile_menu li.submenu_hide>ul{display:none}.mobile_menu li.submenu_show>ul{display:block}body.ie8 .mobile_menu,body.ie8 .mobile_menu_trigger,body.ie9 .mobile_menu,body.ie9 .mobile_menu_trigger{display:none!important} -------------------------------------------------------------------------------- /assets/js/mobile-menu.jquery.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mobile_menu extension for Contao Open Source CMS 3 | * 4 | * Copyright (C) 2011-2015 Codefog 5 | * 6 | * @package mobile_menu 7 | * @author Codefog 8 | * @author Kamil Kuzminski 9 | * @license LGPL 10 | */ 11 | 12 | ;(function ($, window, document, undefined) { 13 | 'use strict'; 14 | 15 | // Create the defaults once 16 | var pluginName = 'mobileMenu', 17 | defaults = { 18 | 'animation': false, // Enable the animation 19 | 'animationSpeed': 500, // The animation speed in milliseconds 20 | 'breakPoint': 0, // The breakpoint to show the menu 21 | 'disableNavigation': false, // Disable the collapsible navigation 22 | 'keepInPlace': false, // Keeps the menu in place 23 | 'menuActiveClass': 'active', // The menu active CSS class 24 | 'menuActiveHtmlClass': 'mobile_menu_active', // The menu active CSS class 25 | 'menuSubNavigationHideCssClass': 'submenu_hide', // The sub navigation inactive CSS class 26 | 'menuSubNavigationShowCssClass': 'submenu_show', // The sub navigation active CSS class 27 | 'offCanvas': false, // The off canvas mode 28 | 'offCanvasWrapper': null, // The off canvas content wrapper 29 | 'offCanvasWrapperClass': 'mobile_menu_wrapper', // The off canvas content wrapper class 30 | 'overlay': false, // Display overlay or not 31 | 'overlayActiveCssClass': 'active', // The overlay active CSS class 32 | 'overlayBackgroundCssClass': 'background', // The overlay background CSS class 33 | 'overlayCssClass': 'mobile_menu_overlay', // The overlay CSS class 34 | 'position': 'left', // The position of the menu (left, top, right, bottom) 35 | 'parentTogglers': false, // Force the parent items to work only as togglers 36 | 'closeOnLinkClick': false, // Close the menu on any link click 37 | 'size': 75, // The size of the menu in percent 38 | 'trigger': null // The menu trigger 39 | }; 40 | 41 | // The actual plugin constructor 42 | function Plugin(element, options) { 43 | this.element = $(element); 44 | this.overlay = null; 45 | this.settings = $.extend({}, defaults, options); 46 | this._defaults = defaults; 47 | this._name = pluginName; 48 | this.init(); 49 | } 50 | 51 | // Avoid Plugin.prototype conflicts 52 | $.extend(Plugin.prototype, { 53 | 54 | /** 55 | * Initialize the plugin 56 | */ 57 | init: function () { 58 | var body = $('body'); 59 | 60 | // Hide the menu on IE8-9 as they are not supported 61 | if (body.hasClass('ie8') || body.hasClass('ie9')) { 62 | return; 63 | } 64 | 65 | // Set the default wrapper 66 | if (this.settings.offCanvasWrapper === null) { 67 | this.settings.offCanvasWrapper = $('#wrapper'); 68 | } 69 | 70 | this.initMenu(); 71 | this.initTrigger(); 72 | this.initOverlay(); 73 | 74 | if (this.settings.offCanvas) { 75 | this.initOffCanvasWrapper(); 76 | } 77 | 78 | var self = this; 79 | 80 | $(window).on('resize', function() { 81 | self.updateElementsVisibility(); 82 | }); 83 | 84 | this.updateElementsVisibility(); 85 | 86 | // Once everything is ready make sure the menu is visible 87 | this.element.css('display', 'block'); 88 | }, 89 | 90 | /** 91 | * Initialize the menu 92 | */ 93 | initMenu: function () { 94 | var self = this; 95 | var size = ((this.settings.size > 100) ? 100 : this.settings.size) + '%'; 96 | var animationSpeed = this.getAnimationSpeed(); 97 | 98 | // Init the navigation 99 | if (this.settings.disableNavigation !== true) { 100 | this.element.find('.level_1').each(function () { 101 | self.initMenuNavigation($(this)); 102 | }); 103 | } 104 | 105 | // Init the close buttons 106 | this.element.find('[data-mobile-menu="close"]').on('click', function(e) { 107 | e.preventDefault(); 108 | self.hideMenu(); 109 | }); 110 | 111 | // Close the menu on links click 112 | if (this.settings.closeOnLinkClick) { 113 | this.element.find('a').on('click', function() { 114 | self.hideMenu(); 115 | }); 116 | } 117 | 118 | // Set the position CSS class 119 | this.element.addClass('position_' + this.settings.position); 120 | 121 | // Append the menu to 122 | if (!this.settings.keepInPlace) { 123 | this.element.appendTo('body'); 124 | } 125 | 126 | switch (this.settings.position) { 127 | case 'left': 128 | this.element.css({'left': 0, 'top': 0, 'width': size, 'height': '100vh'}); 129 | this.element.css(this.getCssTranslateRules('-100%', 0)); 130 | break; 131 | 132 | case 'top': 133 | this.element.css({'left': 0, 'top': 0, 'height': size, 'width': '100%'}); 134 | this.element.css(this.getCssTranslateRules(0, '-100%')); 135 | break; 136 | 137 | case 'bottom': 138 | this.element.css({'left': 0, 'bottom': 0, 'height': size, 'width': '100%'}); 139 | this.element.css(this.getCssTranslateRules(0, '100%')); 140 | break; 141 | 142 | case 'right': 143 | this.element.css({'right': 0, 'top': 0, 'width': size, 'height': '100vh'}); 144 | this.element.css(this.getCssTranslateRules('100%', 0)); 145 | break; 146 | } 147 | 148 | this.element.css({ 149 | '-webkit-backface-visibility': 'hidden', 150 | '-moz-backface-visibility': 'hidden', 151 | '-ms-backface-visibility': 'hidden', 152 | '-o-backface-visibility': 'hidden', 153 | 'backface-visibility': 'hidden' 154 | }); 155 | 156 | // Enable animation 157 | if (animationSpeed) { 158 | this.element.css({ 159 | '-webkit-transition': '-webkit-transform ' + animationSpeed + 'ms ease', 160 | '-moz-transition': '-moz-transform ' + animationSpeed + 'ms ease', 161 | '-o-transition': '-o-transform ' + animationSpeed + 'ms ease', 162 | 'transition': 'transform ' + animationSpeed + 'ms ease' 163 | }); 164 | } 165 | }, 166 | 167 | /** 168 | * Initialize the navigation in the menu 169 | * 170 | * @param {object} navigation 171 | */ 172 | initMenuNavigation: function (navigation) { 173 | var self = this; 174 | var subMenus = navigation.children('.submenu'); 175 | 176 | subMenus.each(function() { 177 | var item = $(this); 178 | var link = item.children('a, span, strong').eq(0); 179 | 180 | // Open the submenu of the active item 181 | if (link.hasClass('active') || link.hasClass('trail')) { 182 | item.addClass(self.settings.menuSubNavigationShowCssClass); 183 | } else { 184 | item.addClass(self.settings.menuSubNavigationHideCssClass); 185 | } 186 | 187 | // Open the submenu on click 188 | link.on('click', function(e) { 189 | var parent = $(this).parent(); 190 | 191 | if (!parent.hasClass(self.settings.menuSubNavigationShowCssClass)) { 192 | e.preventDefault(); 193 | subMenus.removeClass(self.settings.menuSubNavigationShowCssClass).addClass(self.settings.menuSubNavigationHideCssClass); 194 | parent.removeClass(self.settings.menuSubNavigationHideCssClass).addClass(self.settings.menuSubNavigationShowCssClass); 195 | } else if (self.settings.parentTogglers) { 196 | e.preventDefault(); 197 | parent.addClass(self.settings.menuSubNavigationHideCssClass).removeClass(self.settings.menuSubNavigationShowCssClass); 198 | } 199 | }); 200 | 201 | var subNavigation = item.children('ul').eq(0); 202 | 203 | // Recursively init sub navigation 204 | if (subNavigation) { 205 | self.initMenuNavigation(subNavigation); 206 | } 207 | }); 208 | }, 209 | 210 | /** 211 | * Initialize the trigger 212 | */ 213 | initTrigger: function () { 214 | if (!this.settings.trigger) { 215 | return; 216 | } 217 | 218 | var self = this; 219 | 220 | this.settings.trigger.on('click', function() { 221 | self.toggleMenu(); 222 | }); 223 | }, 224 | 225 | /** 226 | * Initialize the off canvas wrapper 227 | */ 228 | initOffCanvasWrapper: function () { 229 | var animationSpeed = this.getAnimationSpeed(); 230 | var wrapper = $('
', {'class': this.settings.offCanvasWrapperClass}); 231 | 232 | // Create the wrapper if it does not exist 233 | if (!this.settings.offCanvasWrapper.parent().hasClass(this.settings.offCanvasWrapperClass)) { 234 | this.settings.offCanvasWrapper.wrap(wrapper); 235 | } 236 | 237 | // Add CSS to the content wrapper 238 | this.settings.offCanvasWrapper.css({ 239 | '-webkit-transform': 'translate3d(0, 0, 0)', 240 | '-moz-transform': 'translate3d(0, 0, 0)', 241 | '-ms-transform': 'translate3d(0, 0, 0)', 242 | '-o-transform': 'translate3d(0, 0, 0)', 243 | 'transform': 'translate3d(0, 0, 0)', 244 | '-webkit-backface-visibility': 'hidden', 245 | '-moz-backface-visibility': 'hidden', 246 | '-ms-backface-visibility': 'hidden', 247 | '-o-backface-visibility': 'hidden', 248 | 'backface-visibility': 'hidden' 249 | }); 250 | 251 | // Enable animation 252 | if (animationSpeed > 0) { 253 | this.settings.offCanvasWrapper.css({ 254 | '-webkit-transition': '-webkit-transform ' + animationSpeed + 'ms ease', 255 | '-moz-transition': '-moz-transform ' + animationSpeed + 'ms ease', 256 | '-o-transition': '-o-transform ' + animationSpeed + 'ms ease', 257 | 'transition': 'transform ' + animationSpeed + 'ms ease' 258 | }); 259 | } 260 | 261 | switch (this.settings.position) { 262 | case 'left': 263 | this.settings.offCanvasWrapper.css('left', 0); 264 | break; 265 | 266 | case 'top': 267 | this.settings.offCanvasWrapper.css('top', 0); 268 | break; 269 | 270 | case 'bottom': 271 | this.settings.offCanvasWrapper.css('bottom', 0); 272 | break; 273 | 274 | case 'right': 275 | this.settings.offCanvasWrapper.css('right', 0); 276 | break; 277 | } 278 | }, 279 | 280 | /** 281 | * Initialize the overlay 282 | */ 283 | initOverlay: function () { 284 | var self = this; 285 | var cssClass = this.settings.overlayCssClass; 286 | 287 | // Mark the background as active 288 | if (this.settings.overlay) { 289 | cssClass = cssClass + ' ' + this.settings.overlayBackgroundCssClass; 290 | } 291 | 292 | this.overlay = $('
', { 293 | 'id': this.element.attr('id') + '-overlay', 294 | 'class': cssClass 295 | }).on('click', function() { 296 | self.hideMenu(); 297 | }).hide().appendTo('body'); 298 | }, 299 | 300 | /** 301 | * Update the visibility of the elements depending 302 | * on the break point settings and the current window size 303 | */ 304 | updateElementsVisibility: function () { 305 | if (window.matchMedia('(max-width: ' + this.settings.breakPoint + 'px)').matches) { 306 | this.showTrigger(); 307 | } else { 308 | this.hideMenu(); 309 | this.hideTrigger(); 310 | } 311 | }, 312 | 313 | /** 314 | * Show the trigger 315 | */ 316 | showTrigger: function() { 317 | if (!this.settings.trigger) { 318 | return; 319 | } 320 | 321 | this.settings.trigger.show(); 322 | }, 323 | 324 | /** 325 | * Hide the trigger 326 | */ 327 | hideTrigger: function() { 328 | if (!this.settings.trigger) { 329 | return; 330 | } 331 | 332 | this.settings.trigger.hide(); 333 | }, 334 | 335 | /** 336 | * Show the overlay 337 | */ 338 | showOverlay: function() { 339 | if (!this.overlay) { 340 | return; 341 | } 342 | 343 | this.overlay.show(); 344 | this.overlay.addClass(this.settings.overlayActiveCssClass); 345 | }, 346 | 347 | /** 348 | * Hide the overlay 349 | */ 350 | hideOverlay: function() { 351 | if (!this.overlay) { 352 | return; 353 | } 354 | 355 | this.overlay.hide(); 356 | this.overlay.removeClass(this.settings.overlayActiveCssClass); 357 | }, 358 | 359 | /** 360 | * Show the menu 361 | */ 362 | showMenu: function () { 363 | this.element.trigger('showMobileMenu', [this]); 364 | 365 | switch (this.settings.position) { 366 | case 'left': 367 | this.element.css(this.getCssTranslateRules(0, 0, true)); 368 | 369 | if (this.settings.offCanvas) { 370 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules(this.settings.size + '%', 0, true)); 371 | } 372 | break; 373 | 374 | case 'top': 375 | this.element.css(this.getCssTranslateRules(0, 0, true)); 376 | 377 | if (this.settings.offCanvas) { 378 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0, ($(window).height() * (this.settings.size / 100)) + 'px', true)); 379 | } 380 | break; 381 | 382 | case 'bottom': 383 | this.element.css(this.getCssTranslateRules(0, 0, true)); 384 | 385 | if (this.settings.offCanvas) { 386 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0, (-1 * $(window).height() * (this.settings.size / 100)) + 'px', true)); 387 | } 388 | break; 389 | 390 | case 'right': 391 | this.element.css(this.getCssTranslateRules(0, 0, true)); 392 | 393 | if (this.settings.offCanvas) { 394 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules((-1 * this.settings.size) + '%', 0, true)); 395 | } 396 | break; 397 | } 398 | 399 | this.showOverlay(); 400 | this.element.addClass(this.settings.menuActiveClass); 401 | $('html').addClass(this.settings.menuActiveHtmlClass); 402 | 403 | // Add class to trigger 404 | if (this.settings.trigger) { 405 | this.settings.trigger.addClass(this.settings.menuActiveClass); 406 | } 407 | }, 408 | 409 | /** 410 | * Hide the menu 411 | */ 412 | hideMenu: function () { 413 | this.element.trigger('hideMobileMenu', [this]); 414 | 415 | switch (this.settings.position) { 416 | case 'left': 417 | this.element.css(this.getCssTranslateRules('-100%', 0, true)); 418 | 419 | if (this.settings.offCanvas) { 420 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0, 0, true)); 421 | } 422 | break; 423 | 424 | case 'top': 425 | this.element.css(this.getCssTranslateRules(0, '-100%', true)); 426 | 427 | if (this.settings.offCanvas) { 428 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0, 0, true)); 429 | } 430 | break; 431 | 432 | case 'bottom': 433 | this.element.css(this.getCssTranslateRules(0, '100%', true)); 434 | 435 | if (this.settings.offCanvas) { 436 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0, 0, true)); 437 | } 438 | break; 439 | 440 | case 'right': 441 | this.element.css(this.getCssTranslateRules('100%', 0, true)); 442 | 443 | if (this.settings.offCanvas) { 444 | this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0, 0, true)); 445 | } 446 | break; 447 | } 448 | 449 | this.hideOverlay(); 450 | this.element.removeClass(this.settings.menuActiveClass); 451 | $('html').removeClass(this.settings.menuActiveHtmlClass); 452 | 453 | // Remove the class from trigger 454 | if (this.settings.trigger) { 455 | this.settings.trigger.removeClass(this.settings.menuActiveClass); 456 | } 457 | }, 458 | 459 | /** 460 | * Toggle the menu 461 | */ 462 | toggleMenu: function () { 463 | if (this.isActive()) { 464 | this.hideMenu(); 465 | } else { 466 | this.showMenu(); 467 | } 468 | }, 469 | 470 | /** 471 | * Return true if the menu is active 472 | * 473 | * @return {bool} 474 | */ 475 | isActive: function () { 476 | return this.element.hasClass(this.settings.menuActiveClass); 477 | }, 478 | 479 | /** 480 | * Get the CSS translate3d rules 481 | * 482 | * @param {int} x 483 | * @param {int} y 484 | * @param {bool} scale 485 | * 486 | * @return {object} 487 | */ 488 | getCssTranslateRules: function (x, y, scale) { 489 | scale = scale ? ' scale3d(1, 1, 1)' : ''; 490 | 491 | return { 492 | 'will-change': 'transform', 493 | '-webkit-transform': 'translate3d(' + x + ', ' + y + ', 0)' + scale, 494 | '-moz-transform': 'translate3d(' + x + ', ' + y + ', 0)' + scale, 495 | '-ms-transform': 'translate3d(' + x + ', ' + y + ', 0)' + scale, 496 | '-o-transform': 'translate3d(' + x + ', ' + y + ', 0)' + scale, 497 | 'transform': 'translate3d(' + x + ', ' + y + ', 0)' + scale 498 | }; 499 | }, 500 | 501 | /** 502 | * Get the animation speed 503 | * 504 | * @return {int} 505 | */ 506 | getAnimationSpeed: function() { 507 | if (!this.settings.animation) { 508 | return 0; 509 | } 510 | 511 | return this.settings.animationSpeed; 512 | } 513 | }); 514 | 515 | // A really lightweight plugin wrapper around the constructor, 516 | // preventing against multiple instantiations 517 | $.fn[pluginName] = function (options) { 518 | return this.each(function () { 519 | if (!$.data(this, 'plugin_' + pluginName)) { 520 | $.data(this, 'plugin_' + pluginName, new Plugin(this, options)); 521 | } 522 | }); 523 | }; 524 | })(jQuery, window, document); 525 | -------------------------------------------------------------------------------- /assets/js/mobile-menu.jquery.min.js: -------------------------------------------------------------------------------- 1 | !function(s,t,e,i){"use strict";function a(t,e){this.element=s(t),this.overlay=null,this.settings=s.extend({},r,e),this._defaults=r,this._name=n,this.init()}var n="mobileMenu",r={animation:!1,animationSpeed:500,breakPoint:0,disableNavigation:!1,keepInPlace:!1,menuActiveClass:"active",menuActiveHtmlClass:"mobile_menu_active",menuSubNavigationHideCssClass:"submenu_hide",menuSubNavigationShowCssClass:"submenu_show",offCanvas:!1,offCanvasWrapper:null,offCanvasWrapperClass:"mobile_menu_wrapper",overlay:!1,overlayActiveCssClass:"active",overlayBackgroundCssClass:"background",overlayCssClass:"mobile_menu_overlay",position:"left",parentTogglers:!1,closeOnLinkClick:!1,size:75,trigger:null};s.extend(a.prototype,{init:function(){var e=s("body");if(!e.hasClass("ie8")&&!e.hasClass("ie9")){null===this.settings.offCanvasWrapper&&(this.settings.offCanvasWrapper=s("#wrapper")),this.initMenu(),this.initTrigger(),this.initOverlay(),this.settings.offCanvas&&this.initOffCanvasWrapper();var i=this;s(t).on("resize",function(){i.updateElementsVisibility()}),this.updateElementsVisibility(),this.element.css("display","block")}},initMenu:function(){var t=this,e=(this.settings.size>100?100:this.settings.size)+"%",i=this.getAnimationSpeed();switch(!0!==this.settings.disableNavigation&&this.element.find(".level_1").each(function(){t.initMenuNavigation(s(this))}),this.element.find('[data-mobile-menu="close"]').on("click",function(s){s.preventDefault(),t.hideMenu()}),this.settings.closeOnLinkClick&&this.element.find("a").on("click",function(){t.hideMenu()}),this.element.addClass("position_"+this.settings.position),this.settings.keepInPlace||this.element.appendTo("body"),this.settings.position){case"left":this.element.css({left:0,top:0,width:e,height:"100vh"}),this.element.css(this.getCssTranslateRules("-100%",0));break;case"top":this.element.css({left:0,top:0,height:e,width:"100%"}),this.element.css(this.getCssTranslateRules(0,"-100%"));break;case"bottom":this.element.css({left:0,bottom:0,height:e,width:"100%"}),this.element.css(this.getCssTranslateRules(0,"100%"));break;case"right":this.element.css({right:0,top:0,width:e,height:"100vh"}),this.element.css(this.getCssTranslateRules("100%",0))}this.element.css({"-webkit-backface-visibility":"hidden","-moz-backface-visibility":"hidden","-ms-backface-visibility":"hidden","-o-backface-visibility":"hidden","backface-visibility":"hidden"}),i&&this.element.css({"-webkit-transition":"-webkit-transform "+i+"ms ease","-moz-transition":"-moz-transform "+i+"ms ease","-o-transition":"-o-transform "+i+"ms ease",transition:"transform "+i+"ms ease"})},initMenuNavigation:function(t){var e=this,i=t.children(".submenu");i.each(function(){var t=s(this),a=t.children("a, span, strong").eq(0);a.hasClass("active")||a.hasClass("trail")?t.addClass(e.settings.menuSubNavigationShowCssClass):t.addClass(e.settings.menuSubNavigationHideCssClass),a.on("click",function(t){var a=s(this).parent();a.hasClass(e.settings.menuSubNavigationShowCssClass)?e.settings.parentTogglers&&(t.preventDefault(),a.addClass(e.settings.menuSubNavigationHideCssClass).removeClass(e.settings.menuSubNavigationShowCssClass)):(t.preventDefault(),i.removeClass(e.settings.menuSubNavigationShowCssClass).addClass(e.settings.menuSubNavigationHideCssClass),a.removeClass(e.settings.menuSubNavigationHideCssClass).addClass(e.settings.menuSubNavigationShowCssClass))});var n=t.children("ul").eq(0);n&&e.initMenuNavigation(n)})},initTrigger:function(){if(this.settings.trigger){var s=this;this.settings.trigger.on("click",function(){s.toggleMenu()})}},initOffCanvasWrapper:function(){var t=this.getAnimationSpeed(),e=s("
",{class:this.settings.offCanvasWrapperClass});switch(this.settings.offCanvasWrapper.parent().hasClass(this.settings.offCanvasWrapperClass)||this.settings.offCanvasWrapper.wrap(e),this.settings.offCanvasWrapper.css({"-webkit-transform":"translate3d(0, 0, 0)","-moz-transform":"translate3d(0, 0, 0)","-ms-transform":"translate3d(0, 0, 0)","-o-transform":"translate3d(0, 0, 0)",transform:"translate3d(0, 0, 0)","-webkit-backface-visibility":"hidden","-moz-backface-visibility":"hidden","-ms-backface-visibility":"hidden","-o-backface-visibility":"hidden","backface-visibility":"hidden"}),t>0&&this.settings.offCanvasWrapper.css({"-webkit-transition":"-webkit-transform "+t+"ms ease","-moz-transition":"-moz-transform "+t+"ms ease","-o-transition":"-o-transform "+t+"ms ease",transition:"transform "+t+"ms ease"}),this.settings.position){case"left":this.settings.offCanvasWrapper.css("left",0);break;case"top":this.settings.offCanvasWrapper.css("top",0);break;case"bottom":this.settings.offCanvasWrapper.css("bottom",0);break;case"right":this.settings.offCanvasWrapper.css("right",0)}},initOverlay:function(){var t=this,e=this.settings.overlayCssClass;this.settings.overlay&&(e=e+" "+this.settings.overlayBackgroundCssClass),this.overlay=s("
",{id:this.element.attr("id")+"-overlay",class:e}).on("click",function(){t.hideMenu()}).hide().appendTo("body")},updateElementsVisibility:function(){t.matchMedia("(max-width: "+this.settings.breakPoint+"px)").matches?this.showTrigger():(this.hideMenu(),this.hideTrigger())},showTrigger:function(){this.settings.trigger&&this.settings.trigger.show()},hideTrigger:function(){this.settings.trigger&&this.settings.trigger.hide()},showOverlay:function(){this.overlay&&(this.overlay.show(),this.overlay.addClass(this.settings.overlayActiveCssClass))},hideOverlay:function(){this.overlay&&(this.overlay.hide(),this.overlay.removeClass(this.settings.overlayActiveCssClass))},showMenu:function(){switch(this.element.trigger("showMobileMenu",[this]),this.settings.position){case"left":this.element.css(this.getCssTranslateRules(0,0,!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(this.settings.size+"%",0,!0));break;case"top":this.element.css(this.getCssTranslateRules(0,0,!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0,s(t).height()*(this.settings.size/100)+"px",!0));break;case"bottom":this.element.css(this.getCssTranslateRules(0,0,!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0,-1*s(t).height()*(this.settings.size/100)+"px",!0));break;case"right":this.element.css(this.getCssTranslateRules(0,0,!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(-1*this.settings.size+"%",0,!0))}this.showOverlay(),this.element.addClass(this.settings.menuActiveClass),s("html").addClass(this.settings.menuActiveHtmlClass),this.settings.trigger&&this.settings.trigger.addClass(this.settings.menuActiveClass)},hideMenu:function(){switch(this.element.trigger("hideMobileMenu",[this]),this.settings.position){case"left":this.element.css(this.getCssTranslateRules("-100%",0,!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0,0,!0));break;case"top":this.element.css(this.getCssTranslateRules(0,"-100%",!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0,0,!0));break;case"bottom":this.element.css(this.getCssTranslateRules(0,"100%",!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0,0,!0));break;case"right":this.element.css(this.getCssTranslateRules("100%",0,!0)),this.settings.offCanvas&&this.settings.offCanvasWrapper.css(this.getCssTranslateRules(0,0,!0))}this.hideOverlay(),this.element.removeClass(this.settings.menuActiveClass),s("html").removeClass(this.settings.menuActiveHtmlClass),this.settings.trigger&&this.settings.trigger.removeClass(this.settings.menuActiveClass)},toggleMenu:function(){this.isActive()?this.hideMenu():this.showMenu()},isActive:function(){return this.element.hasClass(this.settings.menuActiveClass)},getCssTranslateRules:function(s,t,e){return e=e?" scale3d(1, 1, 1)":"",{"will-change":"transform","-webkit-transform":"translate3d("+s+", "+t+", 0)"+e,"-moz-transform":"translate3d("+s+", "+t+", 0)"+e,"-ms-transform":"translate3d("+s+", "+t+", 0)"+e,"-o-transform":"translate3d("+s+", "+t+", 0)"+e,transform:"translate3d("+s+", "+t+", 0)"+e}},getAnimationSpeed:function(){return this.settings.animation?this.settings.animationSpeed:0}}),s.fn[n]=function(t){return this.each(function(){s.data(this,"plugin_"+n)||s.data(this,"plugin_"+n,new a(this,t))})}}(jQuery,window,document); -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codefog/contao-mobile_menu", 3 | "description": "mobile_menu extension for Contao Open Source CMS", 4 | "keywords": ["contao", "mobile", "menu", "navigation"], 5 | "type": "contao-module", 6 | "license": "LGPL-3.0+", 7 | "authors": [ 8 | { 9 | "name": "Codefog", 10 | "homepage": "http://codefog.pl" 11 | } 12 | ], 13 | "require": { 14 | "php": "^7.4 || ^8.0", 15 | "contao/core-bundle": "^4.13 || ^5.0", 16 | "contao-community-alliance/composer-plugin": "~2.4 || ~3.0" 17 | }, 18 | "autoload":{ 19 | "psr-4": { 20 | "Codefog\\MobileMenu\\": "src" 21 | } 22 | }, 23 | "extra": { 24 | "contao": { 25 | "sources": { 26 | "": "system/modules/mobile_menu" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /config/autoload.ini: -------------------------------------------------------------------------------- 1 | ;; 2 | ; List modules which are required to be loaded beforehand 3 | ;; 4 | requires[] = "core" 5 | 6 | ;; 7 | ; Configure what you want the autoload creator to register 8 | ;; 9 | register_namespaces = false 10 | register_classes = false 11 | register_templates = false 12 | -------------------------------------------------------------------------------- /config/autoload.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @license LGPL 12 | */ 13 | 14 | /** 15 | * Register the namespace 16 | */ 17 | ClassLoader::addNamespace('Codefog\MobileMenu'); 18 | 19 | /** 20 | * Register the classes 21 | */ 22 | ClassLoader::addClasses(array 23 | ( 24 | 'Codefog\MobileMenu\MobileMenuModule' => 'system/modules/mobile_menu/src/MobileMenuModule.php' 25 | )); 26 | 27 | /** 28 | * Register the templates 29 | */ 30 | TemplateLoader::addFiles(array 31 | ( 32 | 'mod_mobile_menu' => 'system/modules/mobile_menu/templates/modules' 33 | )); 34 | -------------------------------------------------------------------------------- /config/config.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @license LGPL 12 | */ 13 | 14 | /** 15 | * Extension version 16 | */ 17 | @define('MOBILE_MENU_VERSION', '2.6'); 18 | @define('MOBILE_MENU_BUILD', '0'); 19 | 20 | /** 21 | * Front end modules 22 | */ 23 | $GLOBALS['FE_MOD']['navigation']['mobile_menu'] = 'Codefog\MobileMenu\MobileMenuModule'; 24 | -------------------------------------------------------------------------------- /dca/tl_module.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @license LGPL 12 | */ 13 | 14 | /** 15 | * Add palettes to tl_module 16 | */ 17 | $GLOBALS['TL_DCA']['tl_module']['palettes']['__selector__'][] = 'mobile_menu_animation'; 18 | $GLOBALS['TL_DCA']['tl_module']['subpalettes']['mobile_menu_animation'] = 'mobile_menu_animationSpeed'; 19 | 20 | $GLOBALS['TL_DCA']['tl_module']['palettes']['mobile_menu'] = ' 21 | {title_legend},name,type; 22 | {config_legend},mobile_menu_trigger,mobile_menu_html; 23 | {mobile_menu_display_legend},mobile_menu_phones,mobile_menu_tablets,mobile_menu_breakpoint,mobile_menu_parentTogglers,mobile_menu_disableNavigation,mobile_menu_closeOnLinkClick,mobile_menu_keepInPlace; 24 | {mobile_menu_design_legend},mobile_menu_position,mobile_menu_size,mobile_menu_overlay,mobile_menu_offCanvas,mobile_menu_noShadow,mobile_menu_animation; 25 | {template_legend:hide},customTpl; 26 | {protected_legend:hide},protected; 27 | {expert_legend:hide},guests,cssID,space'; 28 | 29 | /** 30 | * Add fields to tl_module 31 | */ 32 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_phones'] = array 33 | ( 34 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_phones'], 35 | 'exclude' => true, 36 | 'inputType' => 'checkbox', 37 | 'eval' => array('tl_class'=>'w50'), 38 | 'sql' => "char(1) NOT NULL default ''" 39 | ); 40 | 41 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_tablets'] = array 42 | ( 43 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_tablets'], 44 | 'exclude' => true, 45 | 'inputType' => 'checkbox', 46 | 'eval' => array('tl_class'=>'w50'), 47 | 'sql' => "char(1) NOT NULL default ''" 48 | ); 49 | 50 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_breakpoint'] = array 51 | ( 52 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_breakpoint'], 53 | 'exclude' => true, 54 | 'inputType' => 'text', 55 | 'eval' => array('rgxp'=>'digit', 'maxlength'=>4, 'tl_class'=>'clr'), 56 | 'sql' => "varchar(4) NOT NULL default ''" 57 | ); 58 | 59 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_disableNavigation'] = array 60 | ( 61 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_disableNavigation'], 62 | 'exclude' => true, 63 | 'inputType' => 'checkbox', 64 | 'eval' => array('tl_class'=>'w50 m12'), 65 | 'sql' => "char(1) NOT NULL default ''" 66 | ); 67 | 68 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_parentTogglers'] = array 69 | ( 70 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_parentTogglers'], 71 | 'exclude' => true, 72 | 'inputType' => 'checkbox', 73 | 'eval' => array('tl_class'=>'w50 m12'), 74 | 'sql' => "char(1) NOT NULL default ''" 75 | ); 76 | 77 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_closeOnLinkClick'] = array 78 | ( 79 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_closeOnLinkClick'], 80 | 'exclude' => true, 81 | 'inputType' => 'checkbox', 82 | 'eval' => array('tl_class'=>'w50'), 83 | 'sql' => "char(1) NOT NULL default ''" 84 | ); 85 | 86 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_keepInPlace'] = array 87 | ( 88 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_keepInPlace'], 89 | 'exclude' => true, 90 | 'inputType' => 'checkbox', 91 | 'eval' => array('tl_class'=>'w50'), 92 | 'sql' => "char(1) NOT NULL default ''" 93 | ); 94 | 95 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_position'] = array 96 | ( 97 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_position'], 98 | 'default' => 'left', 99 | 'exclude' => true, 100 | 'inputType' => 'select', 101 | 'options' => array('left', 'right', 'top', 'bottom'), 102 | 'reference' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_position'], 103 | 'eval' => array('tl_class'=>'w50'), 104 | 'sql' => "varchar(8) NOT NULL default ''" 105 | ); 106 | 107 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_size'] = array 108 | ( 109 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_size'], 110 | 'exclude' => true, 111 | 'inputType' => 'text', 112 | 'eval' => array('rgxp'=>'prcnt', 'tl_class'=>'w50'), 113 | 'sql' => "varchar(3) NOT NULL default ''" 114 | ); 115 | 116 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_overlay'] = array 117 | ( 118 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_overlay'], 119 | 'exclude' => true, 120 | 'inputType' => 'checkbox', 121 | 'eval' => array('tl_class'=>'w50'), 122 | 'sql' => "char(1) NOT NULL default ''" 123 | ); 124 | 125 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_offCanvas'] = array 126 | ( 127 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_offCanvas'], 128 | 'exclude' => true, 129 | 'inputType' => 'checkbox', 130 | 'eval' => array('tl_class'=>'w50'), 131 | 'sql' => "char(1) NOT NULL default ''" 132 | ); 133 | 134 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_noShadow'] = array 135 | ( 136 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_noShadow'], 137 | 'exclude' => true, 138 | 'inputType' => 'checkbox', 139 | 'eval' => array('tl_class'=>'w50'), 140 | 'sql' => "char(1) NOT NULL default ''" 141 | ); 142 | 143 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_animation'] = array 144 | ( 145 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_animation'], 146 | 'exclude' => true, 147 | 'inputType' => 'checkbox', 148 | 'eval' => array('submitOnChange'=>true, 'tl_class'=>'clr'), 149 | 'sql' => "char(1) NOT NULL default ''" 150 | ); 151 | 152 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_animationSpeed'] = array 153 | ( 154 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_animationSpeed'], 155 | 'default' => 500, 156 | 'exclude' => true, 157 | 'inputType' => 'text', 158 | 'eval' => array('rgxp'=>'digit', 'tl_class'=>'w50'), 159 | 'sql' => "smallint(5) unsigned NOT NULL default '0'" 160 | ); 161 | 162 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_trigger'] = array 163 | ( 164 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_trigger'], 165 | 'exclude' => true, 166 | 'inputType' => 'textarea', 167 | 'eval' => array('allowHtml'=>true, 'class'=>'monospace', 'rte'=>'ace|html', 'helpwizard'=>true, 'tl_class'=>'clr'), 168 | 'explanation' => 'insertTags', 169 | 'sql' => "text NULL" 170 | ); 171 | 172 | $GLOBALS['TL_DCA']['tl_module']['fields']['mobile_menu_html'] = array 173 | ( 174 | 'label' => &$GLOBALS['TL_LANG']['tl_module']['mobile_menu_html'], 175 | 'exclude' => true, 176 | 'inputType' => 'textarea', 177 | 'eval' => array('allowHtml'=>true, 'class'=>'monospace', 'rte'=>'ace|html', 'helpwizard'=>true), 178 | 'explanation' => 'insertTags', 179 | 'sql' => "text NULL" 180 | ); 181 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Mobile Menu – Documentation 2 | 3 | ## Panel content 4 | 5 | Firstly, you need to plan what should be inside the mobile panel. Usually it is a good place for navigation 6 | and some additional content like contact details or even search box. Create then the necessary modules and write down 7 | their IDs - they are mandatory for the insert tag. 8 | 9 | ## Create a module 10 | 11 | Once the content for panel is ready, please create a new front end module of `Mobile menu` type. The first thing 12 | you need to configure is the visibility of the module on the mobile devices. Set whether the menu should be visible 13 | on the phones, tablets or both. You can also enter your own breakpoint in pixels. Please note that setting a custom 14 | breakpoint value will override the two other checkbox settings. 15 | 16 | The trigger content is the HTML code of the element which when clicked will open the panel. In the below example 17 | I used a simple label wrapped in `` tag. 18 | 19 | The menu content is the actual content of the panel. Here you should insert the navigation module using 20 | the `{{insert_module::ID}}` insert tag. Additionally, you can for example add contact information or any other 21 | elements you'd like to have. 22 | 23 | ![](images/configuration.png) 24 | 25 | ## Design settings 26 | 27 | Next, you should decide where the menu should be displayed. You can either choose left or right side, top or the bottom. 28 | Here you can also specify the width or height (depends on position type) dimension in percent (%). If you leave 29 | this field empty, the default value will be used which is 80%. 30 | 31 | Additionally, you can enable the overlay effect which will overlay the website content with a dark transparent layer 32 | when the menu is open. The off canvas effect will cause your website content to be visually pushed to the side, 33 | making space for mobile menu content. 34 | 35 | To make it even more attractive, it is possible to set the animation during opening and closing the menu. After enabling 36 | the animation, please enter the animation duration in milliseconds (1000ms = 1s). The default value is 500ms. 37 | 38 | > The mobile menu comes with a very minimal styling. It's not a bug, it's a feature - it is totally up to the user 39 | > what styles should be applied to it. 40 | 41 | ## Custom close buttons 42 | 43 | Since version 2.1 it is possible to have the custom close buttons within the menu content. Every element that performs 44 | close action should receive the following data attribute: 45 | 46 | ```html 47 | Close 48 | ``` 49 | 50 | ## Events 51 | 52 | ### Show menu event 53 | 54 | The event is triggered when the menu is shown: 55 | 56 | ```js 57 | $('#mobile-menu-...').on('showMobileMenu', function (event, plugin) { 58 | // ... 59 | }); 60 | ``` 61 | 62 | ### Hide menu event 63 | 64 | The event is triggered when the menu is hidden: 65 | 66 | ```js 67 | $('#mobile-menu-...').on('hideMobileMenu', function (event, plugin) { 68 | // ... 69 | }); 70 | ``` 71 | 72 | ## Include the module in the layout 73 | 74 | Do not forget to include the module in the page layout! Depending on your configuration and style of developing 75 | the websites, you can either do that by adjust the page layout settings or using the `{{insert_module::ID}}` insert tag 76 | in some HTML front end module that is used to render page header. 77 | -------------------------------------------------------------------------------- /docs/images/configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codefog/contao-mobile_menu/cfa7639d0295510ed943a70b7d9791cbc392bf99/docs/images/configuration.png -------------------------------------------------------------------------------- /docs/images/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codefog/contao-mobile_menu/cfa7639d0295510ed943a70b7d9791cbc392bf99/docs/images/preview.png -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const gulp = require('gulp'); 4 | const uglify = require('gulp-uglify'); 5 | const cleanCSS = require('gulp-clean-css'); 6 | const rename = require('gulp-rename'); 7 | 8 | gulp.task('scripts', function () { 9 | return gulp.src('assets/js/mobile-menu.jquery.js') 10 | .pipe(uglify()) 11 | .pipe(rename(function(path) { 12 | path.extname = '.min' + path.extname; 13 | })) 14 | .pipe(gulp.dest('assets/js')); 15 | }); 16 | 17 | gulp.task('styles', function () { 18 | return gulp.src('assets/css/mobile-menu.css') 19 | .pipe(cleanCSS({restructuring: false})) 20 | .pipe(rename(function(path) { 21 | path.extname = '.min' + path.extname; 22 | })) 23 | .pipe(gulp.dest('assets/css')); 24 | }); 25 | 26 | gulp.task('default', ['scripts', 'styles']); 27 | -------------------------------------------------------------------------------- /languages/de/modules.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @author Didier Federer 12 | * @license LGPL 13 | */ 14 | 15 | /** 16 | * Front end modules 17 | */ 18 | $GLOBALS['TL_LANG']['FMD']['mobile_menu'] = ['Mobile Menu', 'Fügt ein Mobile Menu auf der Seite ein.']; 19 | -------------------------------------------------------------------------------- /languages/de/tl_module.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @author Didier Federer 12 | * @author Joachim Scholtysik 13 | * @license LGPL 14 | */ 15 | 16 | /** 17 | * Fields 18 | */ 19 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_phones'] = [ 20 | 'Auf Smartphones anzeigen', 21 | 'Zeigt das Menü auf Smartphones an (Max. Breite: 767px).', 22 | ]; 23 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_tablets'] = [ 24 | 'Auf Tablets anzeigen', 25 | 'Zeigt das Menü auf Tablets an (Max. Breite: 991px).', 26 | ]; 27 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_breakpoint'] = [ 28 | 'Individueller Breakpoint (px)', 29 | 'Hier können Sie einen individuellen Breakpoint in Pixel eingeben, bei dem das Menü angezeigt werden soll. Dieser Wert überschreibt die oben vordefinierten Breakpoints für Smartphones und Tablets!', 30 | ]; 31 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_disableNavigation'] = [ 32 | 'Zusammenklappbare Navigation deaktivieren', 33 | 'Deaktiviert die Eigenschaft, die Navigation standardmäßig zusammenklappen zu können (nicht empfohlen).', 34 | ]; 35 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_parentTogglers'] = [ 36 | 'Eltern-Menüpunkte nur als Toggler verwenden', 37 | 'Bewirkt, dass die Menüpunkte mit Untermenüs nur als Toggler verwendet werden können. Damit ist es nicht möglich, eine Seite mit Untermenüs durch Klick auszuwählen.', 38 | ]; 39 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_closeOnLinkClick'] = [ 40 | 'Menü beim Klick auf einen Link schließen.', 41 | 'Schließt das Menü, wenn ein Link darin angeklickt wird. Das ist besonders hilfreich beim Scrollen in einer One-Page Navigation.', 42 | ]; 43 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position'] = [ 44 | 'Position', 45 | 'Hier können Sie die Menüposition auswählen.', 46 | ]; 47 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_size'] = [ 48 | 'Individuelle Menügröße (%)', 49 | 'Hier können Sie die individuelle Menübreite oder -höhe in % eingeben.', 50 | ]; 51 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_overlay'] = [ 52 | 'Overlay aktivieren', 53 | 'Aktivieren des Overlays über den Inhalt, wenn das Menü aktiv ist.', 54 | ]; 55 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_offCanvas'] = [ 56 | 'Off Canvas Effekt', 57 | 'Den Off Canvas Effekt verwenden, wenn das Menü aktiv ist.', 58 | ]; 59 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_noShadow'] = [ 60 | 'Menüschatten deaktivieren', 61 | 'Deaktivieren des Menüschattens, wenn das Menü aktiv ist.', 62 | ]; 63 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_animation'] = [ 64 | 'Animation aktivieren', 65 | 'Aktvivieren der Animation für die Anzeige und das Verstecken des Menüs.', 66 | ]; 67 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_animationSpeed'] = [ 68 | 'Animationsgeschwindigkeit (ms)', 69 | 'Hier können Sie die Animationsgeschwindigkeit des Menüs eingeben (1000ms = 1 Sekunde).', 70 | ]; 71 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_trigger'] = [ 72 | 'Trigger Inhalt', 73 | 'Hier können Sie den HTML Inhalt des Triggers hinzufügen.', 74 | ]; 75 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_html'] = [ 76 | 'Menu Inhalt', 77 | 'Hier können Sie den HTML Inhalt des Menüs hinzufügen.', 78 | ]; 79 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_keepInPlace'] = [ 80 | 'Menü an der Position behalten', 81 | 'Bewege das Menü nicht ans Ende des <body> Elementes. Hinweis: Diese Einstellung ist für Nutzer, die das Standardverhalten des Menüs ändern möchten.' 82 | ]; 83 | 84 | /** 85 | * Reference 86 | */ 87 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['left'] = 'Links'; 88 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['right'] = 'Rechts'; 89 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['top'] = 'Oben'; 90 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['bottom'] = 'Unten'; 91 | 92 | /** 93 | * Legends 94 | */ 95 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_display_legend'] = 'Anzeigeeinstellungen'; 96 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_design_legend'] = 'Darstellungseinstellungen'; 97 | -------------------------------------------------------------------------------- /languages/en/modules.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @license LGPL 12 | */ 13 | 14 | /** 15 | * Front end modules 16 | */ 17 | $GLOBALS['TL_LANG']['FMD']['mobile_menu'] = ['Mobile menu', 'Adds a mobile menu to the page.']; 18 | -------------------------------------------------------------------------------- /languages/en/tl_module.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @license LGPL 12 | */ 13 | 14 | /** 15 | * Fields 16 | */ 17 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_phones'] = [ 18 | 'Display on phones', 19 | 'Display the menu on phone devices (767px screen width).' 20 | ]; 21 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_tablets'] = [ 22 | 'Display on tablets', 23 | 'Display the menu on tablet devices (991px screen width).' 24 | ]; 25 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_breakpoint'] = [ 26 | 'Custom breakpoint (px)', 27 | 'Here you can enter a custom breakpoint when the menu will be shown in pixels. This value will override the above predefined breakpoints for phones and tablets!' 28 | ]; 29 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_disableNavigation'] = [ 30 | 'Disable collapsible navigation', 31 | 'Disable the default collapsible navigation feature (not recommended).' 32 | ]; 33 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_parentTogglers'] = [ 34 | 'Make parent items work as togglers only', 35 | 'Force the items that have submenus to work as togglers only. It will not be possible to access the page with submenus by clicking on it.' 36 | ]; 37 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_closeOnLinkClick'] = [ 38 | 'Close menu on link click', 39 | 'Close the mobile menu if any link inside it is clicked. This is especially useful for one-page navigation scroll.' 40 | ]; 41 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_keepInPlace'] = [ 42 | 'Keep menu in place', 43 | 'Do not move the menu to the <body> element at the bottom. Note: this setting is dedicated for users who would like to change the menu default behavior.' 44 | ]; 45 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position'] = ['Position', 'Here you can choose the menu position.']; 46 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_size'] = [ 47 | 'Custom menu size (%s)', 48 | 'Here you can enter the custom menu width or height in %.' 49 | ]; 50 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_overlay'] = [ 51 | 'Enable the overlay', 52 | 'Enable the overlay over the content when menu is active.' 53 | ]; 54 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_offCanvas'] = [ 55 | 'Off canvas effect', 56 | 'Use the off canvas effect when menu is active.' 57 | ]; 58 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_noShadow'] = [ 59 | 'Disable menu shadow', 60 | 'Disable the default menu shadow when it is active.' 61 | ]; 62 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_animation'] = [ 63 | 'Enable animation', 64 | 'Enable animation of showing and hiding the menu.' 65 | ]; 66 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_animationSpeed'] = [ 67 | 'Animation speed (ms)', 68 | 'Here you can enter the animation speed of the menu (1000ms = 1 second).' 69 | ]; 70 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_trigger'] = [ 71 | 'Trigger content', 72 | 'Here you can add the HTML content of the trigger.' 73 | ]; 74 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_html'] = [ 75 | 'Menu content', 76 | 'Here you can add the HTML content of the menu.' 77 | ]; 78 | 79 | /** 80 | * Reference 81 | */ 82 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['left'] = 'Left side'; 83 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['right'] = 'Right side'; 84 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['top'] = 'On the top'; 85 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_position']['bottom'] = 'On the bottom'; 86 | 87 | /** 88 | * Legends 89 | */ 90 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_display_legend'] = 'Display settings'; 91 | $GLOBALS['TL_LANG']['tl_module']['mobile_menu_design_legend'] = 'Design settings'; 92 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "gulp": "^3.9.1", 4 | "gulp-clean-css": "^3.9.0", 5 | "gulp-rename": "^1.2.2", 6 | "gulp-uglify": "^2.1.0" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/MobileMenuModule.php: -------------------------------------------------------------------------------- 1 | 10 | * @author Kamil Kuzminski 11 | * @license LGPL 12 | */ 13 | 14 | namespace Codefog\MobileMenu; 15 | 16 | /** 17 | * Class MobileMenuModule 18 | * 19 | * Front end module "mobile menu". 20 | */ 21 | class MobileMenuModule extends \Contao\Module 22 | { 23 | 24 | /** 25 | * Template 26 | * @var string 27 | */ 28 | protected $strTemplate = 'mod_mobile_menu'; 29 | 30 | /** 31 | * Display a wildcard in the back end 32 | * @return string 33 | */ 34 | public function generate() 35 | { 36 | $request = \Contao\System::getContainer()->get('request_stack')->getCurrentRequest(); 37 | 38 | if ($request && \Contao\System::getContainer()->get('contao.routing.scope_matcher')->isBackendRequest($request)) 39 | { 40 | $objTemplate = new \Contao\BackendTemplate('be_wildcard'); 41 | 42 | $objTemplate->wildcard = '### ' . mb_strtoupper($GLOBALS['TL_LANG']['FMD']['mobile_menu'][0]) . ' ###'; 43 | $objTemplate->title = $this->headline; 44 | $objTemplate->id = $this->id; 45 | $objTemplate->link = $this->name; 46 | $objTemplate->href = \Contao\StringUtil::specialcharsUrl(\Contao\System::getContainer()->get('router')->generate('contao_backend', array('do'=>'themes', 'table'=>'tl_module', 'act'=>'edit', 'id'=>$this->id))); 47 | 48 | 49 | return $objTemplate->parse(); 50 | } 51 | 52 | return parent::generate(); 53 | } 54 | 55 | /** 56 | * Generate the module 57 | */ 58 | protected function compile() 59 | { 60 | $this->Template->trigger = $this->mobile_menu_trigger; 61 | $this->Template->html = $this->mobile_menu_html; 62 | $this->Template->position = $this->mobile_menu_position; 63 | $this->Template->size = (int)$this->mobile_menu_size; 64 | $this->Template->overlay = $this->mobile_menu_overlay; 65 | $this->Template->offCanvas = $this->mobile_menu_offCanvas; 66 | $this->Template->animation = $this->mobile_menu_animation; 67 | $this->Template->animationSpeed = (int)$this->mobile_menu_animationSpeed; 68 | $this->Template->mediaQuery = $this->mobile_menu_mediaQuery; 69 | $this->Template->noShadow = $this->mobile_menu_noShadow; 70 | $this->Template->disableNavigation = $this->mobile_menu_disableNavigation; 71 | $this->Template->parentTogglers = $this->mobile_menu_parentTogglers; 72 | $this->Template->closeOnLinkClick = $this->mobile_menu_closeOnLinkClick; 73 | $this->Template->keepInPlace = $this->mobile_menu_keepInPlace; 74 | 75 | $breakPoint = 0; 76 | 77 | // Display on phones 78 | if ($this->mobile_menu_phones) { 79 | $breakPoint = 767; 80 | } 81 | 82 | // Display on tablets 83 | if ($this->mobile_menu_tablets) { 84 | $breakPoint = 991; 85 | } 86 | 87 | // Set a custom break point 88 | if ($this->mobile_menu_breakpoint) { 89 | $breakPoint = (int)$this->mobile_menu_breakpoint; 90 | } 91 | 92 | $this->Template->breakPoint = $breakPoint; 93 | 94 | $this->addMobileMenuAssets(); 95 | } 96 | 97 | /** 98 | * Add the mobile menu assets 99 | */ 100 | protected function addMobileMenuAssets() 101 | { 102 | $GLOBALS['TL_CSS']['mobileMenu'] = 'system/modules/mobile_menu/assets/css/mobile-menu.min.css||static'; 103 | $GLOBALS['TL_JAVASCRIPT']['mobileMenu'] = 'system/modules/mobile_menu/assets/js/mobile-menu.jquery.min.js|static'; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /templates/modules/mod_mobile_menu.html5: -------------------------------------------------------------------------------- 1 | 2 | extend('block_unsearchable'); ?> 3 | 4 | block('content'); ?> 5 | 6 |
7 | trigger; ?> 8 |
9 | 10 |
11 |
12 | html; ?> 13 |
14 |
15 | 16 | 36 | 37 | endblock(); ?> 38 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | align-text@^0.1.1, align-text@^0.1.3: 6 | version "0.1.4" 7 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 8 | dependencies: 9 | kind-of "^3.0.2" 10 | longest "^1.0.1" 11 | repeat-string "^1.5.2" 12 | 13 | ansi-regex@^2.0.0: 14 | version "2.1.1" 15 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 16 | 17 | ansi-styles@^2.2.1: 18 | version "2.2.1" 19 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 20 | 21 | archy@^1.0.0: 22 | version "1.0.0" 23 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 24 | 25 | arr-diff@^2.0.0: 26 | version "2.0.0" 27 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 28 | dependencies: 29 | arr-flatten "^1.0.1" 30 | 31 | arr-flatten@^1.0.1: 32 | version "1.1.0" 33 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 34 | 35 | array-differ@^1.0.0: 36 | version "1.0.0" 37 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 38 | 39 | array-each@^1.0.1: 40 | version "1.0.1" 41 | resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" 42 | 43 | array-slice@^1.0.0: 44 | version "1.1.0" 45 | resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" 46 | 47 | array-uniq@^1.0.2: 48 | version "1.0.3" 49 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 50 | 51 | array-unique@^0.2.1: 52 | version "0.2.1" 53 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 54 | 55 | balanced-match@^1.0.0: 56 | version "1.0.0" 57 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 58 | 59 | beeper@^1.0.0: 60 | version "1.1.1" 61 | resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" 62 | 63 | brace-expansion@^1.0.0: 64 | version "1.1.8" 65 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 66 | dependencies: 67 | balanced-match "^1.0.0" 68 | concat-map "0.0.1" 69 | 70 | braces@^1.8.2: 71 | version "1.8.5" 72 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 73 | dependencies: 74 | expand-range "^1.8.1" 75 | preserve "^0.2.0" 76 | repeat-element "^1.1.2" 77 | 78 | camelcase@^1.0.2: 79 | version "1.2.1" 80 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 81 | 82 | center-align@^0.1.1: 83 | version "0.1.3" 84 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 85 | dependencies: 86 | align-text "^0.1.3" 87 | lazy-cache "^1.0.3" 88 | 89 | chalk@^1.0.0, chalk@^1.1.1: 90 | version "1.1.3" 91 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 92 | dependencies: 93 | ansi-styles "^2.2.1" 94 | escape-string-regexp "^1.0.2" 95 | has-ansi "^2.0.0" 96 | strip-ansi "^3.0.0" 97 | supports-color "^2.0.0" 98 | 99 | clean-css@4.1.9: 100 | version "4.1.9" 101 | resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.9.tgz#35cee8ae7687a49b98034f70de00c4edd3826301" 102 | dependencies: 103 | source-map "0.5.x" 104 | 105 | cliui@^2.1.0: 106 | version "2.1.0" 107 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 108 | dependencies: 109 | center-align "^0.1.1" 110 | right-align "^0.1.1" 111 | wordwrap "0.0.2" 112 | 113 | clone-stats@^0.0.1: 114 | version "0.0.1" 115 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 116 | 117 | clone@^0.2.0: 118 | version "0.2.0" 119 | resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" 120 | 121 | clone@^1.0.0, clone@^1.0.2: 122 | version "1.0.3" 123 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" 124 | 125 | concat-map@0.0.1: 126 | version "0.0.1" 127 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 128 | 129 | core-util-is@~1.0.0: 130 | version "1.0.2" 131 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 132 | 133 | dateformat@^2.0.0: 134 | version "2.2.0" 135 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" 136 | 137 | decamelize@^1.0.0: 138 | version "1.2.0" 139 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 140 | 141 | defaults@^1.0.0: 142 | version "1.0.3" 143 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 144 | dependencies: 145 | clone "^1.0.2" 146 | 147 | deprecated@^0.0.1: 148 | version "0.0.1" 149 | resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" 150 | 151 | detect-file@^0.1.0: 152 | version "0.1.0" 153 | resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" 154 | dependencies: 155 | fs-exists-sync "^0.1.0" 156 | 157 | duplexer2@0.0.2: 158 | version "0.0.2" 159 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" 160 | dependencies: 161 | readable-stream "~1.1.9" 162 | 163 | end-of-stream@~0.1.5: 164 | version "0.1.5" 165 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" 166 | dependencies: 167 | once "~1.3.0" 168 | 169 | escape-string-regexp@^1.0.2: 170 | version "1.0.5" 171 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 172 | 173 | expand-brackets@^0.1.4: 174 | version "0.1.5" 175 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 176 | dependencies: 177 | is-posix-bracket "^0.1.0" 178 | 179 | expand-range@^1.8.1: 180 | version "1.8.2" 181 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 182 | dependencies: 183 | fill-range "^2.1.0" 184 | 185 | expand-tilde@^1.2.2: 186 | version "1.2.2" 187 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" 188 | dependencies: 189 | os-homedir "^1.0.1" 190 | 191 | expand-tilde@^2.0.2: 192 | version "2.0.2" 193 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" 194 | dependencies: 195 | homedir-polyfill "^1.0.1" 196 | 197 | extend@^3.0.0: 198 | version "3.0.1" 199 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 200 | 201 | extglob@^0.3.1: 202 | version "0.3.2" 203 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 204 | dependencies: 205 | is-extglob "^1.0.0" 206 | 207 | fancy-log@^1.1.0: 208 | version "1.3.0" 209 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" 210 | dependencies: 211 | chalk "^1.1.1" 212 | time-stamp "^1.0.0" 213 | 214 | filename-regex@^2.0.0: 215 | version "2.0.1" 216 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 217 | 218 | fill-range@^2.1.0: 219 | version "2.2.3" 220 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 221 | dependencies: 222 | is-number "^2.1.0" 223 | isobject "^2.0.0" 224 | randomatic "^1.1.3" 225 | repeat-element "^1.1.2" 226 | repeat-string "^1.5.2" 227 | 228 | find-index@^0.1.1: 229 | version "0.1.1" 230 | resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" 231 | 232 | findup-sync@^0.4.2: 233 | version "0.4.3" 234 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" 235 | dependencies: 236 | detect-file "^0.1.0" 237 | is-glob "^2.0.1" 238 | micromatch "^2.3.7" 239 | resolve-dir "^0.1.0" 240 | 241 | fined@^1.0.1: 242 | version "1.1.0" 243 | resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" 244 | dependencies: 245 | expand-tilde "^2.0.2" 246 | is-plain-object "^2.0.3" 247 | object.defaults "^1.1.0" 248 | object.pick "^1.2.0" 249 | parse-filepath "^1.0.1" 250 | 251 | first-chunk-stream@^1.0.0: 252 | version "1.0.0" 253 | resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" 254 | 255 | flagged-respawn@^0.3.2: 256 | version "0.3.2" 257 | resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" 258 | 259 | for-in@^1.0.1: 260 | version "1.0.2" 261 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 262 | 263 | for-own@^0.1.4: 264 | version "0.1.5" 265 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 266 | dependencies: 267 | for-in "^1.0.1" 268 | 269 | for-own@^1.0.0: 270 | version "1.0.0" 271 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 272 | dependencies: 273 | for-in "^1.0.1" 274 | 275 | fs-exists-sync@^0.1.0: 276 | version "0.1.0" 277 | resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" 278 | 279 | gaze@^0.5.1: 280 | version "0.5.2" 281 | resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" 282 | dependencies: 283 | globule "~0.1.0" 284 | 285 | glob-base@^0.3.0: 286 | version "0.3.0" 287 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 288 | dependencies: 289 | glob-parent "^2.0.0" 290 | is-glob "^2.0.0" 291 | 292 | glob-parent@^2.0.0: 293 | version "2.0.0" 294 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 295 | dependencies: 296 | is-glob "^2.0.0" 297 | 298 | glob-stream@^3.1.5: 299 | version "3.1.18" 300 | resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" 301 | dependencies: 302 | glob "^4.3.1" 303 | glob2base "^0.0.12" 304 | minimatch "^2.0.1" 305 | ordered-read-streams "^0.1.0" 306 | through2 "^0.6.1" 307 | unique-stream "^1.0.0" 308 | 309 | glob-watcher@^0.0.6: 310 | version "0.0.6" 311 | resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" 312 | dependencies: 313 | gaze "^0.5.1" 314 | 315 | glob2base@^0.0.12: 316 | version "0.0.12" 317 | resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" 318 | dependencies: 319 | find-index "^0.1.1" 320 | 321 | glob@^4.3.1: 322 | version "4.5.3" 323 | resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" 324 | dependencies: 325 | inflight "^1.0.4" 326 | inherits "2" 327 | minimatch "^2.0.1" 328 | once "^1.3.0" 329 | 330 | glob@~3.1.21: 331 | version "3.1.21" 332 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" 333 | dependencies: 334 | graceful-fs "~1.2.0" 335 | inherits "1" 336 | minimatch "~0.2.11" 337 | 338 | global-modules@^0.2.3: 339 | version "0.2.3" 340 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" 341 | dependencies: 342 | global-prefix "^0.1.4" 343 | is-windows "^0.2.0" 344 | 345 | global-prefix@^0.1.4: 346 | version "0.1.5" 347 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" 348 | dependencies: 349 | homedir-polyfill "^1.0.0" 350 | ini "^1.3.4" 351 | is-windows "^0.2.0" 352 | which "^1.2.12" 353 | 354 | globule@~0.1.0: 355 | version "0.1.0" 356 | resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" 357 | dependencies: 358 | glob "~3.1.21" 359 | lodash "~1.0.1" 360 | minimatch "~0.2.11" 361 | 362 | glogg@^1.0.0: 363 | version "1.0.0" 364 | resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" 365 | dependencies: 366 | sparkles "^1.0.0" 367 | 368 | graceful-fs@^3.0.0: 369 | version "3.0.11" 370 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" 371 | dependencies: 372 | natives "^1.1.0" 373 | 374 | graceful-fs@~1.2.0: 375 | version "1.2.3" 376 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" 377 | 378 | gulp-clean-css@^3.9.0: 379 | version "3.9.0" 380 | resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.9.0.tgz#e43e4c8d695060f6ba08a154d8e76d0d87b1c822" 381 | dependencies: 382 | clean-css "4.1.9" 383 | gulp-util "3.0.8" 384 | through2 "2.0.3" 385 | vinyl-sourcemaps-apply "0.2.1" 386 | 387 | gulp-rename@^1.2.2: 388 | version "1.2.2" 389 | resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" 390 | 391 | gulp-uglify@^2.1.0: 392 | version "2.1.2" 393 | resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-2.1.2.tgz#6db85b1d0ee63d18058592b658649d65c2ec4541" 394 | dependencies: 395 | gulplog "^1.0.0" 396 | has-gulplog "^0.1.0" 397 | lodash "^4.13.1" 398 | make-error-cause "^1.1.1" 399 | through2 "^2.0.0" 400 | uglify-js "~2.8.10" 401 | uglify-save-license "^0.4.1" 402 | vinyl-sourcemaps-apply "^0.2.0" 403 | 404 | gulp-util@3.0.8, gulp-util@^3.0.0: 405 | version "3.0.8" 406 | resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" 407 | dependencies: 408 | array-differ "^1.0.0" 409 | array-uniq "^1.0.2" 410 | beeper "^1.0.0" 411 | chalk "^1.0.0" 412 | dateformat "^2.0.0" 413 | fancy-log "^1.1.0" 414 | gulplog "^1.0.0" 415 | has-gulplog "^0.1.0" 416 | lodash._reescape "^3.0.0" 417 | lodash._reevaluate "^3.0.0" 418 | lodash._reinterpolate "^3.0.0" 419 | lodash.template "^3.0.0" 420 | minimist "^1.1.0" 421 | multipipe "^0.1.2" 422 | object-assign "^3.0.0" 423 | replace-ext "0.0.1" 424 | through2 "^2.0.0" 425 | vinyl "^0.5.0" 426 | 427 | gulp@^3.9.1: 428 | version "3.9.1" 429 | resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" 430 | dependencies: 431 | archy "^1.0.0" 432 | chalk "^1.0.0" 433 | deprecated "^0.0.1" 434 | gulp-util "^3.0.0" 435 | interpret "^1.0.0" 436 | liftoff "^2.1.0" 437 | minimist "^1.1.0" 438 | orchestrator "^0.3.0" 439 | pretty-hrtime "^1.0.0" 440 | semver "^4.1.0" 441 | tildify "^1.0.0" 442 | v8flags "^2.0.2" 443 | vinyl-fs "^0.3.0" 444 | 445 | gulplog@^1.0.0: 446 | version "1.0.0" 447 | resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" 448 | dependencies: 449 | glogg "^1.0.0" 450 | 451 | has-ansi@^2.0.0: 452 | version "2.0.0" 453 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 454 | dependencies: 455 | ansi-regex "^2.0.0" 456 | 457 | has-gulplog@^0.1.0: 458 | version "0.1.0" 459 | resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" 460 | dependencies: 461 | sparkles "^1.0.0" 462 | 463 | homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: 464 | version "1.0.1" 465 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" 466 | dependencies: 467 | parse-passwd "^1.0.0" 468 | 469 | inflight@^1.0.4: 470 | version "1.0.6" 471 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 472 | dependencies: 473 | once "^1.3.0" 474 | wrappy "1" 475 | 476 | inherits@1: 477 | version "1.0.2" 478 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" 479 | 480 | inherits@2, inherits@~2.0.1, inherits@~2.0.3: 481 | version "2.0.3" 482 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 483 | 484 | ini@^1.3.4: 485 | version "1.3.5" 486 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 487 | 488 | interpret@^1.0.0: 489 | version "1.1.0" 490 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" 491 | 492 | is-absolute@^0.2.3: 493 | version "0.2.6" 494 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" 495 | dependencies: 496 | is-relative "^0.2.1" 497 | is-windows "^0.2.0" 498 | 499 | is-buffer@^1.1.5: 500 | version "1.1.6" 501 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 502 | 503 | is-dotfile@^1.0.0: 504 | version "1.0.3" 505 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 506 | 507 | is-equal-shallow@^0.1.3: 508 | version "0.1.3" 509 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 510 | dependencies: 511 | is-primitive "^2.0.0" 512 | 513 | is-extendable@^0.1.1: 514 | version "0.1.1" 515 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 516 | 517 | is-extglob@^1.0.0: 518 | version "1.0.0" 519 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 520 | 521 | is-glob@^2.0.0, is-glob@^2.0.1: 522 | version "2.0.1" 523 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 524 | dependencies: 525 | is-extglob "^1.0.0" 526 | 527 | is-number@^2.1.0: 528 | version "2.1.0" 529 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 530 | dependencies: 531 | kind-of "^3.0.2" 532 | 533 | is-number@^3.0.0: 534 | version "3.0.0" 535 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 536 | dependencies: 537 | kind-of "^3.0.2" 538 | 539 | is-plain-object@^2.0.3: 540 | version "2.0.4" 541 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 542 | dependencies: 543 | isobject "^3.0.1" 544 | 545 | is-posix-bracket@^0.1.0: 546 | version "0.1.1" 547 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 548 | 549 | is-primitive@^2.0.0: 550 | version "2.0.0" 551 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 552 | 553 | is-relative@^0.2.1: 554 | version "0.2.1" 555 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" 556 | dependencies: 557 | is-unc-path "^0.1.1" 558 | 559 | is-unc-path@^0.1.1: 560 | version "0.1.2" 561 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" 562 | dependencies: 563 | unc-path-regex "^0.1.0" 564 | 565 | is-utf8@^0.2.0: 566 | version "0.2.1" 567 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 568 | 569 | is-windows@^0.2.0: 570 | version "0.2.0" 571 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" 572 | 573 | isarray@0.0.1: 574 | version "0.0.1" 575 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 576 | 577 | isarray@1.0.0, isarray@~1.0.0: 578 | version "1.0.0" 579 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 580 | 581 | isexe@^2.0.0: 582 | version "2.0.0" 583 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 584 | 585 | isobject@^2.0.0: 586 | version "2.1.0" 587 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 588 | dependencies: 589 | isarray "1.0.0" 590 | 591 | isobject@^3.0.0, isobject@^3.0.1: 592 | version "3.0.1" 593 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 594 | 595 | kind-of@^3.0.2: 596 | version "3.2.2" 597 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 598 | dependencies: 599 | is-buffer "^1.1.5" 600 | 601 | kind-of@^4.0.0: 602 | version "4.0.0" 603 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 604 | dependencies: 605 | is-buffer "^1.1.5" 606 | 607 | lazy-cache@^1.0.3: 608 | version "1.0.4" 609 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 610 | 611 | liftoff@^2.1.0: 612 | version "2.3.0" 613 | resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" 614 | dependencies: 615 | extend "^3.0.0" 616 | findup-sync "^0.4.2" 617 | fined "^1.0.1" 618 | flagged-respawn "^0.3.2" 619 | lodash.isplainobject "^4.0.4" 620 | lodash.isstring "^4.0.1" 621 | lodash.mapvalues "^4.4.0" 622 | rechoir "^0.6.2" 623 | resolve "^1.1.7" 624 | 625 | lodash._basecopy@^3.0.0: 626 | version "3.0.1" 627 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 628 | 629 | lodash._basetostring@^3.0.0: 630 | version "3.0.1" 631 | resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" 632 | 633 | lodash._basevalues@^3.0.0: 634 | version "3.0.0" 635 | resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" 636 | 637 | lodash._getnative@^3.0.0: 638 | version "3.9.1" 639 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 640 | 641 | lodash._isiterateecall@^3.0.0: 642 | version "3.0.9" 643 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 644 | 645 | lodash._reescape@^3.0.0: 646 | version "3.0.0" 647 | resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" 648 | 649 | lodash._reevaluate@^3.0.0: 650 | version "3.0.0" 651 | resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" 652 | 653 | lodash._reinterpolate@^3.0.0: 654 | version "3.0.0" 655 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 656 | 657 | lodash._root@^3.0.0: 658 | version "3.0.1" 659 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 660 | 661 | lodash.escape@^3.0.0: 662 | version "3.2.0" 663 | resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" 664 | dependencies: 665 | lodash._root "^3.0.0" 666 | 667 | lodash.isarguments@^3.0.0: 668 | version "3.1.0" 669 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 670 | 671 | lodash.isarray@^3.0.0: 672 | version "3.0.4" 673 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 674 | 675 | lodash.isplainobject@^4.0.4: 676 | version "4.0.6" 677 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 678 | 679 | lodash.isstring@^4.0.1: 680 | version "4.0.1" 681 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 682 | 683 | lodash.keys@^3.0.0: 684 | version "3.1.2" 685 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 686 | dependencies: 687 | lodash._getnative "^3.0.0" 688 | lodash.isarguments "^3.0.0" 689 | lodash.isarray "^3.0.0" 690 | 691 | lodash.mapvalues@^4.4.0: 692 | version "4.6.0" 693 | resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" 694 | 695 | lodash.restparam@^3.0.0: 696 | version "3.6.1" 697 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 698 | 699 | lodash.template@^3.0.0: 700 | version "3.6.2" 701 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" 702 | dependencies: 703 | lodash._basecopy "^3.0.0" 704 | lodash._basetostring "^3.0.0" 705 | lodash._basevalues "^3.0.0" 706 | lodash._isiterateecall "^3.0.0" 707 | lodash._reinterpolate "^3.0.0" 708 | lodash.escape "^3.0.0" 709 | lodash.keys "^3.0.0" 710 | lodash.restparam "^3.0.0" 711 | lodash.templatesettings "^3.0.0" 712 | 713 | lodash.templatesettings@^3.0.0: 714 | version "3.1.1" 715 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" 716 | dependencies: 717 | lodash._reinterpolate "^3.0.0" 718 | lodash.escape "^3.0.0" 719 | 720 | lodash@^4.13.1: 721 | version "4.17.4" 722 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 723 | 724 | lodash@~1.0.1: 725 | version "1.0.2" 726 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" 727 | 728 | longest@^1.0.1: 729 | version "1.0.1" 730 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 731 | 732 | lru-cache@2: 733 | version "2.7.3" 734 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 735 | 736 | make-error-cause@^1.1.1: 737 | version "1.2.2" 738 | resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" 739 | dependencies: 740 | make-error "^1.2.0" 741 | 742 | make-error@^1.2.0: 743 | version "1.3.0" 744 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" 745 | 746 | map-cache@^0.2.0: 747 | version "0.2.2" 748 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 749 | 750 | micromatch@^2.3.7: 751 | version "2.3.11" 752 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 753 | dependencies: 754 | arr-diff "^2.0.0" 755 | array-unique "^0.2.1" 756 | braces "^1.8.2" 757 | expand-brackets "^0.1.4" 758 | extglob "^0.3.1" 759 | filename-regex "^2.0.0" 760 | is-extglob "^1.0.0" 761 | is-glob "^2.0.1" 762 | kind-of "^3.0.2" 763 | normalize-path "^2.0.1" 764 | object.omit "^2.0.0" 765 | parse-glob "^3.0.4" 766 | regex-cache "^0.4.2" 767 | 768 | minimatch@^2.0.1: 769 | version "2.0.10" 770 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" 771 | dependencies: 772 | brace-expansion "^1.0.0" 773 | 774 | minimatch@~0.2.11: 775 | version "0.2.14" 776 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" 777 | dependencies: 778 | lru-cache "2" 779 | sigmund "~1.0.0" 780 | 781 | minimist@0.0.8: 782 | version "0.0.8" 783 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 784 | 785 | minimist@^1.1.0: 786 | version "1.2.0" 787 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 788 | 789 | mkdirp@^0.5.0: 790 | version "0.5.1" 791 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 792 | dependencies: 793 | minimist "0.0.8" 794 | 795 | multipipe@^0.1.2: 796 | version "0.1.2" 797 | resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" 798 | dependencies: 799 | duplexer2 "0.0.2" 800 | 801 | natives@^1.1.0: 802 | version "1.1.0" 803 | resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" 804 | 805 | normalize-path@^2.0.1: 806 | version "2.1.1" 807 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 808 | dependencies: 809 | remove-trailing-separator "^1.0.1" 810 | 811 | object-assign@^3.0.0: 812 | version "3.0.0" 813 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 814 | 815 | object.defaults@^1.1.0: 816 | version "1.1.0" 817 | resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" 818 | dependencies: 819 | array-each "^1.0.1" 820 | array-slice "^1.0.0" 821 | for-own "^1.0.0" 822 | isobject "^3.0.0" 823 | 824 | object.omit@^2.0.0: 825 | version "2.0.1" 826 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 827 | dependencies: 828 | for-own "^0.1.4" 829 | is-extendable "^0.1.1" 830 | 831 | object.pick@^1.2.0: 832 | version "1.3.0" 833 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 834 | dependencies: 835 | isobject "^3.0.1" 836 | 837 | once@^1.3.0: 838 | version "1.4.0" 839 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 840 | dependencies: 841 | wrappy "1" 842 | 843 | once@~1.3.0: 844 | version "1.3.3" 845 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 846 | dependencies: 847 | wrappy "1" 848 | 849 | orchestrator@^0.3.0: 850 | version "0.3.8" 851 | resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" 852 | dependencies: 853 | end-of-stream "~0.1.5" 854 | sequencify "~0.0.7" 855 | stream-consume "~0.1.0" 856 | 857 | ordered-read-streams@^0.1.0: 858 | version "0.1.0" 859 | resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" 860 | 861 | os-homedir@^1.0.0, os-homedir@^1.0.1: 862 | version "1.0.2" 863 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 864 | 865 | parse-filepath@^1.0.1: 866 | version "1.0.1" 867 | resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" 868 | dependencies: 869 | is-absolute "^0.2.3" 870 | map-cache "^0.2.0" 871 | path-root "^0.1.1" 872 | 873 | parse-glob@^3.0.4: 874 | version "3.0.4" 875 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 876 | dependencies: 877 | glob-base "^0.3.0" 878 | is-dotfile "^1.0.0" 879 | is-extglob "^1.0.0" 880 | is-glob "^2.0.0" 881 | 882 | parse-passwd@^1.0.0: 883 | version "1.0.0" 884 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 885 | 886 | path-parse@^1.0.5: 887 | version "1.0.5" 888 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 889 | 890 | path-root-regex@^0.1.0: 891 | version "0.1.2" 892 | resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" 893 | 894 | path-root@^0.1.1: 895 | version "0.1.1" 896 | resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" 897 | dependencies: 898 | path-root-regex "^0.1.0" 899 | 900 | preserve@^0.2.0: 901 | version "0.2.0" 902 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 903 | 904 | pretty-hrtime@^1.0.0: 905 | version "1.0.3" 906 | resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" 907 | 908 | process-nextick-args@~1.0.6: 909 | version "1.0.7" 910 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 911 | 912 | randomatic@^1.1.3: 913 | version "1.1.7" 914 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 915 | dependencies: 916 | is-number "^3.0.0" 917 | kind-of "^4.0.0" 918 | 919 | "readable-stream@>=1.0.33-1 <1.1.0-0": 920 | version "1.0.34" 921 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 922 | dependencies: 923 | core-util-is "~1.0.0" 924 | inherits "~2.0.1" 925 | isarray "0.0.1" 926 | string_decoder "~0.10.x" 927 | 928 | readable-stream@^2.1.5: 929 | version "2.3.3" 930 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 931 | dependencies: 932 | core-util-is "~1.0.0" 933 | inherits "~2.0.3" 934 | isarray "~1.0.0" 935 | process-nextick-args "~1.0.6" 936 | safe-buffer "~5.1.1" 937 | string_decoder "~1.0.3" 938 | util-deprecate "~1.0.1" 939 | 940 | readable-stream@~1.1.9: 941 | version "1.1.14" 942 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 943 | dependencies: 944 | core-util-is "~1.0.0" 945 | inherits "~2.0.1" 946 | isarray "0.0.1" 947 | string_decoder "~0.10.x" 948 | 949 | rechoir@^0.6.2: 950 | version "0.6.2" 951 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 952 | dependencies: 953 | resolve "^1.1.6" 954 | 955 | regex-cache@^0.4.2: 956 | version "0.4.4" 957 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 958 | dependencies: 959 | is-equal-shallow "^0.1.3" 960 | 961 | remove-trailing-separator@^1.0.1: 962 | version "1.1.0" 963 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 964 | 965 | repeat-element@^1.1.2: 966 | version "1.1.2" 967 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 968 | 969 | repeat-string@^1.5.2: 970 | version "1.6.1" 971 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 972 | 973 | replace-ext@0.0.1: 974 | version "0.0.1" 975 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 976 | 977 | resolve-dir@^0.1.0: 978 | version "0.1.1" 979 | resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" 980 | dependencies: 981 | expand-tilde "^1.2.2" 982 | global-modules "^0.2.3" 983 | 984 | resolve@^1.1.6, resolve@^1.1.7: 985 | version "1.5.0" 986 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 987 | dependencies: 988 | path-parse "^1.0.5" 989 | 990 | right-align@^0.1.1: 991 | version "0.1.3" 992 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 993 | dependencies: 994 | align-text "^0.1.1" 995 | 996 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 997 | version "5.1.1" 998 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 999 | 1000 | semver@^4.1.0: 1001 | version "4.3.6" 1002 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" 1003 | 1004 | sequencify@~0.0.7: 1005 | version "0.0.7" 1006 | resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" 1007 | 1008 | sigmund@~1.0.0: 1009 | version "1.0.1" 1010 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 1011 | 1012 | source-map@0.5.x, source-map@^0.5.1, source-map@~0.5.1: 1013 | version "0.5.7" 1014 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1015 | 1016 | sparkles@^1.0.0: 1017 | version "1.0.0" 1018 | resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" 1019 | 1020 | stream-consume@~0.1.0: 1021 | version "0.1.0" 1022 | resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" 1023 | 1024 | string_decoder@~0.10.x: 1025 | version "0.10.31" 1026 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1027 | 1028 | string_decoder@~1.0.3: 1029 | version "1.0.3" 1030 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1031 | dependencies: 1032 | safe-buffer "~5.1.0" 1033 | 1034 | strip-ansi@^3.0.0: 1035 | version "3.0.1" 1036 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1037 | dependencies: 1038 | ansi-regex "^2.0.0" 1039 | 1040 | strip-bom@^1.0.0: 1041 | version "1.0.0" 1042 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" 1043 | dependencies: 1044 | first-chunk-stream "^1.0.0" 1045 | is-utf8 "^0.2.0" 1046 | 1047 | supports-color@^2.0.0: 1048 | version "2.0.0" 1049 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1050 | 1051 | through2@2.0.3, through2@^2.0.0: 1052 | version "2.0.3" 1053 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1054 | dependencies: 1055 | readable-stream "^2.1.5" 1056 | xtend "~4.0.1" 1057 | 1058 | through2@^0.6.1: 1059 | version "0.6.5" 1060 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" 1061 | dependencies: 1062 | readable-stream ">=1.0.33-1 <1.1.0-0" 1063 | xtend ">=4.0.0 <4.1.0-0" 1064 | 1065 | tildify@^1.0.0: 1066 | version "1.2.0" 1067 | resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" 1068 | dependencies: 1069 | os-homedir "^1.0.0" 1070 | 1071 | time-stamp@^1.0.0: 1072 | version "1.1.0" 1073 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" 1074 | 1075 | uglify-js@~2.8.10: 1076 | version "2.8.29" 1077 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" 1078 | dependencies: 1079 | source-map "~0.5.1" 1080 | yargs "~3.10.0" 1081 | optionalDependencies: 1082 | uglify-to-browserify "~1.0.0" 1083 | 1084 | uglify-save-license@^0.4.1: 1085 | version "0.4.1" 1086 | resolved "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" 1087 | 1088 | uglify-to-browserify@~1.0.0: 1089 | version "1.0.2" 1090 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1091 | 1092 | unc-path-regex@^0.1.0: 1093 | version "0.1.2" 1094 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 1095 | 1096 | unique-stream@^1.0.0: 1097 | version "1.0.0" 1098 | resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" 1099 | 1100 | user-home@^1.1.1: 1101 | version "1.1.1" 1102 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1103 | 1104 | util-deprecate@~1.0.1: 1105 | version "1.0.2" 1106 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1107 | 1108 | v8flags@^2.0.2: 1109 | version "2.1.1" 1110 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 1111 | dependencies: 1112 | user-home "^1.1.1" 1113 | 1114 | vinyl-fs@^0.3.0: 1115 | version "0.3.14" 1116 | resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" 1117 | dependencies: 1118 | defaults "^1.0.0" 1119 | glob-stream "^3.1.5" 1120 | glob-watcher "^0.0.6" 1121 | graceful-fs "^3.0.0" 1122 | mkdirp "^0.5.0" 1123 | strip-bom "^1.0.0" 1124 | through2 "^0.6.1" 1125 | vinyl "^0.4.0" 1126 | 1127 | vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0: 1128 | version "0.2.1" 1129 | resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" 1130 | dependencies: 1131 | source-map "^0.5.1" 1132 | 1133 | vinyl@^0.4.0: 1134 | version "0.4.6" 1135 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" 1136 | dependencies: 1137 | clone "^0.2.0" 1138 | clone-stats "^0.0.1" 1139 | 1140 | vinyl@^0.5.0: 1141 | version "0.5.3" 1142 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" 1143 | dependencies: 1144 | clone "^1.0.0" 1145 | clone-stats "^0.0.1" 1146 | replace-ext "0.0.1" 1147 | 1148 | which@^1.2.12: 1149 | version "1.3.0" 1150 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 1151 | dependencies: 1152 | isexe "^2.0.0" 1153 | 1154 | window-size@0.1.0: 1155 | version "0.1.0" 1156 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1157 | 1158 | wordwrap@0.0.2: 1159 | version "0.0.2" 1160 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1161 | 1162 | wrappy@1: 1163 | version "1.0.2" 1164 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1165 | 1166 | "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: 1167 | version "4.0.1" 1168 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1169 | 1170 | yargs@~3.10.0: 1171 | version "3.10.0" 1172 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1173 | dependencies: 1174 | camelcase "^1.0.2" 1175 | cliui "^2.1.0" 1176 | decamelize "^1.0.0" 1177 | window-size "0.1.0" 1178 | --------------------------------------------------------------------------------