diff --git a/Gulpfile.js b/Gulpfile.js index 94f37f59..597b426f 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -42,8 +42,8 @@ gulp.task('styl', function () { .pipe(styl()) .pipe(autoprefixer()) .pipe(gulp.dest('src')) - .pipe(notify('Stylus!!')) .pipe(livereload()) + .pipe(notify('Stylus!!')) }) gulp.task('bs', function () { @@ -57,7 +57,7 @@ gulp.task('bs', function () { }) gulp.task('inject', function (cb) { - runSequence('inject-main', 'inject-popup', cb) + runSequence(['inject-main', 'inject-popup'], cb) }) gulp.task('inject-main', function () { @@ -71,6 +71,13 @@ gulp.task('inject-main', function () { .pipe(gulp.dest('src/browser/main/')) }) +gulp.task('watch-main', function () { + gulp.watch( + ['src/browser/main/index.inject.html', 'src/browser/main/**/*.js', 'src/browser/main/**/*.css', 'src/browser/shared/**/*.js', 'src/browser/shared/**/*.css'], ['inject-main']) + + gulp.watch('src/**/*.styl', ['styl']) + livereload.listen() +}) gulp.task('inject-popup', function () { return gulp.src('src/browser/popup/index.inject.html') .pipe(inject(gulp.src(['src/browser/popup/**/*.js', 'src/browser/popup/**/*.css', 'src/browser/shared/**/*.js', 'src/browser/shared/**/*.css'], {read: false}), { diff --git a/build.config.js b/build.config.js index 2007842b..d5e96a58 100644 --- a/build.config.js +++ b/build.config.js @@ -39,6 +39,10 @@ module.exports = { { name: 'angular-hotkeys', src: 'node_modules/angular-hotkeys/build/hotkeys.js' + }, + { + name: 'marked', + src: 'node_modules/marked/lib/marked.js' } ] } diff --git a/package.json b/package.json index 627b4b47..752fdafc 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "gulp-stylus": "^2.0.3", "gulp-template": "^3.0.0", "gulp-uglify": "^1.2.0", + "marked": "^0.3.3", "merge-stream": "^0.1.7", "moment": "^2.10.3", "run-sequence": "^1.1.0", diff --git a/src/browser/main/config/states.js b/src/browser/main/config/states.js index 56bf2230..64de2ae9 100644 --- a/src/browser/main/config/states.js +++ b/src/browser/main/config/states.js @@ -86,4 +86,26 @@ angular.module('codexen') } }) + /* Recipes */ + .state('recipes', { + url: '/recipes', + views: { + 'main-view': { + templateUrl: 'tpls/states/recipes.list.tpl.html', + controller: 'RecipesListController as vm' + } + }, + resolve: { + myRecipes: function (Recipe) { + return Recipe.findMine().then(function (res) { + return res.data + }) + } + } + }) + .state('recipes.detail', { + url: '/:id', + templateUrl: 'tpls/states/recipes.detail.html', + controller: 'RecipesDetailController as vm' + }) }) diff --git a/src/browser/main/controllers/directives/SideNavController.js b/src/browser/main/controllers/directives/SideNavController.js index f3867409..b9f343b3 100644 --- a/src/browser/main/controllers/directives/SideNavController.js +++ b/src/browser/main/controllers/directives/SideNavController.js @@ -31,6 +31,5 @@ angular.module('codexen') $scope.$on('userSignOut', function () { vm.isAuthenticated = false vm.currentUser = null - }) }) diff --git a/src/browser/main/controllers/modals/DeleteRecipeModalController.js b/src/browser/main/controllers/modals/DeleteRecipeModalController.js new file mode 100644 index 00000000..1cdae3b4 --- /dev/null +++ b/src/browser/main/controllers/modals/DeleteRecipeModalController.js @@ -0,0 +1,16 @@ +/* global angular */ +angular.module('codexen') + .controller('DeleteRecipeModalController', function ($modalInstance, Recipe, recipe) { + var vm = this + + vm.submit = function () { + Recipe.delete(recipe.id) + .success(function (recipe) { + $modalInstance.close(recipe) + }) + } + + vm.cancel = function () { + $modalInstance.dismiss() + } + }) diff --git a/src/browser/main/controllers/modals/EditRecipeModalController.js b/src/browser/main/controllers/modals/EditRecipeModalController.js new file mode 100644 index 00000000..d587e52f --- /dev/null +++ b/src/browser/main/controllers/modals/EditRecipeModalController.js @@ -0,0 +1,42 @@ +/* global angular */ +angular.module('codexen') + .controller('EditRecipeModalController', function (Recipe, Tag, $modalInstance, recipe) { + var vm = this + + vm.recipe = recipe + + vm.submit = function () { + var params = { + title: vm.recipe.title, + content: vm.recipe.content, + Tags: angular.isArray(vm.recipe.Tags) ? vm.recipe.Tags.map(function (tag) { return tag.name }) : [] + } + + Recipe.update(vm.recipe.id, params) + .success(function (data) { + $modalInstance.close(data) + }) + } + + // vm.tags = [] + vm.tagCandidates = [] + vm.refreshTagCandidates = function (tagName) { + if (tagName == null || tagName === '') return null + return Tag.findByName(tagName) + .success(function (data) { + console.log('tags fetched!!', data) + vm.tagCandidates = data + }) + } + vm.transform = function (tagName) { + return { + id: 0, + name: tagName + } + } + + vm.cancel = function () { + $modalInstance.dismiss() + } + + }) diff --git a/src/browser/main/controllers/modals/EditSnippetModalController.js b/src/browser/main/controllers/modals/EditSnippetModalController.js index 1703ded9..6254b525 100644 --- a/src/browser/main/controllers/modals/EditSnippetModalController.js +++ b/src/browser/main/controllers/modals/EditSnippetModalController.js @@ -17,6 +17,7 @@ angular.module('codexen') Snippet.update(vm.snippet.id, params) .success(function (data) { console.log('updated res :', data) + $rootScope.$broadcast('snippetUpdated', snippet) $modalInstance.close(data) }) } diff --git a/src/browser/main/controllers/modals/NewRecipeModalController.js b/src/browser/main/controllers/modals/NewRecipeModalController.js new file mode 100644 index 00000000..5b1d072e --- /dev/null +++ b/src/browser/main/controllers/modals/NewRecipeModalController.js @@ -0,0 +1,42 @@ +/* global angular */ +angular.module('codexen') + .controller('NewRecipeModalController', function (Recipe, Tag, $modalInstance) { + var vm = this + + vm.content = '' + + vm.submit = function () { + var params = { + title: vm.title, + content: vm.content, + Tags: angular.isArray(vm.Tags) ? vm.Tags.map(function (tag) { return tag.name }) : [] + } + + Recipe.create(params) + .success(function (data) { + $modalInstance.close(data) + }) + } + + // vm.tags = [] + vm.tagCandidates = [] + vm.refreshTagCandidates = function (tagName) { + if (tagName == null || tagName === '') return null + return Tag.findByName(tagName) + .success(function (data) { + console.log('tags fetched!!', data) + vm.tagCandidates = data + }) + } + vm.transform = function (tagName) { + return { + id: 0, + name: tagName + } + } + + vm.cancel = function () { + $modalInstance.dismiss() + } + + }) diff --git a/src/browser/main/controllers/modals/NewSnippetModalController.js b/src/browser/main/controllers/modals/NewSnippetModalController.js index 5fd1aa07..7fac0952 100644 --- a/src/browser/main/controllers/modals/NewSnippetModalController.js +++ b/src/browser/main/controllers/modals/NewSnippetModalController.js @@ -1,6 +1,6 @@ /* global angular */ angular.module('codexen') - .controller('NewSnippetModalController', function ($modalInstance, aceModes, $log, Snippet, $rootScope, Tag) { + .controller('NewSnippetModalController', function ($modalInstance, aceModes, $log, Snippet, Tag) { var vm = this vm.aceModes = aceModes diff --git a/src/browser/main/controllers/states/RecipesDetailController.js b/src/browser/main/controllers/states/RecipesDetailController.js new file mode 100644 index 00000000..1eb365ab --- /dev/null +++ b/src/browser/main/controllers/states/RecipesDetailController.js @@ -0,0 +1,32 @@ +/* global angular */ +angular.module('codexen') + .controller('RecipesDetailController', function (Recipe, $state, $rootScope, $scope, Modal) { + var vm = this + + vm.isLoaded = false + + var recipeId = $state.params.id + + Recipe.show(recipeId) + .success(function (data) { + vm.recipe = data + vm.isLoaded = true + }) + + $scope.$on('taggingRequested', function (e) { + e.stopPropagation() + e.preventDefault() + Modal.editRecipe(angular.copy(vm.recipe)) + .then(function (recipe) { + console.log('edited', recipe) + }, function () { + console.log('edit recipe modal dismissed') + }) + }) + + $scope.$on('recipeUpdated', function (e, recipe) { + console.log('event received', recipe) + if (recipe.id === vm.recipe.id) vm.recipe = recipe + }) + + }) diff --git a/src/browser/main/controllers/states/RecipesListController.js b/src/browser/main/controllers/states/RecipesListController.js new file mode 100644 index 00000000..e1c38603 --- /dev/null +++ b/src/browser/main/controllers/states/RecipesListController.js @@ -0,0 +1,98 @@ +/* global angular */ +angular.module('codexen') + .controller('RecipesListController', function (Recipe, $state, $scope, $filter, myRecipes, User, $auth) { + var vm = this + + + vm.recipes = myRecipes + + vm.searchRecipes = searchRecipes + vm.searchRecipes() + + vm.isAuthenticated = $auth.isAuthenticated() + var reloadUser = function () { + if (vm.isAuthenticated) { + User.me().success(function (data) { + vm.currentUser = data + }) + } + } + reloadUser() + + $scope.$on('$stateChangeSuccess', function (e, toState, toParams) { + if (!toState.name.match(/recipes/)) return null + + vm.recipeId = parseInt(toParams.id, 10) + + if (!vm.recipeId && vm.filtered && vm.filtered[0]) { + $state.go('recipes.detail', {id: vm.filtered[0].id}) + } + }) + + $scope.$on('recipeUpdated', function (e, recipe) { + if (!myRecipes.some(function (_recipe, index) { + if (_recipe.id === recipe.id) { + myRecipes[index] = recipe + return true + } + return false + })) myRecipes.unshift(recipe) + + searchRecipes() + vm.recipeId = recipe.id + $state.go('recipes.detail', {id: recipe.id}) + }) + + $scope.$on('recipeDeleted', function () { + if ($state.is('recipes.detail')) { + var currentRecipeId = parseInt($state.params.id, 10) + // Delete recipe from recipe list + for (var i = 0; i < vm.recipes.length; i++) { + if (vm.recipes[i].id === currentRecipeId) { + vm.recipes.splice(i, 1) + break + } + } + // Delete recipe from `filtered list` + // And redirect `next filtered recipe` + for (i = 0; i < vm.filtered.length; i++) { + if (vm.filtered[i].id === currentRecipeId) { + if (vm.filtered[i + 1] != null) $state.go('recipes.detail', {id: vm.filtered[i + 1].id}) + else if (vm.filtered[i - 1] != null) $state.go('recipes.detail', {id: vm.filtered[i - 1].id}) + else $state.go('recipes') + + vm.filtered.splice(i, 1) + break + } + } + + } + }) + + $scope.$on('tagSelected', function (e, tag) { + e.stopPropagation() + $scope.$apply(function () { + vm.search = '#' + tag.name + searchRecipes() + }) + }) + + function loadRecipes () { + if ($auth.isAuthenticated) { + Recipe.findMine() + .success(function (data) { + vm.recipes = data + }) + } else { + vm.recipes = void 0 + } + } + + function searchRecipes () { + vm.filtered = $filter('filter')(myRecipes, vm.search) + if (vm.search && vm.filtered && vm.filtered[0] && (!vm.recipeId || vm.recipeId !== vm.filtered[0].id)) { + $state.go('recipes.detail', {id: vm.filtered[0].id}) + } + } + + }) diff --git a/src/browser/main/controllers/states/SnippetsDetailController.js b/src/browser/main/controllers/states/SnippetsDetailController.js index a7a8a25a..c9d43312 100644 --- a/src/browser/main/controllers/states/SnippetsDetailController.js +++ b/src/browser/main/controllers/states/SnippetsDetailController.js @@ -17,11 +17,11 @@ angular.module('codexen') e.stopPropagation() e.preventDefault() Modal.editSnippet(angular.copy(vm.snippet)) - .result.then(function (snippet) { - $rootScope.$broadcast('snippetUpdated', snippet) - }, function () { - console.log('edit snippet modal dismissed') - }) + .then(function (snippet) { + console.log('edited', snippet) + }, function () { + console.log('edit snippet modal dismissed') + }) }) $scope.$on('snippetUpdated', function (e, snippet) { diff --git a/src/browser/main/controllers/states/SnippetsListController.js b/src/browser/main/controllers/states/SnippetsListController.js index 3b3f5163..384ccb32 100644 --- a/src/browser/main/controllers/states/SnippetsListController.js +++ b/src/browser/main/controllers/states/SnippetsListController.js @@ -1,10 +1,8 @@ /* global angular */ angular.module('codexen') - .controller('SnippetsListController', function ($auth, Snippet, $scope, $state, $scope, $filter, mySnippets, User) { + .controller('SnippetsListController', function ($auth, Snippet, $scope, $state, $filter, mySnippets, User) { var vm = this - vm.isLoading = false - vm.snippetId = parseInt($state.params.id) vm.snippets = mySnippets @@ -33,14 +31,13 @@ angular.module('codexen') $scope.$on('$stateChangeSuccess', function (e, toState, toParams) { if (!toState.name.match(/snippets/)) return null - vm.snippetId = parseInt(toParams.id) + vm.snippetId = parseInt(toParams.id, 10) if (!vm.snippetId && vm.filtered[0]) { $state.go('snippets.detail', {id: vm.filtered[0].id}) } }) - $scope.$on('snippetUpdated', function (e, snippet) { if (!mySnippets.some(function (_snippet, index) { if (_snippet.id === snippet.id) { @@ -57,7 +54,7 @@ angular.module('codexen') $scope.$on('snippetDeleted', function () { if ($state.is('snippets.detail')) { - var currentSnippetId = parseInt($state.params.id) + var currentSnippetId = parseInt($state.params.id, 10) // Delete snippet from snippet list for (var i = 0; i < vm.snippets.length; i++) { if (vm.snippets[i].id === currentSnippetId) { @@ -67,10 +64,10 @@ angular.module('codexen') } // Delete snippet from `filtered list` // And redirect `next filtered snippet` - for (var i = 0; i < vm.filtered.length; i++) { + for (i = 0; i < vm.filtered.length; i++) { if (vm.filtered[i].id === currentSnippetId) { - if (vm.filtered[i+1] != null) $state.go('snippets.detail', {id: vm.filtered[i+1].id}) - else if (vm.filtered[i-1] != null) $state.go('snippets.detail', {id: vm.filtered[i-1].id}) + if (vm.filtered[i + 1] != null) $state.go('snippets.detail', {id: vm.filtered[i + 1].id}) + else if (vm.filtered[i - 1] != null) $state.go('snippets.detail', {id: vm.filtered[i - 1].id}) else $state.go('snippets') vm.filtered.splice(i, 1) @@ -100,7 +97,7 @@ angular.module('codexen') } } - function searchSnippets() { + function searchSnippets () { vm.filtered = $filter('searchSnippets')(mySnippets, vm.search) if (vm.search && vm.filtered[0] && (!vm.snippetId || vm.snippetId !== vm.filtered[0].id)) { $state.go('snippets.detail', {id: vm.filtered[0].id}) diff --git a/src/browser/main/directives/btn-delete-recipe.js b/src/browser/main/directives/btn-delete-recipe.js new file mode 100644 index 00000000..78d6683f --- /dev/null +++ b/src/browser/main/directives/btn-delete-recipe.js @@ -0,0 +1,19 @@ +/* global angular */ +angular.module('codexen') + .directive('btnDeleteRecipe', function (Modal, $rootScope) { + return { + scope: { + recipe: '=btnDeleteRecipe' + }, + link: function (scope, el) { + el.on('click', function () { + Modal.deleteRecipe(scope.recipe) + .then(function (recipe) { + console.log('deleted', recipe) + }, function () { + console.log('delete snippet modal dismissed') + }) + }) + } + } + }) diff --git a/src/browser/main/directives/btn-edit-recipe.js b/src/browser/main/directives/btn-edit-recipe.js new file mode 100644 index 00000000..db3149ae --- /dev/null +++ b/src/browser/main/directives/btn-edit-recipe.js @@ -0,0 +1,14 @@ +/* global angular */ +angular.module('codexen') + .directive('btnEditRecipe', function (Modal) { + return { + scope: { + recipe: '=btnEditRecipe' + }, + link: function (scope, el) { + el.on('click', function () { + Modal.editRecipe(angular.copy(scope.recipe)) + }) + } + } + }) diff --git a/src/browser/main/directives/btn-edit-snippet.js b/src/browser/main/directives/btn-edit-snippet.js index 8fdd45d8..20467fc4 100644 --- a/src/browser/main/directives/btn-edit-snippet.js +++ b/src/browser/main/directives/btn-edit-snippet.js @@ -1,6 +1,6 @@ /* global angular */ angular.module('codexen') - .directive('btnEditSnippet', function (Modal, $rootScope) { + .directive('btnEditSnippet', function (Modal) { return { scope: { snippet: '=btnEditSnippet' @@ -8,11 +8,6 @@ angular.module('codexen') link: function (scope, el) { el.on('click', function () { Modal.editSnippet(angular.copy(scope.snippet)) - .result.then(function (snippet) { - $rootScope.$broadcast('snippetUpdated', snippet) - }, function () { - console.log('edit snippet modal dismissed') - }) }) } } diff --git a/src/browser/main/directives/btn-new-recipe.js b/src/browser/main/directives/btn-new-recipe.js new file mode 100644 index 00000000..c40bac8e --- /dev/null +++ b/src/browser/main/directives/btn-new-recipe.js @@ -0,0 +1,12 @@ +/* global angular */ +angular.module('codexen') + .directive('btnNewRecipe', function (Modal) { + return { + restrict: 'A', + link: function (scope, el) { + el.on('click', function () { + Modal.newRecipe() + }) + } + } + }) diff --git a/src/browser/main/directives/btn-new-snippet.js b/src/browser/main/directives/btn-new-snippet.js index 0638ffbf..c47c09e8 100644 --- a/src/browser/main/directives/btn-new-snippet.js +++ b/src/browser/main/directives/btn-new-snippet.js @@ -5,11 +5,6 @@ angular.module('codexen') link: function (scope, el) { el.on('click', function () { Modal.newSnippet() - .result.then(function (snippet) { - $rootScope.$broadcast('snippetUpdated', snippet) - }, function () { - console.log('new snippet modal dismissed') - }) }) } } diff --git a/src/browser/main/directives/recipe-item.js b/src/browser/main/directives/recipe-item.js new file mode 100644 index 00000000..32c42f1d --- /dev/null +++ b/src/browser/main/directives/recipe-item.js @@ -0,0 +1,19 @@ +/* global angular */ +angular.module('codexen') + .directive('recipeItem', function (Modal, $rootScope) { + return { + restrict: 'A', + transclude: true, + template: '
', + scope: { + recipe: '=recipeItem' + }, + link: function (scope, elem) { + scope.$on('taggingRequested', function (e) { + e.stopPropagation() + e.preventDefault() + Modal.editRecipe(angular.copy(scope.recipe)) + }) + } + } + }) diff --git a/src/browser/main/directives/snippet-item.js b/src/browser/main/directives/snippet-item.js index 359ae29c..823c3941 100644 --- a/src/browser/main/directives/snippet-item.js +++ b/src/browser/main/directives/snippet-item.js @@ -13,11 +13,6 @@ angular.module('codexen') e.stopPropagation() e.preventDefault() Modal.editSnippet(angular.copy(scope.snippet)) - .result.then(function (snippet) { - $rootScope.$broadcast('snippetUpdated', snippet) - }, function () { - console.log('edit snippet modal dismissed') - }) }) } } diff --git a/src/browser/main/index.html b/src/browser/main/index.html index 0a1985d4..66debe59 100644 --- a/src/browser/main/index.html +++ b/src/browser/main/index.html @@ -33,34 +33,46 @@ + - + + + + + + + + + + + + + + + - - - diff --git a/src/browser/main/index.inject.html b/src/browser/main/index.inject.html index 9d428b34..ab66192d 100644 --- a/src/browser/main/index.inject.html +++ b/src/browser/main/index.inject.html @@ -31,6 +31,7 @@ + diff --git a/src/browser/main/services/Marked.js b/src/browser/main/services/Marked.js new file mode 100644 index 00000000..7f3c6422 --- /dev/null +++ b/src/browser/main/services/Marked.js @@ -0,0 +1,18 @@ +/* global angular marked*/ +angular.module('codexen') + .filter('marked', function () { + marked.setOptions({ + renderer: new marked.Renderer(), + gfm: true, + tables: true, + breaks: false, + pedantic: false, + sanitize: true, + smartLists: true, + smartypants: false + }) + + return function(input) { + return marked(input) + } + }) diff --git a/src/browser/main/services/Modal.js b/src/browser/main/services/Modal.js index 43cab180..c4eb1dc3 100644 --- a/src/browser/main/services/Modal.js +++ b/src/browser/main/services/Modal.js @@ -1,10 +1,51 @@ /* global angular */ angular.module('codexen') - .factory('Modal', function ($modal) { + .factory('Modal', function ($modal, $rootScope) { + /* Recipe */ + var newRecipe = function () { + return $modal.open({ + templateUrl: 'tpls/modals/new-recipe-modal.html', + controller: 'NewRecipeModalController as vm' + }).result.then(function (recipe) { + $rootScope.$broadcast('recipeUpdated', recipe) + }) + } + + var editRecipe = function (recipe) { + return $modal.open({ + resolve: { + recipe: function () { + return recipe + } + }, + templateUrl: 'tpls/modals/edit-recipe-modal.html', + controller: 'EditRecipeModalController as vm' + }).result.then(function (recipe) { + $rootScope.$broadcast('recipeUpdated', recipe) + }) + } + + var deleteRecipe = function (recipe) { + return $modal.open({ + resolve: { + recipe: function () { + return recipe + } + }, + templateUrl: 'tpls/modals/delete-recipe-modal.html', + controller: 'DeleteRecipeModalController as vm' + }).result.then(function (recipe) { + $rootScope.$broadcast('recipeDeleted', recipe) + }) + } + + /* Snippet */ var newSnippet = function () { return $modal.open({ templateUrl: 'tpls/modals/new-snippet-modal.tpl.html', controller: 'NewSnippetModalController as vm' + }).result.then(function (snippet) { + $rootScope.$broadcast('snippetUpdated', snippet) }) } @@ -17,6 +58,8 @@ angular.module('codexen') }, templateUrl: 'tpls/modals/edit-snippet-modal.tpl.html', controller: 'EditSnippetModalController as vm' + }).result.then(function (snippet) { + $rootScope.$broadcast('snippetUpdated', snippet) }) } @@ -29,10 +72,15 @@ angular.module('codexen') }, templateUrl: 'tpls/modals/delete-snippet-modal.tpl.html', controller: 'DeleteSnippetModalController as vm' + }).result.then(function (snippet) { + $rootScope.$broadcast('snippetDeleted', snippet) }) } return { + newRecipe: newRecipe, + editRecipe: editRecipe, + deleteRecipe: deleteRecipe, newSnippet: newSnippet, editSnippet: editSnippet, deleteSnippet: deleteSnippet diff --git a/src/browser/main/services/Recipe.js b/src/browser/main/services/Recipe.js new file mode 100644 index 00000000..46b1a225 --- /dev/null +++ b/src/browser/main/services/Recipe.js @@ -0,0 +1,52 @@ +/* global angular */ +angular.module('codexen') + .factory('Recipe', function ($http, $auth, apiUrl) { + var findByUser = function (user) { + var url = apiUrl + 'recipes/search' + + return $http.get(url, { + params: { + user: user + } + }) + } + + var findMine = function (params) { + var url = apiUrl + 'recipes/my' + + return $http.get(url, {params: params}) + } + + var create = function (params) { + var url = apiUrl + 'recipes/create' + + return $http.post(url, params) + } + + var show = function (id, params) { + var url = apiUrl + 'recipes/id/' + id + + return $http.get(url, {params: params}) + } + + var update = function (id, params) { + var url = apiUrl + 'recipes/id/' + id + + return $http.put(url, params) + } + + var destroy = function (id) { + var url = apiUrl + 'recipes/id/' + id + + return $http.delete(url) + } + + return { + findByUser: findByUser, + findMine: findMine, + create: create, + show: show, + delete: destroy, + update: update + } + }) diff --git a/src/browser/main/styles/app.css b/src/browser/main/styles/app.css index 2f40598e..71f3d459 100644 --- a/src/browser/main/styles/app.css +++ b/src/browser/main/styles/app.css @@ -2,17 +2,43 @@ height: 200px; } #side-view .nav-control-group { - margin: 0 5px; + margin: auto 10px; +} +#side-view .new-block { + margin: 20px auto; +} +#side-view .new-block button { + padding: 10px inherit; +} +#side-view .new-block button:nth-child(1) { + width: 147px; + padding-left: 15px; + text-align: left; +} +#side-view .new-block button:nth-child(2) { + width: 33px; +} +#side-view .new-block .success-menu { + background-color: #167b59; +} +#side-view .new-block .success-menu a { + padding: 5px 15px; + color: #fff; +} +#side-view .new-block .success-menu a.hover, +#side-view .new-block .success-menu a:hover { + background-color: #22bd89; +} +#side-view .new-block .success-menu a.focus, +#side-view .new-block .success-menu a:focus { + background-color: #20b482; } #side-view ul.nav.nav-pills { margin-top: 10px; } -#side-view ul.nav.nav-pills li hr { - margin: 5px 0; - border-top: none; - border-bottom: solid 1px #001a20; -} #side-view ul.nav.nav-pills li a { + padding: 12px 15px; + margin-bottom: 7px; border-top-right-radius: 0; border-bottom-right-radius: 0; -webkit-transition: 0.2s; diff --git a/src/browser/main/styles/directives/side-nav.styl b/src/browser/main/styles/directives/side-nav.styl index 5bfe6797..f6624cf7 100644 --- a/src/browser/main/styles/directives/side-nav.styl +++ b/src/browser/main/styles/directives/side-nav.styl @@ -1,14 +1,31 @@ #side-view .nav-control-group - margin 0 5px + margin auto 10px + .new-block + margin 20px auto + button + padding 10px inherit + button:nth-child(1) + width 147px + padding-left 15px + text-align left + button:nth-child(2) + width 33px + .success-menu + background-color darken($brand-success, 35%) + a + padding 5px 15px + color $textColorSelected + &.hover, &:hover + background-color $brand-success + &.focus, &:focus + background-color darken($brand-success, 5%) + ul.nav.nav-pills margin-top 10px - li hr - margin: 5px 0 - border-top none - border-bottom solid 1px $baseBorderColor - li a + padding 12px 15px + margin-bottom 7px border-top-right-radius 0 border-bottom-right-radius 0 transition 0.2s diff --git a/src/browser/main/tpls/directives/side-nav.tpl.html b/src/browser/main/tpls/directives/side-nav.tpl.html index d0dc9046..e7fa9b34 100644 --- a/src/browser/main/tpls/directives/side-nav.tpl.html +++ b/src/browser/main/tpls/directives/side-nav.tpl.html @@ -3,7 +3,7 @@+ Are you sure to delete it? +
++ Snippets of this recipe will not be removed. ++
App for Code snippets
+ +
+