ember-burger-menu
Advanced tools
Comparing version
@@ -1,32 +0,51 @@ | ||
import EmberObject, { computed } from '@ember/object'; | ||
/* eslint-disable ember/no-computed-properties-in-native-classes */ | ||
import EmberObject, { action, computed } from '@ember/object'; | ||
import getAnimation from 'ember-burger-menu/animations'; | ||
import { tracked } from '@glimmer/tracking'; | ||
export default EmberObject.extend({ | ||
open: false, | ||
locked: false, | ||
width: 300, | ||
position: 'left', | ||
animation: 'slide', | ||
export default class State extends EmberObject { | ||
@tracked open = false; | ||
@tracked locked = false; | ||
@tracked width = 300; | ||
@tracked position = 'left'; | ||
@tracked animation = 'slide'; | ||
minSwipeDistance: 150, | ||
maxSwipeTime: 300, | ||
@tracked minSwipeDistance = 150; | ||
@tracked maxSwipeTime = 300; | ||
itemAnimation: null, | ||
customAnimation: null, | ||
@tracked itemAnimation = null; | ||
@tracked customAnimation = null; | ||
styles: computed('animation', 'itemAnimation', 'customAnimation', function() { | ||
let animation = this.get('animation'); | ||
let itemAnimation = this.get('itemAnimation'); | ||
let customAnimation = this.get('customAnimation'); | ||
@computed('animation', 'itemAnimation', 'customAnimation') | ||
get styles() { | ||
let animation = this.animation; | ||
let itemAnimation = this.itemAnimation; | ||
let customAnimation = this.customAnimation; | ||
return getAnimation(customAnimation || animation, itemAnimation).create(); | ||
}).readOnly(), | ||
} | ||
actions: computed(function() { | ||
return { | ||
open: () => !this.get('locked') && this.set('open', true), | ||
close: () => !this.get('locked') && this.set('open', false), | ||
toggle: () => !this.get('locked') && this.toggleProperty('open') | ||
}; | ||
}).readOnly() | ||
}); | ||
@action | ||
openMenu(e) { | ||
e?.stopPropagation?.(); | ||
if (!this.locked) { | ||
this.open = true; | ||
} | ||
} | ||
@action | ||
closeMenu(e) { | ||
e?.stopPropagation?.(); | ||
if (!this.locked) { | ||
this.open = false; | ||
} | ||
} | ||
@action | ||
toggleMenu(e) { | ||
e?.stopPropagation?.(); | ||
if (!this.locked) { | ||
this.open = !this.open; | ||
} | ||
} | ||
} |
import EmberObject from '@ember/object'; | ||
import { assign } from '@ember/polyfills'; | ||
import { assert } from '@ember/debug'; | ||
@@ -30,3 +29,6 @@ import cssStringify from 'ember-burger-menu/utils/css-stringify'; | ||
assert('Width must be a number.', typeof width === 'number'); | ||
assert('Position must be either \'left\' or \'right\'.', position === 'left' || position === 'right'); | ||
assert( | ||
"Position must be either 'left' or 'right'.", | ||
position === 'left' || position === 'right' | ||
); | ||
@@ -44,13 +46,13 @@ if (type === 'menuItem' && index === -1) { | ||
if (type === 'menu') { | ||
assign(result, { width: `${width}px` }); | ||
Object.assign(result, { width: `${width}px` }); | ||
} | ||
return cssStringify(result); | ||
} | ||
}, | ||
}); | ||
Animation.reopenClass({ | ||
__isAnimation__: true | ||
__isAnimation__: true, | ||
}); | ||
export default Animation; |
@@ -8,5 +8,9 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-${width}px, 0, 0)` : `translate3d(${width}px, 0, 0)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-${width}px, 0, 0)` | ||
: `translate3d(${width}px, 0, 0)` | ||
: '', | ||
}; | ||
} | ||
}, | ||
}); |
import { assert } from '@ember/debug'; | ||
import { isEmpty, typeOf } from '@ember/utils'; | ||
import requireModule from 'ember-require-module'; | ||
import { camelize } from '@ember/string'; | ||
import * as animations from './animations'; | ||
import * as itemAnimations from './item-animations'; | ||
const ANIMATION_PATH = 'ember-burger-menu/animations'; | ||
const ANIMATION_ITEM_PATH = `${ANIMATION_PATH}/menu-item`; | ||
export default function getAnimation(animation, itemAnimation) { | ||
@@ -14,3 +13,3 @@ let AnimationClass; | ||
} else { | ||
AnimationClass = requireModule(`${ANIMATION_PATH}/${animation}`); | ||
AnimationClass = animations[camelize(animation)]; | ||
assert(`The animation '${animation}' could not be found.`, AnimationClass); | ||
@@ -20,5 +19,8 @@ } | ||
if (!isEmpty(itemAnimation)) { | ||
let MenuItemMixin = requireModule(`${ANIMATION_ITEM_PATH}/${itemAnimation}`); | ||
let MenuItemMixin = itemAnimations[camelize(itemAnimation)]; | ||
assert(`The item animation '${itemAnimation}' could not be found.`, MenuItemMixin); | ||
assert( | ||
`The item animation '${itemAnimation}' could not be found.`, | ||
MenuItemMixin | ||
); | ||
@@ -25,0 +27,0 @@ return AnimationClass.extend(MenuItemMixin); |
@@ -8,5 +8,9 @@ import Mixin from '@ember/object/mixin'; | ||
return { | ||
transform: open ? '' : right ? `translate3d(${(index + 1) * 500}px, 0, 0)` : `translate3d(-${(index + 1) * 500}px, 0, 0)` | ||
transform: open | ||
? '' | ||
: right | ||
? `translate3d(${(index + 1) * 500}px, 0, 0)` | ||
: `translate3d(-${(index + 1) * 500}px, 0, 0)`, | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,5 +8,5 @@ import Mixin from '@ember/object/mixin'; | ||
return { | ||
transform: open ? '' : `translate3d(0, ${(index + 1) * 500}px, 0)` | ||
transform: open ? '' : `translate3d(0, ${(index + 1) * 500}px, 0)`, | ||
}; | ||
} | ||
}, | ||
}); |
import Animation from 'ember-burger-menu/animations/base'; | ||
export default Animation.extend({ | ||
animation: 'open-door' | ||
animation: 'open-door', | ||
}); |
@@ -8,5 +8,11 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-${width * 0.85}px, 0, ${width * 1.3}px) rotateY(15deg)` : `translate3d(${width}px, 0, 0) rotateY(-15deg)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-${width * 0.85}px, 0, ${ | ||
width * 1.3 | ||
}px) rotateY(15deg)` | ||
: `translate3d(${width}px, 0, 0) rotateY(-15deg)` | ||
: '', | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,5 +8,9 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-${width}px, 0, 0)` : `translate3d(${width}px, 0, 0)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-${width}px, 0, 0)` | ||
: `translate3d(${width}px, 0, 0)` | ||
: '', | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,5 +8,9 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-${width}px, 0, 0)` : `translate3d(${width}px, 0, 0)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-${width}px, 0, 0)` | ||
: `translate3d(${width}px, 0, 0)` | ||
: '', | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,5 +8,9 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-${width}px, 0, 0)` : `translate3d(${width}px, 0, 0)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-${width}px, 0, 0)` | ||
: `translate3d(${width}px, 0, 0)` | ||
: '', | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,5 +8,5 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? `translate3d(0, 0, -${width}px)` : '' | ||
transform: open ? `translate3d(0, 0, -${width}px)` : '', | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,5 +8,9 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-100px, 0, -${width * 2}px) rotateY(20deg)` : `translate3d(100px, 0, -${width * 2}px) rotateY(-20deg)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-100px, 0, -${width * 2}px) rotateY(20deg)` | ||
: `translate3d(100px, 0, -${width * 2}px) rotateY(-20deg)` | ||
: '', | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,3 +8,7 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-${width}px, 0, 0)` : `translate3d(${width}px, 0, 0)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-${width}px, 0, 0)` | ||
: `translate3d(${width}px, 0, 0)` | ||
: '', | ||
}; | ||
@@ -15,5 +19,5 @@ }, | ||
return { | ||
transform: open ? '' : `translate3d(0, 0, -${width}px)` | ||
transform: open ? '' : `translate3d(0, 0, -${width}px)`, | ||
}; | ||
} | ||
}, | ||
}); |
@@ -8,5 +8,9 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
transform: open ? right ? `translate3d(-${width}px, 0, 0)` : `translate3d(${width}px, 0, 0)` : '' | ||
transform: open | ||
? right | ||
? `translate3d(-${width}px, 0, 0)` | ||
: `translate3d(${width}px, 0, 0)` | ||
: '', | ||
}; | ||
} | ||
}, | ||
}); |
import Animation from 'ember-burger-menu/animations/base'; | ||
export default Animation.extend({ | ||
animation: 'slide' | ||
animation: 'slide', | ||
}); |
@@ -8,6 +8,6 @@ import Animation from 'ember-burger-menu/animations/base'; | ||
return { | ||
marginLeft: (open && !right) ? `${width}px` : 0, | ||
marginRight: (open && right) ? `${width}px` : 0 | ||
marginLeft: open && !right ? `${width}px` : 0, | ||
marginRight: open && right ? `${width}px` : 0, | ||
}; | ||
} | ||
}, | ||
}); |
import Component from '@ember/component'; | ||
import { run } from '@ember/runloop'; | ||
import { scheduleOnce } from '@ember/runloop'; | ||
import { computed } from '@ember/object'; | ||
@@ -7,3 +7,2 @@ import layout from '../templates/components/bm-menu-item'; | ||
import isFastboot from 'ember-burger-menu/utils/is-fastboot'; | ||
import closest from 'ember-burger-menu/utils/closest'; | ||
@@ -21,3 +20,3 @@ export default Component.extend({ | ||
index: computed('menuItems.[]', function() { | ||
index: computed('element', 'menuItems.[]', function () { | ||
if (isFastboot()) { | ||
@@ -31,3 +30,3 @@ return -1; | ||
if (item) { | ||
const menu = closest(item, '.bm-menu', true); | ||
const menu = item.closest('.bm-menu'); | ||
if (menu) { | ||
@@ -45,8 +44,3 @@ position = [].slice | ||
this._super(...arguments); | ||
run.scheduleOnce( | ||
'afterRender', | ||
this.get('menuItems'), | ||
'addObject', | ||
this.get('elementId') | ||
); | ||
scheduleOnce('afterRender', this.menuItems, 'addObject', this.elementId); | ||
}, | ||
@@ -56,8 +50,3 @@ | ||
this._super(...arguments); | ||
run.scheduleOnce( | ||
'afterRender', | ||
this.get('menuItems'), | ||
'removeObject', | ||
this.get('elementId') | ||
); | ||
scheduleOnce('afterRender', this.menuItems, 'removeObject', this.elementId); | ||
}, | ||
@@ -68,6 +57,6 @@ | ||
if (this.get('dismissOnClick')) { | ||
this.get('state.actions').close(); | ||
if (this.dismissOnClick) { | ||
this.get('state').closeMenu(); | ||
} | ||
} | ||
}, | ||
}); |
import Component from '@ember/component'; | ||
import { observer, computed } from '@ember/object'; | ||
import { computed } from '@ember/object'; | ||
import { A as emberArray } from '@ember/array'; | ||
@@ -7,7 +7,3 @@ import layout from '../templates/components/bm-menu'; | ||
export const OUTLET_MENU_ANIMATIONS = [ | ||
'push', | ||
'rotate-out', | ||
'squeeze' | ||
]; | ||
export const OUTLET_MENU_ANIMATIONS = ['push', 'rotate-out', 'squeeze']; | ||
@@ -28,13 +24,17 @@ export default Component.extend({ | ||
renderInPlace: computed('state.animation', function() { | ||
renderInPlace: computed('state.animation', function () { | ||
return OUTLET_MENU_ANIMATIONS.indexOf(this.get('state.animation')) === -1; | ||
}).readOnly(), | ||
menuItems: computed(function() { | ||
menuItems: computed(function () { | ||
return emberArray([]); | ||
}).readOnly(), | ||
onOpenChange: observer('state.open', function() { | ||
this[this.get('state.open') ? 'onOpen' : 'onClose'](); | ||
}) | ||
init() { | ||
this._super(...arguments); | ||
this.onOpenChange = () => { | ||
this[this.get('state.open') ? 'onOpen' : 'onClose'](); | ||
}; | ||
}, | ||
}); |
@@ -10,3 +10,3 @@ import Component from '@ember/component'; | ||
state: null, | ||
style: computedStyleFor('outlet').readOnly() | ||
style: computedStyleFor('outlet').readOnly(), | ||
}); |
import Component from '@ember/component'; | ||
import { on } from '@ember/object/evented'; | ||
import { run } from '@ember/runloop'; | ||
import { computed, observer } from '@ember/object'; | ||
import { computed } from '@ember/object'; | ||
import { alias } from '@ember/object/computed'; | ||
@@ -10,8 +8,5 @@ import layout from '../templates/components/burger-menu'; | ||
import State from 'ember-burger-menu/-private/state'; | ||
import DomMixin from 'ember-lifeline/mixins/dom'; | ||
import isFastboot from 'ember-burger-menu/utils/is-fastboot'; | ||
import closest from 'ember-burger-menu/utils/closest'; | ||
import { normalizeEvent } from 'ember-jquery-legacy'; | ||
export default Component.extend(DomMixin, SwipeSupportMixin, { | ||
export default Component.extend(SwipeSupportMixin, { | ||
layout, | ||
@@ -24,3 +19,3 @@ classNames: ['ember-burger-menu'], | ||
'itemAnimationClass', | ||
'position' | ||
'position', | ||
], | ||
@@ -34,3 +29,5 @@ attributeBindings: ['style'], | ||
state: computed(() => State.create()).readOnly(), | ||
state: computed(function () { | ||
return State.create(); | ||
}).readOnly(), | ||
@@ -47,3 +44,3 @@ open: alias('state.open'), | ||
animationClass: computed('state.styles.animation', function() { | ||
animationClass: computed('state.styles.animation', function () { | ||
let animation = this.get('state.styles.animation'); | ||
@@ -53,3 +50,3 @@ return animation ? `bm--${animation}` : ''; | ||
itemAnimationClass: computed('state.styles.itemAnimation', function() { | ||
itemAnimationClass: computed('state.styles.itemAnimation', function () { | ||
let itemAnimation = this.get('state.styles.itemAnimation'); | ||
@@ -59,66 +56,57 @@ return itemAnimation ? `bm-item--${itemAnimation}` : ''; | ||
willDestroyElement() { | ||
init() { | ||
this._super(...arguments); | ||
run.cancel(this._setupEventsTimer); | ||
}, | ||
setupEvents: on( | ||
'didReceiveAttrs', | ||
observer('open', 'locked', function() { | ||
if (isFastboot()) { | ||
return; | ||
this.onClick = (e) => { | ||
if (this.dismissOnClick) { | ||
let elementId = this.elementId; | ||
// Close the menu if clicked outside of it | ||
if (!e.target.closest(`#${elementId} .bm-menu`)) { | ||
this.get('state').closeMenu(); | ||
} | ||
} | ||
}; | ||
run.later(() => { | ||
let methodName = | ||
this.get('open') && !this.get('locked') | ||
? '_setupEvents' | ||
: '_teardownEvents'; | ||
this._setupEventsTimer = run.scheduleOnce( | ||
'afterRender', | ||
this, | ||
methodName | ||
); | ||
}, 0); | ||
}) | ||
), | ||
this.onKeyup = (e) => { | ||
if (this.dismissOnEsc) { | ||
if (e.keyCode === 27) { | ||
this.get('state').closeMenu(); | ||
} | ||
} | ||
}; | ||
this._setupEvents(); | ||
}, | ||
willDestroyElement() { | ||
this._teardownEvents(); | ||
this._super(...arguments); | ||
}, | ||
_setupEvents() { | ||
if (this.get('dismissOnClick')) { | ||
this.addEventListener(document.body, `click`, this.onClick); | ||
this.addEventListener(document.body, `touchstart`, this.onClick); | ||
if (isFastboot()) { | ||
return; | ||
} | ||
if (this.get('dismissOnEsc')) { | ||
this.addEventListener(window, `keyup`, this.onKeyup); | ||
} | ||
document.body.addEventListener('click', this.onClick); | ||
document.body.addEventListener('touchstart', this.onClick); | ||
window.addEventListener('keyup', this.onKeyup); | ||
}, | ||
_teardownEvents() { | ||
this.removeEventListener(document.body, `click`, this.onClick); | ||
this.removeEventListener(document.body, `touchstart`, this.onClick); | ||
this.removeEventListener(window, `keyup`, this.onKeyup); | ||
}, | ||
onClick(e) { | ||
let nativeEvent = normalizeEvent(e); | ||
let elementId = this.get('elementId'); | ||
// Close the menu if clicked outside of it | ||
if (!closest(nativeEvent.target, `#${elementId} .bm-menu`, true)) { | ||
this.get('state.actions').close(); | ||
if (isFastboot()) { | ||
return; | ||
} | ||
}, | ||
onKeyup(e) { | ||
let nativeEvent = normalizeEvent(e); | ||
if (nativeEvent.keyCode === 27) { | ||
this.get('state.actions').close(); | ||
} | ||
document.body.removeEventListener('click', this.onClick); | ||
document.body.removeEventListener('touchstart', this.onClick); | ||
window.removeEventListener(this, window, 'keyup', this.onKeyup); | ||
}, | ||
onSwipe(direction, target) { | ||
let position = this.get('position'); | ||
let open = this.get('open'); | ||
let gesturesEnabled = this.get('gesturesEnabled'); | ||
let isMenuSwipe = closest(target, '.bm-menu', true); | ||
let position = this.position; | ||
let open = this.open; | ||
let gesturesEnabled = this.gesturesEnabled; | ||
let isMenuSwipe = target.closest('.bm-menu'); | ||
@@ -130,7 +118,7 @@ if (!gesturesEnabled) { | ||
if (open && isMenuSwipe && position === direction) { | ||
this.get('state.actions').close(); | ||
this.get('state').closeMenu(); | ||
} else if (!open && position !== direction) { | ||
this.get('state.actions').open(); | ||
this.get('state').openMenu(); | ||
} | ||
} | ||
}, | ||
}); |
import { computed } from '@ember/object'; | ||
export default function computedStyleFor(type) { | ||
return computed('state.{styles,open,width,position}', 'index', function() { | ||
let state = this.get('state'); | ||
return computed('state.{styles,open,width,position}', 'index', function () { | ||
let state = this.state; | ||
let args = state.getProperties(['open', 'width', 'position']); | ||
if (type === 'menuItem') { | ||
args.index = this.get('index'); | ||
args.index = this.index; | ||
} | ||
return state.get('styles').generateCSSFor(type, args); | ||
return state.get('styles').generateCSSFor(type, args); | ||
}); | ||
} |
import Mixin from '@ember/object/mixin'; | ||
import { isNone } from '@ember/utils'; | ||
import { alias } from '@ember/object/computed'; | ||
import { normalizeEvent } from 'ember-jquery-legacy'; | ||
@@ -15,7 +14,6 @@ let meta; | ||
touchStart(e) { | ||
let nativeEvent = normalizeEvent(e); | ||
this._super(...arguments); | ||
// jscs:disable | ||
let touch = nativeEvent.touches[0]; | ||
let touch = e.touches[0]; | ||
// jscs:enable | ||
@@ -28,4 +26,4 @@ | ||
y: touch.pageY, | ||
time: new Date().getTime() | ||
} | ||
time: new Date().getTime(), | ||
}, | ||
}; | ||
@@ -35,7 +33,6 @@ }, | ||
touchMove(e) { | ||
let nativeEvent = normalizeEvent(e); | ||
this._super(...arguments); | ||
// jscs:disable | ||
let touch = nativeEvent.touches[0]; | ||
let touch = e.touches[0]; | ||
// jscs:enable | ||
@@ -45,3 +42,3 @@ | ||
x: touch.pageX - meta.start.x, | ||
y: touch.pageY - meta.start.y | ||
y: touch.pageY - meta.start.y, | ||
}; | ||
@@ -56,3 +53,3 @@ | ||
// A valid swipe event uses only one finger | ||
if (nativeEvent.touches.length > 1) { | ||
if (e.touches.length > 1) { | ||
meta.isInvalid = true; | ||
@@ -65,4 +62,4 @@ } | ||
let minSwipeDistance = this.get('minSwipeDistance'); | ||
let maxSwipeTime = this.get('maxSwipeTime'); | ||
let minSwipeDistance = this.minSwipeDistance; | ||
let maxSwipeTime = this.maxSwipeTime; | ||
let elapsedTime = new Date().getTime() - meta.start.time; | ||
@@ -78,3 +75,3 @@ | ||
} | ||
} | ||
}, | ||
}); |
@@ -15,15 +15,19 @@ import { isEmpty } from '@ember/utils'; | ||
'perspective', | ||
'perspective-origin' | ||
'perspective-origin', | ||
]; | ||
export default function cssStringify(hash = {}) { | ||
return htmlSafe(Object.keys(hash).reduce((css, key) => { | ||
let value = hash[key]; | ||
return htmlSafe( | ||
Object.keys(hash) | ||
.reduce((css, key) => { | ||
let value = hash[key]; | ||
if (!isEmpty(value)) { | ||
css = css.concat(buildProp(key, value)); | ||
} | ||
if (!isEmpty(value)) { | ||
css = css.concat(buildProp(key, value)); | ||
} | ||
return css; | ||
}, []).join('; ')); | ||
return css; | ||
}, []) | ||
.join('; ') | ||
); | ||
} | ||
@@ -30,0 +34,0 @@ |
@@ -1,5 +0,3 @@ | ||
/* global self */ | ||
export default function isFastboot() { | ||
return !self.document; | ||
} |
@@ -1,1 +0,1 @@ | ||
export { default } from 'ember-burger-menu/components/bm-menu-item'; | ||
export { default } from 'ember-burger-menu/components/bm-menu-item'; |
@@ -1,1 +0,1 @@ | ||
export { default } from 'ember-burger-menu/components/bm-menu'; | ||
export { default } from 'ember-burger-menu/components/bm-menu'; |
@@ -1,1 +0,1 @@ | ||
export { default } from 'ember-burger-menu/components/bm-outlet'; | ||
export { default } from 'ember-burger-menu/components/bm-outlet'; |
/*jshint node:true*/ | ||
module.exports = { | ||
normalizeEntityName: function() {}, | ||
normalizeEntityName: function () {}, | ||
afterInstall: function() { | ||
afterInstall: function () { | ||
return this.addPackagesToProject([ | ||
{ name: 'ember-cli-sass', target: 'latest' } | ||
{ name: 'ember-cli-sass', target: 'latest' }, | ||
]); | ||
} | ||
}, | ||
}; |
# Changelog | ||
## v4.0.0 (2022-06-03) | ||
#### :boom: Breaking Change | ||
* [#152](https://github.com/adopted-ember-addons/ember-burger-menu/pull/152) ember-auto-import 2, node >= 12, update all the things ([@rwwagner90](https://github.com/rwwagner90)) | ||
* [#124](https://github.com/adopted-ember-addons/ember-burger-menu/pull/124) Update ember and various things ([@ttill](https://github.com/ttill)) | ||
#### Committers: 2 | ||
- Robert Wagner ([@rwwagner90](https://github.com/rwwagner90)) | ||
- Till Theato ([@ttill](https://github.com/ttill)) | ||
## v3.3.3 | ||
@@ -7,3 +18,3 @@ | ||
- [#118](https://github.com/offirgolan/ember-burger-menu/pull/118) resolve a later version of `matches-selector` _by [@noslouch](https://github.com/noslouch)_ | ||
- [#118](https://github.com/adopted-ember-addons/ember-burger-menu/pull/118) resolve a later version of `matches-selector` _by [@noslouch](https://github.com/noslouch)_ | ||
@@ -14,3 +25,3 @@ ## v3.3.2 | ||
- [#116](https://github.com/offirgolan/ember-burger-menu/pull/116) fix(element-closest): IE11 fix to use implementation via npm package `element-closest` _by [@alexdiliberto](https://github.com/alexdiliberto)_ | ||
- [#116](https://github.com/adopted-ember-addons/ember-burger-menu/pull/116) fix(element-closest): IE11 fix to use implementation via npm package `element-closest` _by [@alexdiliberto](https://github.com/alexdiliberto)_ | ||
@@ -21,5 +32,5 @@ ## v3.3.1 | ||
- [#111](https://github.com/offirgolan/ember-burger-menu/pull/111) Completely remove usage of jQuery _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
- [#112](https://github.com/offirgolan/ember-burger-menu/pull/112) Remove unused ember-data dependency _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
- [#113](https://github.com/offirgolan/ember-burger-menu/pull/113) Only include used bootstrap styles _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
- [#111](https://github.com/adopted-ember-addons/ember-burger-menu/pull/111) Completely remove usage of jQuery _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
- [#112](https://github.com/adopted-ember-addons/ember-burger-menu/pull/112) Remove unused ember-data dependency _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
- [#113](https://github.com/adopted-ember-addons/ember-burger-menu/pull/113) Only include used bootstrap styles _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
@@ -30,3 +41,3 @@ ## v3.3.0 | ||
- [#110](https://github.com/offirgolan/ember-burger-menu/pull/110) Upgrade to latest Ember CLI and update dependencies _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
- [#110](https://github.com/adopted-ember-addons/ember-burger-menu/pull/110) Upgrade to latest Ember CLI and update dependencies _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
@@ -37,3 +48,3 @@ ## v3.2.0 | ||
- [#109](https://github.com/offirgolan/ember-burger-menu/pull/109) Remove usage of jquery in components _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
- [#109](https://github.com/adopted-ember-addons/ember-burger-menu/pull/109) Remove usage of jquery in components _by [@josemarluedke](https://github.com/josemarluedke)_ | ||
@@ -44,4 +55,4 @@ ## v3.1.0 | ||
- [#100](https://github.com/offirgolan/ember-burger-menu/pull/100) Upgrade to Ember 2.18 _by [@mixonic](https://github.com/mixonic)_ | ||
- [#104](https://github.com/offirgolan/ember-burger-menu/pull/104) Update all the things | ||
- [#100](https://github.com/adopted-ember-addons/ember-burger-menu/pull/100) Upgrade to Ember 2.18 _by [@mixonic](https://github.com/mixonic)_ | ||
- [#104](https://github.com/adopted-ember-addons/ember-burger-menu/pull/104) Update all the things | ||
@@ -52,3 +63,3 @@ ## v3.0.2 | ||
- [#102](https://github.com/offirgolan/ember-burger-menu/pull/102) Update ember-cli-dependency-checker | ||
- [#102](https://github.com/adopted-ember-addons/ember-burger-menu/pull/102) Update ember-cli-dependency-checker | ||
@@ -59,3 +70,3 @@ ## v3.0.1 | ||
- [#98](https://github.com/offirgolan/ember-burger-menu/pull/98) Fix for lifeline selector issue _by [@donaldwasserman](https://github.com/donaldwasserman)_ | ||
- [#98](https://github.com/adopted-ember-addons/ember-burger-menu/pull/98) Fix for lifeline selector issue _by [@donaldwasserman](https://github.com/donaldwasserman)_ | ||
@@ -66,3 +77,3 @@ ## v3.0.0 | ||
- [#88](https://github.com/offirgolan/ember-burger-menu/pull/88) Better Sass _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#88](https://github.com/adopted-ember-addons/ember-burger-menu/pull/88) Better Sass _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -77,3 +88,3 @@ ### Release Notes | ||
- **[BREAKING]** Menu item class has now been moved to the top level `ember-burger-menu` element. It can now be accessed via `.ember-burger-menu.bm-item--stack` | ||
- **[BREAKING]** Please see [Custom Animations](https://github.com/offirgolan/ember-burger-menu#custom-animations) for the new sass structure for custom animations | ||
- **[BREAKING]** Please see [Custom Animations](https://github.com/adopted-ember-addons/ember-burger-menu#custom-animations) for the new sass structure for custom animations | ||
@@ -84,3 +95,3 @@ ## v2.0.1 | ||
- [#80](https://github.com/offirgolan/ember-burger-menu/pull/80) Fastboot _by [@mayko780](https://github.com/mayko780)_ | ||
- [#80](https://github.com/adopted-ember-addons/ember-burger-menu/pull/80) Fastboot _by [@mayko780](https://github.com/mayko780)_ | ||
@@ -91,3 +102,3 @@ ## v2.0.0 | ||
- [#79](https://github.com/offirgolan/ember-burger-menu/pull/79) [FEATURE] Multiple Menu Support _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#79](https://github.com/adopted-ember-addons/ember-burger-menu/pull/79) [FEATURE] Multiple Menu Support _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -106,3 +117,3 @@ ### Release Notes | ||
- [#69](https://github.com/offirgolan/ember-burger-menu/pull/69) [BUGFIX] Remove preventDefault from passive event listener touchMove _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#69](https://github.com/adopted-ember-addons/ember-burger-menu/pull/69) [BUGFIX] Remove preventDefault from passive event listener touchMove _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -113,3 +124,3 @@ ## v1.1.2 | ||
- [#62](https://github.com/offirgolan/ember-burger-menu/pull/62) [FEATURE] Slide Shrink Animation _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#62](https://github.com/adopted-ember-addons/ember-burger-menu/pull/62) [FEATURE] Slide Shrink Animation _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -120,3 +131,3 @@ ## v1.1.1 | ||
- [#42](https://github.com/offirgolan/ember-burger-menu/pull/42) Update ember-cli-sass to the latest version 🚀 _by [@offirgolan/greenkeeper](https://github.com/offirgolan/greenkeeper)_ | ||
- [#42](https://github.com/adopted-ember-addons/ember-burger-menu/pull/42) Update ember-cli-sass to the latest version 🚀 _by [@offirgolan/greenkeeper](https://github.com/offirgolan/greenkeeper)_ | ||
@@ -127,3 +138,3 @@ ## v1.1.0 | ||
- [#29](https://github.com/offirgolan/ember-burger-menu/pull/29) [FEATURE] Locked + gesturesEnabled + use ember-lifeline _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#29](https://github.com/adopted-ember-addons/ember-burger-menu/pull/29) [FEATURE] Locked + gesturesEnabled + use ember-lifeline _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -134,3 +145,3 @@ ## v1.0.2 | ||
- [#21](https://github.com/offirgolan/ember-burger-menu/pull/21) Make height 100vh _by [@rwwagner90](https://github.com/rwwagner90)_ | ||
- [#21](https://github.com/adopted-ember-addons/ember-burger-menu/pull/21) Make height 100vh _by [@rwwagner90](https://github.com/rwwagner90)_ | ||
@@ -141,3 +152,3 @@ ## v1.0.1 | ||
- [#13](https://github.com/offirgolan/ember-burger-menu/pull/13) [BUGFIX] Use originalEvent to access touches _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#13](https://github.com/adopted-ember-addons/ember-burger-menu/pull/13) [BUGFIX] Use originalEvent to access touches _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -148,4 +159,4 @@ ## v1.0.0 | ||
- [#10](https://github.com/offirgolan/ember-burger-menu/pull/10) [FEATURE] Dismiss menu on item click _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#11](https://github.com/offirgolan/ember-burger-menu/pull/11) [FEATURE] Use a service to hold the menu state _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#10](https://github.com/adopted-ember-addons/ember-burger-menu/pull/10) [FEATURE] Dismiss menu on item click _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#11](https://github.com/adopted-ember-addons/ember-burger-menu/pull/11) [FEATURE] Use a service to hold the menu state _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -156,3 +167,3 @@ ## v0.2.1 | ||
- [#6](https://github.com/offirgolan/ember-burger-menu/pull/6) [FEATURE] Add open and close state actions _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#6](https://github.com/adopted-ember-addons/ember-burger-menu/pull/6) [FEATURE] Add open and close state actions _by [@offirgolan](https://github.com/offirgolan)_ | ||
- Add ability to use a customAnimation with a specified itemAnimation | ||
@@ -165,3 +176,3 @@ - Some general code cleanup | ||
- [#4](https://github.com/offirgolan/ember-burger-menu/pull/4) [FEATURE] Swipe Support _by [@offirgolan](https://github.com/offirgolan)_ | ||
- [#4](https://github.com/adopted-ember-addons/ember-burger-menu/pull/4) [FEATURE] Swipe Support _by [@offirgolan](https://github.com/offirgolan)_ | ||
@@ -168,0 +179,0 @@ ## v0.1.0 |
'use strict'; | ||
module.exports = function(/* environment, appConfig */) { | ||
return { }; | ||
module.exports = function (/* environment, appConfig */) { | ||
return {}; | ||
}; |
'use strict'; | ||
module.exports = { | ||
name: 'ember-burger-menu', | ||
included: function(/* app */) { | ||
this._super.included.apply(this, arguments); | ||
} | ||
name: require('./package').name, | ||
}; |
The MIT License (MIT) | ||
Copyright (c) 2018 | ||
Copyright (c) 2019 | ||
@@ -5,0 +5,0 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: |
157
package.json
{ | ||
"name": "ember-burger-menu", | ||
"version": "3.3.4", | ||
"version": "4.0.0", | ||
"description": "An off-canvas sidebar component with a collection of animations and styles using CSS transitions", | ||
"scripts": { | ||
"build": "ember build", | ||
"lint:js": "eslint .", | ||
"start": "ember serve", | ||
"test": "ember test", | ||
"test:all": "ember try:each" | ||
}, | ||
"engines": { | ||
"node": "6.* || 8.* || >= 10.*" | ||
}, | ||
"devDependencies": { | ||
"bootstrap": "^4.0.0", | ||
"broccoli-asset-rev": "^2.7.0", | ||
"ember-ajax": "^3.1.0", | ||
"ember-bootstrap": "^2.0.0", | ||
"ember-cli": "~3.3.0", | ||
"ember-cli-app-version": "^3.2.0", | ||
"ember-cli-autoprefixer": "0.8.1", | ||
"ember-cli-changelog": "^0.3.4", | ||
"ember-cli-dependency-checker": "^3.0.0", | ||
"ember-cli-github-pages": "0.2.0", | ||
"ember-cli-htmlbars-inline-precompile": "^1.0.3", | ||
"ember-cli-inject-live-reload": "^1.8.1", | ||
"ember-cli-qunit": "^4.3.2", | ||
"ember-cli-release": "1.0.0-beta.2", | ||
"ember-cli-sass": "^8.0.1", | ||
"ember-cli-shims": "^1.2.0", | ||
"ember-cli-sri": "^2.1.0", | ||
"ember-cli-string-helpers": "^1.9.0", | ||
"ember-cli-test-loader": "^2.2.0", | ||
"ember-cli-uglify": "^2.1.0", | ||
"ember-cli-yuidoc": "0.8.8", | ||
"ember-composable-helpers": "2.1.0", | ||
"ember-disable-prototype-extensions": "^1.1.2", | ||
"ember-export-application-global": "^2.0.0", | ||
"ember-font-awesome": "^4.0.0-rc.4", | ||
"ember-load-initializers": "^1.1.0", | ||
"ember-maybe-import-regenerator": "^0.1.6", | ||
"ember-resolver": "^5.0.1", | ||
"ember-source": "~3.3.0", | ||
"ember-source-channel-url": "^1.0.1", | ||
"ember-truth-helpers": "2.0.0", | ||
"ember-try": "^0.2.23", | ||
"eslint": "^5.2.0", | ||
"eslint-plugin-ember": "^5.2.0", | ||
"eslint-plugin-node": "^7.0.1", | ||
"loader.js": "^4.7.0", | ||
"qunit-dom": "^0.7.1", | ||
"sass": "^1.14.3" | ||
}, | ||
"keywords": [ | ||
@@ -62,3 +12,3 @@ "ember-addon", | ||
"type": "git", | ||
"url": "git@github.com:offirgolan/ember-burger-menu.git" | ||
"url": "git@github.com:adopted-ember-addons/ember-burger-menu.git" | ||
}, | ||
@@ -71,16 +21,101 @@ "license": "MIT", | ||
}, | ||
"scripts": { | ||
"build": "ember build --environment=production", | ||
"lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", | ||
"lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", | ||
"lint:hbs": "ember-template-lint .", | ||
"lint:hbs:fix": "ember-template-lint . --fix", | ||
"lint:js": "eslint . --cache", | ||
"lint:js:fix": "eslint . --fix", | ||
"start": "ember serve", | ||
"test": "npm-run-all lint test:*", | ||
"test:ember": "ember test", | ||
"test:ember-compatibility": "ember try:each" | ||
}, | ||
"dependencies": { | ||
"ember-auto-import": "^1.2.13", | ||
"ember-cli-babel": "^6.16.0", | ||
"ember-cli-htmlbars": "^2.0.4", | ||
"ember-jquery-legacy": "^1.0.0", | ||
"ember-lifeline": "^3.0.5", | ||
"ember-require-module": "^0.3.0", | ||
"ember-wormhole": "0.5.3", | ||
"matches-selector": "^1.2.0" | ||
"@ember/render-modifiers": "^2.0.4", | ||
"@glimmer/component": "^1.1.2", | ||
"@glimmer/tracking": "^1.1.2", | ||
"ember-auto-import": "^2.4.2", | ||
"ember-cli-babel": "^7.26.11", | ||
"ember-cli-htmlbars": "^6.0.1", | ||
"ember-wormhole": "^0.6.0" | ||
}, | ||
"devDependencies": { | ||
"@ember/optional-features": "^2.0.0", | ||
"@ember/test-helpers": "^2.7.0", | ||
"@embroider/test-setup": "^1.6.0", | ||
"@fortawesome/ember-fontawesome": "^0.3.3", | ||
"@fortawesome/free-brands-svg-icons": "^6.1.1", | ||
"@fortawesome/free-regular-svg-icons": "^6.1.1", | ||
"@fortawesome/free-solid-svg-icons": "^6.1.1", | ||
"babel-eslint": "^10.1.0", | ||
"bootstrap": "^4.4.1", | ||
"broccoli-asset-rev": "^3.0.0", | ||
"ember-bootstrap": "^5.1.1", | ||
"ember-cli": "~4.4.0", | ||
"ember-cli-app-version": "^4.0.0", | ||
"ember-cli-autoprefixer": "^2.0.0", | ||
"ember-cli-dependency-checker": "^3.3.1", | ||
"ember-cli-github-pages": "0.2.2", | ||
"ember-cli-inject-live-reload": "^2.1.0", | ||
"ember-cli-sass": "^11.0.1", | ||
"ember-cli-sri": "^2.1.1", | ||
"ember-cli-string-helpers": "^6.1.0", | ||
"ember-cli-terser": "^4.0.2", | ||
"ember-composable-helpers": "^5.0.0", | ||
"ember-disable-prototype-extensions": "^1.1.3", | ||
"ember-export-application-global": "^2.0.1", | ||
"ember-load-initializers": "^2.1.2", | ||
"ember-qunit": "^5.1.5", | ||
"ember-resolver": "^8.0.3", | ||
"ember-source": "~4.4.0", | ||
"ember-source-channel-url": "^3.0.0", | ||
"ember-template-lint": "^4.8.0", | ||
"ember-truth-helpers": "^3.0.0", | ||
"ember-try": "^2.0.0", | ||
"eslint": "^7.32.0", | ||
"eslint-config-prettier": "^8.5.0", | ||
"eslint-plugin-ember": "^10.6.1", | ||
"eslint-plugin-node": "^11.1.0", | ||
"eslint-plugin-prettier": "^4.0.0", | ||
"eslint-plugin-qunit": "^7.2.0", | ||
"loader.js": "^4.7.0", | ||
"npm-run-all": "^4.1.5", | ||
"prettier": "^2.6.2", | ||
"qunit": "^2.19.1", | ||
"qunit-dom": "^2.0.0", | ||
"release-it": "^14.2.1", | ||
"release-it-lerna-changelog": "^3.1.0", | ||
"sass": "^1.52.1", | ||
"webpack": "^5.73.0" | ||
}, | ||
"engines": { | ||
"node": "12.* || 14.* || >= 16" | ||
}, | ||
"publishConfig": { | ||
"registry": "https://registry.npmjs.org" | ||
}, | ||
"ember": { | ||
"edition": "octane" | ||
}, | ||
"ember-addon": { | ||
"configPath": "tests/dummy/config", | ||
"demoURL": "http://offirgolan.github.io/ember-burger-menu" | ||
"demoURL": "https://adopted-ember-addons.github.io/ember-burger-menu/" | ||
}, | ||
"release-it": { | ||
"plugins": { | ||
"release-it-lerna-changelog": { | ||
"infile": "CHANGELOG.md", | ||
"launchEditor": true | ||
} | ||
}, | ||
"git": { | ||
"tagName": "v${version}" | ||
}, | ||
"github": { | ||
"release": true, | ||
"tokenRef": "GITHUB_AUTH" | ||
} | ||
} | ||
} |
@@ -1,5 +0,4 @@ | ||
# Ember Burger Menu | ||
# ember-burger-menu | ||
[](https://embadge.io/v1/badge.svg?start=2.3.0) | ||
[](https://travis-ci.org/offirgolan/ember-burger-menu) | ||
[](https://github.com/adopted-ember-addons/ember-burger-menu/actions/workflows/ci.yml) | ||
[](http://badge.fury.io/js/ember-burger-menu) | ||
@@ -16,2 +15,8 @@ | ||
## Compatibility | ||
* Ember.js v3.24 or above | ||
* Ember CLI v3.24 or above | ||
* Node.js v12 or above | ||
## Installation | ||
@@ -65,3 +70,3 @@ | ||
- ### [Live Demo](http://offirgolan.github.io/ember-burger-menu) | ||
- ### [Live Demo](http://adopted-ember-addons.github.io/ember-burger-menu) | ||
@@ -71,3 +76,3 @@ - ### [Changelog](CHANGELOG.md) | ||
## Looking for help? | ||
If it is a bug [please open an issue on GitHub](http://github.com/offirgolan/ember-burger-menu/issues). | ||
If it is a bug [please open an issue on GitHub](http://github.com/adopted-ember-addons/ember-burger-menu/issues). | ||
@@ -103,15 +108,21 @@ ## Animations | ||
{{#burger.menu itemTagName="li" as |menu|}} | ||
<button {{action burger.state.actions.close}}>Close</button> | ||
<button {{on "click" burger.state.closeMenu}}>Close</button> | ||
<ul> | ||
{{#menu.item}} | ||
{{link-to 'Features' 'features'}} | ||
<LinkTo @route="features"> | ||
Features | ||
</LinkTo> | ||
{{/menu.item}} | ||
{{#menu.item}} | ||
{{link-to 'About' 'about'}} | ||
<LinkTo @route="about"> | ||
About | ||
</LinkTo> | ||
{{/menu.item}} | ||
{{#menu.item}} | ||
{{link-to 'Contact Us' 'contact'}} | ||
<LinkTo @route="contact"> | ||
Contact Us | ||
</LinkTo> | ||
{{/menu.item}} | ||
@@ -122,3 +133,3 @@ </ul> | ||
{{#burger.outlet}} | ||
<button {{action burger.state.actions.toggle}}>Menu</button> | ||
<button {{on "click" burger.state.toggleMenu}}>Menu</button> | ||
{{outlet}} | ||
@@ -205,2 +216,3 @@ {{/burger.outlet}} | ||
- #### `maxSwipeTime` | ||
@@ -274,3 +286,3 @@ | ||
```hbs | ||
<button {{action burger.state.actions.open}}>Open</button> | ||
<button {{on "click" burger.state.openMenu}}>Open</button> | ||
``` | ||
@@ -281,3 +293,3 @@ | ||
```hbs | ||
<button {{action burger.state.actions.close}}>Close</button> | ||
<button {{on "click" burger.state.closeMenu}}>Close</button> | ||
``` | ||
@@ -288,3 +300,3 @@ | ||
```hbs | ||
<button {{action burger.state.actions.toggle}}>Toggle</button> | ||
<button {{on "click" burger.state.toggleMenu}}>Toggle</button> | ||
``` | ||
@@ -375,1 +387,4 @@ | ||
``` | ||
# Contributing | ||
See the [Contributing](CONTRIBUTING.md) guide for details. |
{ | ||
"name": "ember-burger-menu", | ||
"description": "", | ||
"url": "http://github.com/offirgolan/ember-burger-menu", | ||
"url": "http://github.com/adopted-ember-addons/ember-burger-menu", | ||
"options": { | ||
@@ -6,0 +6,0 @@ "enabledEnvironments": [], |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
51187
5.99%7
-12.5%381
4.1%47
23.68%63
-3.08%621
-0.32%2
100%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated
Updated