WIP - putting lightswitch into the menu, cleaning up the code

This commit is contained in:
lone-cloud 2016-12-18 17:43:32 -08:00
parent 7a94a42eb8
commit 7f52961317
29 changed files with 735 additions and 1192 deletions

View file

@ -1,5 +0,0 @@
import Ember from 'ember';
import SplashscreenMixin from 'ember-cordova/mixins/device/splashscreen';
export default Ember.Route.extend(SplashscreenMixin, {
});

View file

@ -16,11 +16,9 @@ export default Component.extend({
lightsData: null,
activeLights: A(),
tabList: ["Lights", "Music"],
selectedTab: 0,
selectedTab: 1,
pauseLightUpdates: false,
lightsTabSelected: computed.equal('selectedTab', 0),
musicTabSelected: computed.equal('selectedTab', 1),
dimmerOn: false,
playing: false,
@ -206,15 +204,14 @@ export default Component.extend({
position: 'left'
},
{
intro: 'And that\'s it...Hope you enjoy the application. ;)<br><br>' +
'<i><b>TIP</b>: click on the lightswitch to switch to a darker theme.</i>',
intro: 'And that\'s it...Hope you enjoy the application. ;)'
}
]
});
// it's VERY ugly but it works... the jQuery massacre :'(
intro.onchange((element) => {
if(element.id === 'music-tab' || element.id === 'playlist' || element.id === 'player-area' || element.id === 'beat-option-row' || element.id === 'beat-option-button-group' || element.id === 'beat-container' || element.id === 'using-mic-audio-tooltip'){
if(element.id === '' || element.id === 'music-tab' || element.id === 'playlist' || element.id === 'player-area' || element.id === 'beat-option-row' || element.id === 'beat-option-button-group' || element.id === 'beat-container' || element.id === 'using-mic-audio-tooltip'){
$('.navigation-item').eq(1).click();
} else {
$('.navigation-item').eq(0).click();
@ -245,7 +242,7 @@ export default Component.extend({
}
run.later(this, function() {
$('.introjs-tooltip').velocity('scroll');
$('.introjs-tooltip').velocity('scroll', { offset: -100 });
}, 500);
}).start();
},

View file

@ -1,11 +1,5 @@
{{#if ready}}
<div id="navigation">
<div id="dimmer-container" {{action "toggleDimmer"}}>
<div id="dimmer" class={{dimmerOnClass}} >
<div id="dimmer-switch"></div>
</div>
</div>
{{#each tabData as |tab|}}
<span class="navigation-item text-uppercase {{if tab.selected "active"}}" {{action "changeTab" tab.name}}>{{tab.name}}</span>
{{/each}}
@ -17,6 +11,10 @@
{{/paper-button}}
{{/menu.trigger}}
{{#menu.content width=3 as |content|}}
{{#content.menu-item onClick="toggleDimmer"}}
{{paper-icon "lightbulb outline" class=dimmerOnClass}} Dark Mode: {{if dimmerOn "On" "Off"}}
{{/content.menu-item}}
{{#content.menu-item onClick="clearBridge"}}
{{paper-icon "compare arrows" class=dimmerOnClass}} Switch bridge
{{/content.menu-item}}
@ -34,9 +32,9 @@
{{light-group lightsData=lightsData activeLights=activeLights syncLight=syncLight apiURL=apiURL dimmerOn=dimmerOn storage=storage}}
{{lights-tab apiURL=apiURL lightsData=lightsData activeLights=activeLights syncLight=syncLight trial=trial active=lightsTabSelected colorLoopOn=colorLoopOn dimmerOn=dimmerOn playing=playing pauseLightUpdates=pauseLightUpdates}}
{{lights-tab active=(eq selectedTab 0) apiURL=apiURL lightsData=lightsData activeLights=activeLights syncLight=syncLight trial=trial colorLoopOn=colorLoopOn dimmerOn=dimmerOn playing=playing pauseLightUpdates=pauseLightUpdates}}
{{music-tab apiURL=apiURL lightsData=lightsData activeLights=activeLights active=musicTabSelected pauseLightUpdates=pauseLightUpdates dimmerOn=dimmerOn playing=playing storage=storage colorLoopOn=colorLoopOn action="startIntro"}}
{{music-tab active=(eq selectedTab 1) apiURL=apiURL lightsData=lightsData activeLights=activeLights pauseLightUpdates=pauseLightUpdates dimmerOn=dimmerOn playing=playing storage=storage colorLoopOn=colorLoopOn action="startIntro"}}
{{else}}
{{paper-progress-circular diameter=100}}
{{/if}}

View file

@ -63,7 +63,7 @@ export default Component.extend(helperMixin, visualizerMixin, {
this.get('kick').set({threshold: value});
}
if(saveBeatPrefs && this.get('usingLocalAudio') && this.get('playQueuePointer') !== -1){
if(saveBeatPrefs && this.get('playQueuePointer') !== -1){
this.saveSongBeatPreferences();
}
@ -288,7 +288,7 @@ export default Component.extend(helperMixin, visualizerMixin, {
});
['shuffle', 'repeat', 'threshold', 'playerBottomDisplayed', 'audioMode', 'songBeatPreferences', 'firstVisit', 'currentVisName', 'playQueue', 'playQueuePointer', 'micBoost', 'flashingTransitions', 'colorloopMode', 'ambienceMode', 'hueRange'].forEach((item)=>{
['shuffle', 'repeat', 'threshold', 'playerBottomDisplayed', 'audioMode', 'songBeatPreferences', 'firstVisit', 'currentVisName', 'playQueue', 'playQueuePointer', 'flashingTransitions', 'colorloopMode', 'ambienceMode', 'hueRange'].forEach((item)=>{
if (!isNone(storage.get('huegasm.' + item))) {
let itemVal = storage.get('huegasm.' + item);
@ -436,38 +436,6 @@ export default Component.extend(helperMixin, visualizerMixin, {
toggleIsShowingAddSoundCloudModal() {
this.toggleProperty('isShowingAddSoundCloudModal');
},
useLocalAudio(){
let audioStream = this.get('audioStream');
this.changePlayerControl('audioMode', 0);
if(!isNone(audioStream)){
let tracks = audioStream.getVideoTracks();
if (tracks && tracks[0] && tracks[0].stop) {
tracks[0].stop();
}
if (audioStream.stop) {
// deprecated, may be removed in future
audioStream.stop();
}
this.setProperties({
audioStream: null,
playing: false
});
}
if(this.get('playQueuePointer') !== -1) {
this.send('goToSong', this.get('playQueuePointer'));
}
// restore the old beat preferences ( before the user went into mic mode )
if(!isNone(this.get('oldThreshold'))){
this.set('threshold', this.get('oldThreshold'));
}
document.title = 'Huegasm';
},
slideTogglePlayerBottom(){
let elem = this.$('#player-bottom');
@ -690,17 +658,6 @@ export default Component.extend(helperMixin, visualizerMixin, {
hueRangeChanged(value) {
this.changePlayerControl('hueRange', value);
},
micBoostChanged(value) {
this.set('micBoost', value);
this.get('storage').set('huegasm.micBoost', value);
},
audioModeChanged(value){
if(value === 0) {
this.send('useLocalAudio');
} else {
this.set('audioMode', value);
}
},
playQueuePointerChanged(value){
this.send('goToSong', value, false, true);
},

View file

@ -66,26 +66,11 @@ export default Mixin.create({
from: function ( value ) { return value; }
}
}
},
micBoost: {
range: {min: 1, max: 11},
step: 0.5,
defaultValue: 5,
pips: {
mode: 'positions',
values: [0,20,40,60,80,100],
density: 10,
format: {
to: function ( value ) {return 'x'+value;},
from: function ( value ) { return value; }
}
}
}
},
threshold: 0.3,
hueRange: [0, 65535],
micBoost: 5,
oldThreshold: null,
playQueuePointer: -1,
@ -94,11 +79,6 @@ export default Mixin.create({
timeTotal: 0,
lastLightBopIndex: 0,
// 0 - local, 1 - mic, possibly more to come
audioMode: 0,
usingLocalAudio: computed.equal('audioMode', 0),
usingMicAudio: computed.equal('audioMode', 1),
playerBottomDisplayed: true,
dragging: false,
draggingOverPlayListArea: false,
@ -139,7 +119,6 @@ export default Mixin.create({
hueRangeConnect: [false, true, false],
SC_CLIENT_ID: 'aeec0034f58ecd85c2bd1deaecc41594',
notFoundHtml: '<div class="alert alert-danger" role="alert">A microphone was not found.</div>',
scUserNotSupportedHtml: '<div class="alert alert-danger" role="alert">SoundCloud user URLs are not supported.</div>',
tooManySoundCloudFuckUps: '<div class="alert alert-danger" role="alert">The SoundCloud API is not seving the audio properly. More details <a href="https://www.soundcloudcommunity.com/soundcloud/topics/some-soundcloud-cdn-hosted-tracks-dont-have-access-control-allow-origin-header" target="_blank" rel="noopener noreferrer">HERE</a>.</div>',
notStreamableHtml(fileNames){
@ -157,11 +136,11 @@ export default Mixin.create({
return '<div class="alert alert-danger" role="alert">Failed to decode file ( ' + fileName + ' ).</div>';
},
scUrl: computed('playQueuePointer', 'playQueue.[]', 'usingMicAudio', function(){
scUrl: computed('playQueuePointer', 'playQueue.[]', function(){
let rtn = null,
currentSong = this.get('playQueue')[this.get('playQueuePointer')];
if(currentSong && currentSong.scUrl && !this.get('usingMicAudio')){
if(currentSong && currentSong.scUrl){
rtn = currentSong.scUrl;
}
@ -185,14 +164,13 @@ export default Mixin.create({
return timeElapsed/timeTotal*100;
}),
largeArtworkPic: computed('playQueuePointer', 'usingMicAudio', 'currentVisName', function(){
largeArtworkPic: computed('playQueuePointer', 'currentVisName', function(){
let pic = '',
currentVisName = this.get('currentVisName'),
usingMicAudio = this.get('usingMicAudio'),
playQueuePointer = this.get('playQueuePointer'),
playQueue = this.get('playQueue');
if(playQueuePointer !== -1 && !usingMicAudio && currentVisName === 'None'){
if(playQueuePointer !== -1 && currentVisName === 'None'){
let song = playQueue[playQueuePointer];
if(song.scUrl && !isNone(song.picture)){
pic = song.picture.replace('67x67', '500x500');
@ -202,14 +180,6 @@ export default Mixin.create({
return pic;
}),
micIcon: computed('usingMicAudio', function(){
if(this.get('usingMicAudio')) {
return 'mic';
}
return 'mic-off';
}),
repeatIcon: computed('repeat', function() {
if(this.get('repeat') === 2) {
return 'repeat-one';
@ -258,14 +228,6 @@ export default Mixin.create({
return this.get('dimmerOn') ? 'dimmerOn' : null;
}),
usingLocalAudioClass: computed('usingLocalAudio', function(){
return this.get('usingLocalAudio') ? 'player-control-icon active' : 'player-control-icon';
}),
usingMicAudioClass: computed('usingMicAudio', function(){
return this.get('usingMicAudio') ? 'player-control-icon active' : 'player-control-icon';
}),
repeatClass: computed('repeat', function(){
return this.get('repeat') !== 0 ? 'player-control-icon active' : 'player-control-icon';
}),
@ -290,10 +252,8 @@ export default Mixin.create({
return this.formatTime(this.get('timeTotal'));
}),
onColorloopModeChange: observer('colorloopMode', 'usingMicAudio', 'playing', function(){
let colorLoop = ((this.get('playing') || this.get('usingMicAudio')) && this.get('colorloopMode')) ? true : false;
this.set('colorLoopOn', colorLoop);
onColorloopModeChange: observer('colorloopMode', 'playing', function(){
this.set('colorLoopOn', this.get('playing') && this.get('colorloopMode'));
}),
onOptionChange: observer('flashingTransitions', 'playQueue.[]', 'playQueuePointer', 'colorloopMode', 'ambienceMode', function(self, option){

View file

@ -9,7 +9,6 @@
{{paper-icon playerAreaClickIcon id="play-notification"}}
<div id="player-controls">
{{#if usingLocalAudio}}
{{range-slider start=seekPosition min=0 max=100 connect=filledConnect id="seek-slider" on-slide="seekChanged"}}
{{#if playQueueNotEmpty}}
@ -21,7 +20,6 @@
-->{{/if}}
<div id="player-time-controls">{{timeElapsedTxt}} / {{timeTotalTxt}}</div>
{{/if}}
{{#paper-menu as |menu|}}
{{#menu.trigger}}
@ -51,11 +49,10 @@
</div>
</div>
<div id="playlist" class="col-xs-12">
<input id="file-input" type="file" accept="audio/*" multiple="true"/>
<div id="playlist" class="col-xs-12">
<input id="file-input" type="file" accept="audio/*" multiple="true"/>
<div id="play-list-controls">
{{#if usingLocalAudio}}
<div id="play-list-controls">
{{#paper-menu as |menu|}}
{{#menu.trigger}}
{{#paper-button iconButton=false}}
@ -71,20 +68,11 @@
{{/content.menu-item}}
{{/menu.content}}
{{/paper-menu}}
{{/if}}
{{#if usingLocalAudio}}
<span {{action "shuffleChanged"}}>{{paper-icon "shuffle" class=shuffleClass}}</span>
<span {{action "repeatChanged"}}>{{paper-icon repeatIcon class=repeatClass}}</span>
{{/if}}
</div>
{{#if usingMicAudio}}
<div id="play-area-mic" class="{{if dimmerOn "dimmerOn"}}">
{{paper-icon "mic" class=dimmerOnClass}}
</div>
{{else}}
{{#if usingLocalAudio}}
<div id="play-list-area" class={{playListAreaClass}} {{action "addLocalAudio"}}>
{{#if playQueueEmpty}}
<div id="dragHere">
@ -120,9 +108,8 @@
</div>
{{/each}}
</div>
{{/if}}
{{/if}}
</div>
</div>
</div>
<div id="slide-toggle" class="text-center row" {{action "slideTogglePlayerBottom"}}>

View file

@ -67,21 +67,3 @@ body.dimmerOn {
position: relative;
bottom: 5px;
}
#dimmer {
background: url(images/lightswitch.png) !important;
width: 14px;
height: 34px;
&.dimmerOn #dimmer-switch {
opacity: 0;
}
}
#dimmer-switch {
background: url(images/lightswitch.png) -14px 0px;
width: 14px;
height: 34px;
transition: opacity 0.4s;
float: left;
opacity: 1;
}

View file

@ -1,9 +1,7 @@
/* Variables */
$centersize: 80px;
$center1size: 205px;
$bezelsize: 240px;
/* Extenders */
%base {
border-radius: 100%;
}

View file

@ -30,6 +30,15 @@
#navigation {
padding: 15px 0 20px;
text-align: center;
position: relative;
.ember-basic-dropdown-trigger {
z-index: 3;
text-align: right;
position: absolute;
top: 5px;
right: 10px;
transform: scale(1.1);
}
}
.navigation-item {
@ -75,12 +84,3 @@
top: 15px;
font-size: 16px !important;
}
#navigation .ember-basic-dropdown-trigger {
z-index: 3;
text-align: right;
float: right;
position: relative;
bottom: 10px;
transform: scale(1.1);
}

View file

@ -134,7 +134,9 @@
margin: 0 5px 1px 3px;
}
.ember-basic-dropdown-trigger {
float: right;
position: absolute;
bottom: 0;
right: 0;
color: $whitish;
.paper-button {
margin: 0;
@ -142,7 +144,7 @@
}
}
#play-list-area, #play-area-mic {
#play-list-area {
background-color: white;
width: 100%;
height: 350px;
@ -158,7 +160,7 @@
text-align: center;
width: 100%;
}
[md-font-icon="library-music"], [md-font-icon="mic"] {
[md-font-icon="library-music"] {
position: absolute;
top: 40%;
font-size: 100px;

View file

@ -20,6 +20,10 @@ md-checkbox .md-label {
}
}
.ember-basic-dropdown-trigger {
outline: none !important;
}
md-progress-circular {
margin: 0 auto 20px auto !important;
}

View file

@ -5,7 +5,7 @@
"bootstrap-sass": "^3.3.5",
"ember": "^2.10.0",
"ember-cli-shims": "^0.1.0",
"ember-load-initializers": "0.5.1",
"ember-load-initializers": "^0.5.1",
"ember-qunit-notifications": "0.1.0",
"hammer.js": "^2.0.8",
"intro.js": "^2.1.0",

View file

@ -36,12 +36,13 @@
"ember-cli-test-loader": "^1.1.0",
"ember-cli-uglify": "^1.2.0",
"ember-cordova": "^0.3.5",
"ember-cordova-keyboard": "0.0.1",
"ember-cordova-events": "^0.1.0",
"ember-cordova-keyboard": "^0.0.1",
"ember-export-application-global": "^1.0.4",
"ember-load-initializers": "^0.5.0",
"ember-modal-dialog": "^0.9.0",
"ember-notify": "^5.0.4",
"ember-paper": "^1.0.0-alpha.7",
"ember-paper": "^1.0.0-alpha.11",
"ember-resolver": "^2.0.3",
"ember-truth-helpers": "^1.2.0",
"loader.js": "^4.0.7"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because it is too large Load diff

View file

@ -20,9 +20,6 @@ export default Component.extend({
selectedTab: 1,
pauseLightUpdates: false,
lightsTabSelected: computed.equal('selectedTab', 0),
musicTabSelected: computed.equal('selectedTab', 1),
displayFailure: true,
notify: inject.service(),
@ -190,14 +187,13 @@ export default Component.extend({
position: 'bottom'
},
{
intro: 'And that\'s it...Hope you enjoy the application. ;)<br><br>' +
'<i><b>TIP</b>: click on the lightswitch to switch to a darker theme.</i>'
intro: 'And that\'s it...Hope you enjoy the application. ;)'
}
]
});
intro.onchange((element) => {
if(element.id === 'music-tab' || element.id === 'playlist' || element.id === 'player-area' || element.id === 'beat-option-row' || element.id === 'beat-option-button-group' || element.id === 'beat-container' || element.id === 'using-mic-audio-tooltip'){
if(element.id === '' || element.id === 'music-tab' || element.id === 'playlist' || element.id === 'player-area' || element.id === 'beat-option-row' || element.id === 'beat-option-button-group' || element.id === 'beat-container' || element.id === 'using-mic-audio-tooltip'){
$('.navigation-item').eq(0).click();
} else {
$('.navigation-item').eq(1).click();
@ -220,7 +216,7 @@ export default Component.extend({
}
run.later(this, function() {
$('.introjs-tooltip').velocity('scroll');
$('.introjs-tooltip').velocity('scroll', { offset: -100 });
}, 500);
}).start();
}

View file

@ -1,11 +1,5 @@
{{#if ready}}
<div id="navigation">
<div id="dimmer-container" {{action "toggleDimmer"}}>
<div id="dimmer" class={{dimmerOnClass}} >
<div id="dimmer-switch"></div>
</div>
</div>
{{#each tabData as |tab|}}
<span class="navigation-item pointer text-uppercase {{if tab.selected "active"}}" {{action "changeTab" tab.name}}>{{tab.name}}</span>
{{/each}}
@ -16,6 +10,10 @@
{{/paper-button}}
{{/menu.trigger}}
{{#menu.content width=3 as |content|}}
{{#content.menu-item onClick="toggleDimmer"}}
{{paper-icon "lightbulb outline" class=dimmerOnClass}} Dark Mode: {{if dimmerOn "On" "Off"}}
{{/content.menu-item}}
{{#content.menu-item onClick="clearBridge"}}
{{paper-icon "compare arrows" class=dimmerOnClass}} Switch bridge
{{/content.menu-item}}
@ -34,9 +32,9 @@
{{light-group lightsData=lightsData activeLights=activeLights syncLight=syncLight apiURL=apiURL dimmerOn=dimmerOn storage=storage}}
<div class="row">
{{lights-tab apiURL=apiURL lightsData=lightsData activeLights=activeLights syncLight=syncLight trial=trial active=lightsTabSelected colorLoopOn=colorLoopOn dimmerOn=dimmerOn playing=playing pauseLightUpdates=pauseLightUpdates}}
{{lights-tab active=(eq selectedTab 0) apiURL=apiURL lightsData=lightsData activeLights=activeLights syncLight=syncLight trial=trial colorLoopOn=colorLoopOn dimmerOn=dimmerOn playing=playing pauseLightUpdates=pauseLightUpdates}}
{{music-tab apiURL=apiURL lightsData=lightsData activeLights=activeLights active=musicTabSelected pauseLightUpdates=pauseLightUpdates dimmerOn=dimmerOn storage=storage colorLoopOn=colorLoopOn playing=playing action="startIntro"}}
{{music-tab active=(eq selectedTab 1) apiURL=apiURL lightsData=lightsData activeLights=activeLights pauseLightUpdates=pauseLightUpdates dimmerOn=dimmerOn storage=storage colorLoopOn=colorLoopOn playing=playing action="startIntro"}}
</div>
{{else}}
{{paper-progress-circular diameter=100}}

View file

@ -2,7 +2,8 @@ import Ember from 'ember';
const {
Component,
isEmpty
isEmpty,
$
} = Ember;
export default Component.extend({
@ -32,6 +33,7 @@ export default Component.extend({
isReady(){
this.set('ready', true);
$('html, body').velocity('scroll');
}
}
});

View file

@ -63,7 +63,7 @@ export default Component.extend(helperMixin, visualizerMixin, {
this.get('kick').set({threshold: value});
}
if(saveBeatPrefs && this.get('usingLocalAudio') && this.get('playQueuePointer') !== -1){
if(saveBeatPrefs && this.get('playQueuePointer') !== -1){
this.saveSongBeatPreferences();
}
@ -168,46 +168,6 @@ export default Component.extend(helperMixin, visualizerMixin, {
});
},
startUsingMic() {
navigator.getUserMedia(
{audio: true},
(stream) => {
this.changePlayerControl('audioMode', 1);
let dancer = this.get('dancer');
if(dancer.audio && dancer.audio.pause) {
dancer.pause();
}
this.setProperties({
volumeCache: this.get('volume'),
playing: true,
audioStream: stream
});
document.title = 'Listening to Mic - Huegasm';
dancer.load(stream, this.get('micBoost'), true);
this.set('usingBeatPreferences', false);
// much more sensitive beat preference settings are needed for mic mode
this.setProperties({
oldThreshold: this.get('threshold'),
threshold: 0.1
});
dancer.setVolume(0);
},
(err) => {
if(err.name === 'DevicesNotFoundError'){
this.get('notify').alert({html: this.get('notFoundHtml')});
}
console.log('Error during navigator.getUserMedia: ' + err.name + ', ' + err.message + ', ' + err.constraintName);
}
);
},
clearCurrentAudio(resetPointer) {
let dancer = this.get('dancer');
@ -341,11 +301,7 @@ export default Component.extend(helperMixin, visualizerMixin, {
kick: kick
});
if(navigator.getUserMedia === undefined){
this.set('usingMicSupported', false);
}
['volume', 'shuffle', 'repeat', 'volumeMuted', 'threshold', 'playerBottomDisplayed', 'audioMode', 'songBeatPreferences', 'firstVisit', 'currentVisName', 'playQueue', 'playQueuePointer', 'micBoost', 'flashingTransitions', 'colorloopMode', 'ambienceMode', 'hueRange'].forEach((item)=>{
['volume', 'shuffle', 'repeat', 'volumeMuted', 'threshold', 'playerBottomDisplayed', 'songBeatPreferences', 'firstVisit', 'currentVisName', 'playQueue', 'playQueuePointer', 'flashingTransitions', 'colorloopMode', 'ambienceMode', 'hueRange'].forEach((item)=>{
if (!isNone(storage.get('huegasm.' + item))) {
let itemVal = storage.get('huegasm.' + item);
@ -395,7 +351,7 @@ export default Component.extend(helperMixin, visualizerMixin, {
// control the volume by scrolling up/down
$('#player-area').on('mousewheel', (event)=>{
if(this.get('playQueueNotEmpty') && !this.get('usingMicAudio')) {
if(this.get('playQueueNotEmpty')) {
let scrollSize = 5;
if(event.deltaY < 0) {
@ -515,46 +471,6 @@ export default Component.extend(helperMixin, visualizerMixin, {
toggleIsShowingAddSoundCloudModal() {
this.toggleProperty('isShowingAddSoundCloudModal');
},
useLocalAudio(){
let audioStream = this.get('audioStream');
this.changePlayerControl('audioMode', 0);
if(!isNone(audioStream)){
let tracks = audioStream.getVideoTracks();
if (tracks && tracks[0] && tracks[0].stop) {
tracks[0].stop();
}
if (audioStream.stop) {
// deprecated, may be removed in future
audioStream.stop();
}
this.setProperties({
audioStream: null,
playing: false
});
}
if(this.get('playQueuePointer') !== -1) {
this.send('goToSong', this.get('playQueuePointer'));
this.send('volumeChanged', this.get('volume'));
}
// restore the old beat preferences ( before the user went into mic mode )
if(!isNone(this.get('oldThreshold'))){
this.set('threshold', this.get('oldThreshold'));
}
document.title = 'Huegasm';
},
useMicAudio() {
if(this.get('usingMicAudio')) {
this.send('useLocalAudio');
} else {
this.startUsingMic();
}
},
slideTogglePlayerBottom(){
let elem = this.$('#player-bottom');
@ -810,23 +726,6 @@ export default Component.extend(helperMixin, visualizerMixin, {
hueRangeChanged(value) {
this.changePlayerControl('hueRange', value);
},
micBoostChanged(value) {
this.set('micBoost', value);
this.get('storage').set('huegasm.micBoost', value);
if(this.get('usingMicAudio')) {
this.get('dancer').setBoost(value);
}
},
audioModeChanged(value){
if(value === 1) {
this.startUsingMic();
} else if(value === 0) {
this.send('useLocalAudio');
} else {
this.set('audioMode', value);
}
},
playQueuePointerChanged(value){
this.send('goToSong', value, false, true);
},

View file

@ -12,7 +12,7 @@ const {
} = Ember;
export default Mixin.create({
classNames: ['col-sm-10', 'col-sm-offset-1', 'col-xs-12'],
classNames: ['col-sm-8', 'col-sm-offset-2', 'col-xs-12'],
classNameBindings: ['active::hidden'],
elementId: 'music-tab',
@ -68,26 +68,11 @@ export default Mixin.create({
from: function ( value ) { return value; }
}
}
},
micBoost: {
range: {min: 1, max: 11},
step: 0.5,
defaultValue: 5,
pips: {
mode: 'positions',
values: [0,20,40,60,80,100],
density: 10,
format: {
to: function ( value ) {return 'x'+value;},
from: function ( value ) { return value; }
}
}
}
},
threshold: 0.3,
hueRange: [0, 65535],
micBoost: 5,
oldThreshold: null,
playQueuePointer: -1,
@ -95,12 +80,6 @@ export default Mixin.create({
timeElapsed: 0,
timeTotal: 0,
lastLightBopIndex: 0,
usingMicSupported: false,
// 0 - local, 1 - mic, possibly more to come
audioMode: 0,
usingLocalAudio: computed.equal('audioMode', 0),
usingMicAudio: computed.equal('audioMode', 1),
playerBottomDisplayed: true,
dragging: false,
@ -143,7 +122,6 @@ export default Mixin.create({
hueRangeConnect: [false, true, false],
SC_CLIENT_ID: 'aeec0034f58ecd85c2bd1deaecc41594',
notFoundHtml: '<div class="alert alert-danger" role="alert">A microphone was not found.</div>',
scUserNotSupportedHtml: '<div class="alert alert-danger" role="alert">SoundCloud user URLs are not supported.</div>',
tooManySoundCloudFuckUps: '<div class="alert alert-danger" role="alert">The SoundCloud API is not seving the audio properly. More details <a href="https://www.soundcloudcommunity.com/soundcloud/topics/some-soundcloud-cdn-hosted-tracks-dont-have-access-control-allow-origin-header" target="_blank" rel="noopener noreferrer">HERE</a>.</div>',
notStreamableHtml(fileNames){
@ -161,11 +139,11 @@ export default Mixin.create({
return '<div class="alert alert-danger" role="alert">Failed to decode file ( ' + fileName + ' ).</div>';
},
scUrl: computed('playQueuePointer', 'playQueue.[]', 'usingMicAudio', function(){
scUrl: computed('playQueuePointer', 'playQueue.[]', function(){
let rtn = null,
currentSong = this.get('playQueue')[this.get('playQueuePointer')];
if(currentSong && currentSong.scUrl && !this.get('usingMicAudio')){
if(currentSong && currentSong.scUrl){
rtn = currentSong.scUrl;
}
@ -189,14 +167,13 @@ export default Mixin.create({
return timeElapsed/timeTotal*100;
}),
largeArtworkPic: computed('playQueuePointer', 'usingMicAudio', 'currentVisName', function(){
largeArtworkPic: computed('playQueuePointer', 'currentVisName', function(){
let pic = '',
currentVisName = this.get('currentVisName'),
usingMicAudio = this.get('usingMicAudio'),
playQueuePointer = this.get('playQueuePointer'),
playQueue = this.get('playQueue');
if(playQueuePointer !== -1 && !usingMicAudio && currentVisName === 'None'){
if(playQueuePointer !== -1 && currentVisName === 'None'){
let song = playQueue[playQueuePointer];
if(song.scUrl && !isNone(song.picture)){
pic = song.picture.replace('67x67', '500x500');
@ -206,14 +183,6 @@ export default Mixin.create({
return pic;
}),
micIcon: computed('usingMicAudio', function(){
if(this.get('usingMicAudio')) {
return 'mic';
}
return 'mic-off';
}),
repeatIcon: computed('repeat', function() {
if(this.get('repeat') === 2) {
return 'repeat-one';
@ -272,14 +241,6 @@ export default Mixin.create({
return classes;
}),
usingLocalAudioClass: computed('usingLocalAudio', function(){
return this.get('usingLocalAudio') ? 'player-control-icon active' : 'player-control-icon';
}),
usingMicAudioClass: computed('usingMicAudio', function(){
return this.get('usingMicAudio') ? 'player-control-icon active' : 'player-control-icon';
}),
repeatClass: computed('repeat', function(){
return this.get('repeat') !== 0 ? 'player-control-icon active' : 'player-control-icon';
}),
@ -318,10 +279,8 @@ export default Mixin.create({
return this.formatTime(this.get('timeTotal'));
}),
onColorloopModeChange: observer('colorloopMode', 'usingMicAudio', 'playing', function(){
let colorLoop = ((this.get('playing') || this.get('usingMicAudio')) && this.get('colorloopMode')) ? true : false;
this.set('colorLoopOn', colorLoop);
onColorloopModeChange: observer('colorloopMode', 'playing', function(){
this.set('colorLoopOn', this.get('playing') && this.get('colorloopMode'));
}),
onOptionChange: observer('flashingTransitions', 'playQueue.[]', 'playQueuePointer', 'colorloopMode', 'ambienceMode', function(self, option){
@ -341,16 +300,6 @@ export default Mixin.create({
this.changeTooltipText(type, tooltipTxt);
})),
onUsingMicAudioChange: on('init', observer('usingMicAudio', function(){
let tooltipTxt = 'Listen to audio through mic', type = 'usingMicAudio';
if (this.get(type)) {
tooltipTxt = 'Listen to audio files';
}
this.changeTooltipText(type, tooltipTxt);
})),
onShuffleChange: on('init', observer('shuffle', function () {
let tooltipTxt = 'Shuffle', type = 'shuffle';

View file

@ -9,7 +9,6 @@
{{paper-icon playerAreaClickIcon id="play-notification"}}
<div id="player-controls">
{{#if usingLocalAudio}}
{{range-slider start=seekPosition min=0 max=100 connect=filledConnect id="seek-slider" on-slide="seekChanged"}}
{{#if playQueueNotEmpty}}
@ -27,7 +26,6 @@
-->{{range-slider start=volume min=0 max=100 connect=filledConnect on-slide="volumeChanged" id="volume-bar" class="hidden-xs"}}
<div id="player-time-controls">{{timeElapsedTxt}} / {{timeTotalTxt}}</div>
{{/if}}
{{#paper-menu as |menu|}}
{{#menu.trigger}}
@ -61,7 +59,6 @@
<input id="file-input" type="file" accept="audio/*" multiple="true"/>
<div id="play-list-controls">
{{#if usingLocalAudio}}
{{#paper-menu as |menu|}}
{{#menu.trigger}}
{{#paper-button iconButton=false}}
@ -77,25 +74,12 @@
{{/content.menu-item}}
{{/menu.content}}
{{/paper-menu}}
{{/if}}
{{#if usingMicSupported}}
<span data-toggle="tooltip" data-placement="top auto" class="bootstrap-tooltip" id="using-mic-audio-tooltip" data-title={{usingMicAudioTooltipTxt}} {{action "useMicAudio"}}>{{paper-icon icon=micIcon class=usingMicAudioClass}}</span>
{{/if}}
{{#if usingLocalAudio}}
<span data-toggle="tooltip" data-placement="top auto" class="bootstrap-tooltip" id="shuffleTooltip" data-title={{shuffleTooltipTxt}} {{action "shuffleChanged"}}>{{paper-icon "shuffle" class=shuffleClass}}</span>
<span data-toggle="tooltip" data-placement="top auto" class="bootstrap-tooltip" id="repeatTooltip" data-title={{repeatTooltipTxt}} {{action "repeatChanged"}}>{{paper-icon repeatIcon class=repeatClass}}</span>
<span data-toggle="tooltip" data-placement="top auto" class="bootstrap-tooltip hidden-xs" data-title="Clear playlist" {{action "clearPlaylist"}}>{{paper-icon "clear-all" class="player-control-icon"}}</span>
{{/if}}
</div>
{{#if usingMicAudio}}
<div id="play-area-mic" class="{{if dimmerOn "dimmerOn"}}">
{{paper-icon "mic" class=dimmerOnClass}}
</div>
{{else}}
{{#if usingLocalAudio}}
<div id="play-list-area" class={{playListAreaClass}} {{action "addLocalAudio"}} {{action "playerListAreaDragOver" on="dragOver"}} {{action "playerListAreaDragLeave" on="dragLeave"}} {{action "dropFiles" on="drop"}}>
{{#if (or playQueueEmpty dragging)}}
<div id="dragHere">
@ -135,8 +119,6 @@
</div>
{{/each}}
</div>
{{/if}}
{{/if}}
</div>
</div>
@ -171,16 +153,6 @@
{{range-slider start=threshold orientation="vertical" step=beatOptions.threshold.step range=beatOptions.threshold.range on-slide="thresholdChanged" pips=beatOptions.threshold.pips}}
</div>
{{#if usingMicAudio}}
<div class="beat-option col-xs-4">
<span data-toggle="tooltip" data-placement="top" data-title="The coefficient to boost the microphone signal by" class="option-description bootstrap-tooltip">
Mic Boost
</span>
{{range-slider start=micBoost orientation="vertical" step=beatOptions.micBoost.step range=beatOptions.micBoost.range on-slide="micBoostChanged" pips=beatOptions.micBoost.pips}}
</div>
{{/if}}
<div id="light-option" class="beat-option col-sm-4 col-xs-12">
<span data-toggle="tooltip" data-placement="top auto" data-title="Quickly flash the lights on beat" class="bootstrap-tooltip" {{action "hideTooltip" on="mouseLeave"}}>
{{paper-checkbox value=flashingTransitions onChange=(action (mut flashingTransitions)) label="Flashing Transitions"}}

View file

@ -74,29 +74,3 @@ body.dimmerOn {
background: url(images/huegasm.png) center center no-repeat;
background-size: 40px 40px;
}
#dimmer-container {
float: left;
cursor: pointer;
padding: 5px 10px;
position: relative;
bottom: 5px;
}
#dimmer {
background: url(images/lightswitch.png) !important;
width: 14px;
height: 34px;
&.dimmerOn #dimmer-switch {
opacity: 0;
}
}
#dimmer-switch {
background: url(images/lightswitch.png) -14px 0px;
width: 14px;
height: 34px;
transition: opacity 0.4s;
float: left;
opacity: 1;
}

View file

@ -1,9 +1,7 @@
/* Variables */
$centersize: 80px;
$center1size: 205px;
$bezelsize: 240px;
/* Extenders */
%base {
border-radius: 100%;
}
@ -34,6 +32,7 @@ $bezelsize: 240px;
background: radial-gradient(ellipse at center, rgba(0,0,0,1) 0%,rgba(79,79,79,1) 0%,rgba(0,0,0,1) 100%);
box-shadow: 0 0 10px rgba(0, 0, 0, 1);
}
#beat-speaker-center-outer {
@extend %base;
position: absolute;
@ -49,6 +48,7 @@ $bezelsize: 240px;
background: -ms-linear-gradient(130deg, rgba(117, 117, 117, 1) 55%, rgba(220, 220, 220, 1) 100%);
background: linear-gradient(130deg, rgba(117, 117, 117, 1) 55%, rgba(220, 220, 220, 1) 100%);
}
.bezel {
@extend %base;
margin: 0 auto;
@ -60,6 +60,7 @@ $bezelsize: 240px;
top: 50%;
transform: translateY(-50%);
}
.rivet1 {
@extend %rivet;
top: 6px;

View file

@ -42,6 +42,15 @@
padding: 15px 0;
text-align: center;
margin: auto;
position: relative;
.ember-basic-dropdown-trigger {
z-index: 3;
text-align: right;
position: absolute;
top: 5px;
right: 10px;
transform: scale(1.1);
}
}
.navigation-item {
@ -61,10 +70,6 @@
border: 1px solid rgba(0, 0, 0, 0.5);
}
.color-row .md-list-item-inner {
padding-right: 0;
}
#color-picker {
padding: 5px;
background: rgba(0, 0, 0, 0.7);
@ -96,15 +101,6 @@
font-size: 16px !important;
}
#navigation .ember-basic-dropdown-trigger {
z-index: 3;
text-align: right;
float: right;
position: relative;
bottom: 10px;
transform: scale(1.1);
}
@media(min-width:767px) {
#lights-tab {
font-size: 20px;

View file

@ -159,7 +159,9 @@
margin: 0 5px 1px 3px;
}
.ember-basic-dropdown-trigger {
float: right;
position: absolute;
bottom: 0;
right: 0;
color: $whitish;
.paper-button {
margin: 0;
@ -167,7 +169,7 @@
}
}
#play-list-area, #play-area-mic {
#play-list-area {
background-color: white;
width: 100%;
height: 350px;
@ -183,7 +185,7 @@
text-align: center;
width: 100%;
}
[md-font-icon="library-music"], [md-font-icon="mic"] {
[md-font-icon="library-music"] {
position: absolute;
top: 40%;
font-size: 100px;

View file

@ -53,6 +53,10 @@ md-switch.md-default-theme.md-checked .md-thumb {
background-color: $secondaryThemeColor;
}
.ember-basic-dropdown-trigger {
outline: none !important;
}
@media(max-width:500px) {
#save-beat-preferences-star {
right: 5px;

View file

@ -1,6 +1,6 @@
{
"name": "huegasm",
"version": "1.1.0",
"version": "1.2.0",
"description": "Huegasm is a free web application for managing and synchronizing your Philips Hue lights with the beat of your music.",
"private": true,
"directories": {
@ -13,7 +13,7 @@
"test": "ember test"
},
"engines": {
"node": ">= 0.10.0"
"node": ">= 0.12.0"
},
"author": "Egor Philippov",
"license": "MIT",
@ -38,7 +38,7 @@
"ember-load-initializers": "^0.5.0",
"ember-modal-dialog": "^0.9.0",
"ember-notify": "^5.0.4",
"ember-paper": "^1.0.0-alpha.7",
"ember-paper": "^1.0.0-alpha.11",
"ember-resolver": "^2.0.3",
"ember-truth-helpers": "^1.2.0",
"loader.js": "^4.0.7"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -177,10 +177,6 @@ ast-types@0.8.12:
version "0.8.12"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc"
ast-types@0.8.15:
version "0.8.15"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52"
ast-types@0.9.2:
version "0.9.2"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.2.tgz#2cc19979d15c655108bf565323b8e7ee38751f6b"
@ -527,8 +523,8 @@ broccoli-brocfile-loader@^0.18.0:
findup-sync "^0.4.2"
broccoli-builder@^0.18.0:
version "0.18.1"
resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.1.tgz#a25ea2f53a5d1e7da8c38304db4b046cc23f66df"
version "0.18.2"
resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.2.tgz#2093ca0b1ac793e30d0810913399da98fb2d0667"
dependencies:
heimdalljs "^0.2.0"
promise-map-series "^0.2.1"
@ -871,8 +867,8 @@ can-symlink@^1.0.0:
tmp "0.0.28"
caniuse-db@^1.0.30000153, caniuse-db@^1.0.30000214:
version "1.0.30000592"
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000592.tgz#7b916023941df4063d9d946a1f9ad0d5edaf2bcd"
version "1.0.30000597"
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000597.tgz#b52e6cbe9dc83669affb98501629feaee1af6588"
capture-exit@^1.0.4:
version "1.0.7"
@ -956,8 +952,8 @@ clean-css-promise@^0.1.0:
pinkie-promise "^2.0.0"
clean-css@^3.4.5:
version "3.4.21"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.21.tgz#2101d5dbd19d63dbc16a75ebd570e7c33948f65b"
version "3.4.22"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.22.tgz#db323064f752028778233b58c54cd8535f860892"
dependencies:
commander "2.8.x"
source-map "0.4.x"
@ -1415,8 +1411,8 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
ember-ajax@^2.0.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-2.5.2.tgz#aefd6f860b03ab75c97e73ed410aa9e371ea88c6"
version "2.5.3"
resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-2.5.3.tgz#02dded6c132290edd47ee9862a7a8821c6919dad"
dependencies:
ember-cli-babel "^5.1.5"
@ -1457,8 +1453,8 @@ ember-cli-babel@^5.0.0, ember-cli-babel@^5.1.10, ember-cli-babel@^5.1.3, ember-c
resolve "^1.1.2"
ember-cli-broccoli-sane-watcher@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.3.tgz#756163e08cdbb012a3421a1eb695497a834d351b"
version "2.0.4"
resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6"
dependencies:
broccoli-slow-trees "^3.0.1"
heimdalljs "^0.2.1"
@ -1510,8 +1506,8 @@ ember-cli-is-package-missing@^1.0.0:
resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390"
ember-cli-legacy-blueprints@^0.1.2:
version "0.1.3"
resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.1.3.tgz#caf477a775229a0cd6a28b659304943db1367770"
version "0.1.4"
resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.1.4.tgz#83d6c005ac0e39750ff9dd45cd1b78cf697150c6"
dependencies:
chalk "^1.1.1"
ember-cli-get-component-path-option "^1.0.0"
@ -1792,7 +1788,7 @@ ember-notify@^5.0.4:
ember-string-ishtmlsafe-polyfill "1.0.1"
object-assign "^4.1.0"
ember-paper@^1.0.0-alpha.7:
ember-paper@^1.0.0-alpha.11:
version "1.0.0-alpha.11"
resolved "https://registry.yarnpkg.com/ember-paper/-/ember-paper-1.0.0-alpha.11.tgz#200a729a8bb9e1cc0fe2788785e5b404d18fd291"
dependencies:
@ -2169,7 +2165,7 @@ faye-websocket@~0.10.0:
fb-watchman@^1.8.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec"
resolved "http://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec"
dependencies:
bser "^1.0.2"
@ -2280,7 +2276,7 @@ fresh@0.3.0:
fs-exists-sync@^0.1.0:
version "0.1.0"
resolved "http://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
fs-extra@0.30.0, fs-extra@^0.30.0:
version "0.30.0"
@ -2427,7 +2423,11 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
git-repo-info@^1.0.4, git-repo-info@~1.2.0:
git-repo-info@^1.0.4:
version "1.3.1"
resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.3.1.tgz#0c1a19ef1964b822a7230f087396af80481ce8ec"
git-repo-info@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.2.0.tgz#43d8513e04a24dd441330a2f7c6655a709fdbaf2"
@ -2862,7 +2862,7 @@ is-obj@^1.0.0:
is-posix-bracket@^0.1.0:
version "0.1.1"
resolved "http://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
is-primitive@^2.0.0:
version "2.0.0"
@ -3097,8 +3097,8 @@ load-json-file@^1.0.0:
strip-bom "^2.0.0"
loader.js@^4.0.7:
version "4.0.11"
resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.0.11.tgz#457d7cdcff1badfc9837441a562957dae7eeecea"
version "4.1.0"
resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.1.0.tgz#1d0897a62f8b7375d3d9cd1ae6acf798c36c1ffe"
lockfile@~1.0.1:
version "1.0.3"
@ -3530,7 +3530,7 @@ minimatch@^2.0.3:
dependencies:
brace-expansion "^1.0.0"
minimist@0.0.8, minimist@~0.0.1:
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
@ -3538,6 +3538,10 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
minimist@~0.0.1:
version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
@ -3659,8 +3663,8 @@ node-notifier@^4.3.1:
which "^1.0.5"
node-sass@^3.8.0:
version "3.13.0"
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.13.0.tgz#d08b95bdebf40941571bd2c16a9334b980f8924f"
version "3.13.1"
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.13.1.tgz#7240fbbff2396304b4223527ed3020589c004fc2"
dependencies:
async-foreach "^0.1.3"
chalk "^1.1.1"
@ -3829,8 +3833,8 @@ npm@3.10.8:
set-blocking "~2.0.0"
npmlog@^4.0.0, npmlog@~4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8"
version "4.0.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
@ -3931,8 +3935,8 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
osenv@0, osenv@^0.1.0, osenv@^0.1.3, osenv@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217"
version "0.1.4"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
dependencies:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
@ -4113,11 +4117,11 @@ q@^1.1.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
qs@6.2.0, qs@~6.2.0:
qs@6.2.0, qs@^6.2.0, qs@~6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b"
qs@^6.2.0, qs@~6.3.0:
qs@~6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442"
@ -4280,7 +4284,7 @@ realize-package-specifier@~3.0.3:
dezalgo "^1.0.1"
npm-package-arg "^4.1.1"
recast@0.10.33:
recast@0.10.33, recast@^0.10.10:
version "0.10.33"
resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697"
dependencies:
@ -4289,15 +4293,6 @@ recast@0.10.33:
private "~0.1.5"
source-map "~0.5.0"
recast@^0.10.10:
version "0.10.43"
resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f"
dependencies:
ast-types "0.8.15"
esprima-fb "~15001.1001.0-dev-harmony-fb"
private "~0.1.5"
source-map "~0.5.0"
recast@^0.11.17, recast@^0.11.3:
version "0.11.18"
resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.18.tgz#07af6257ca769868815209401d4d60eef1b5b947"
@ -4347,7 +4342,7 @@ regenerator@0.8.40:
regex-cache@^0.4.2:
version "0.4.3"
resolved "http://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
dependencies:
is-equal-shallow "^0.1.3"
is-primitive "^2.0.0"
@ -4463,8 +4458,8 @@ resolve-dir@^0.1.0:
global-modules "^0.2.3"
resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
version "1.2.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c"
restore-cursor@^1.0.1:
version "1.0.1"
@ -4474,8 +4469,8 @@ restore-cursor@^1.0.1:
onetime "^1.0.0"
retry@^0.10.0, retry@~0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd"
version "0.10.1"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
right-align@^0.1.1:
version "0.1.3"
@ -4982,8 +4977,8 @@ tough-cookie@~2.3.0:
punycode "^1.4.1"
tree-sync@^1.1.4:
version "1.1.5"
resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.1.5.tgz#3ccb5c7c0bfaf1fab4dd89dd48206ab2b413be72"
version "1.2.1"
resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.1.tgz#35619b7c310f5dfb4091601c013e8a72da67937a"
dependencies:
debug "^2.2.0"
fs-tree-diff "^0.5.2"
@ -5012,8 +5007,8 @@ tunnel-agent@~0.4.1:
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.4"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b"
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
type-is@~1.6.13:
version "1.6.14"