sunrise-core 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/README.rdoc +2 -2
  2. data/app/controllers/manage/assets_controller.rb +2 -2
  3. data/app/views/layouts/manage.html.erb +4 -5
  4. data/app/views/manage/{assets/_picture.html.erb → fileupload/_asset.html.erb} +4 -3
  5. data/app/views/manage/fileupload/_container.html.erb +25 -0
  6. data/app/views/manage/fileupload/_tmpl.html.erb +14 -0
  7. data/app/views/manage/users/_form.html.erb +5 -1
  8. data/app/views/manage/users/_model_filter.html.erb +5 -3
  9. data/config/locales/manage/en.yml +5 -0
  10. data/config/locales/manage/ru.yml +5 -0
  11. data/config/locales/manage/uk.yml +5 -0
  12. data/lib/generators/sunrise/install_generator.rb +26 -6
  13. data/lib/generators/sunrise/templates/helpers/manage/assets_helper.rb +0 -14
  14. data/lib/generators/sunrise/templates/javascripts/manage-fileuploader.js +182 -0
  15. data/lib/generators/sunrise/templates/javascripts/manage.js +17 -13
  16. data/lib/generators/sunrise/templates/models/defaults/user.rb +1 -5
  17. data/lib/generators/sunrise/templates/stylesheets/manage/buttons.css +42 -0
  18. data/lib/generators/sunrise/templates/stylesheets/manage/main.css +11 -0
  19. data/lib/generators/sunrise/templates/stylesheets/smoothness/{jquery-ui-1.8.6.custom.css → jquery-ui-1.8.13.custom.css} +37 -31
  20. data/lib/sunrise/engine.rb +5 -0
  21. data/lib/sunrise/models/asset.rb +1 -1
  22. data/lib/sunrise/version.rb +1 -1
  23. data/lib/sunrise/views/form_builder.rb +53 -6
  24. metadata +56 -43
  25. data/app/views/manage/assets/_collection.html.erb +0 -32
  26. data/app/views/manage/assets/_swfscript.html.erb +0 -51
  27. data/lib/generators/sunrise/templates/javascripts/swfupload/fileprogress.js +0 -114
  28. data/lib/generators/sunrise/templates/javascripts/swfupload/handlers.js +0 -164
  29. data/lib/generators/sunrise/templates/javascripts/swfupload/swfupload.js +0 -1134
  30. data/lib/generators/sunrise/templates/javascripts/swfupload/swfupload.queue.js +0 -98
  31. data/lib/generators/sunrise/templates/javascripts/swfupload/swfupload.swf +0 -0
data/README.rdoc CHANGED
@@ -33,9 +33,9 @@ Generate simple_form configurations:
33
33
 
34
34
  rails generate simple_form:install
35
35
 
36
- Generate attach_file_field assets:
36
+ Generate file uploads assets:
37
37
 
38
- rails generate attach_file_field
38
+ rails generate sunrise:file_upload:install
39
39
 
40
40
  Migrate database:
41
41
 
@@ -31,7 +31,7 @@ class Manage::AssetsController < Manage::BaseController
31
31
  end
32
32
 
33
33
  def sort
34
- params[:picture].each_with_index do |id, index|
34
+ params[:asset].each_with_index do |id, index|
35
35
  @klass.move_to(index, id)
36
36
  end
37
37
 
@@ -64,7 +64,7 @@ class Manage::AssetsController < Manage::BaseController
64
64
  @klass = params[:klass].blank? ? Asset : params[:klass].classify.constantize
65
65
 
66
66
  if params[:collection].blank?
67
- @asset = @klass.find(:first, :conditions=>[c_names.join(' AND ')] + c_values)
67
+ @asset = @klass.where([c_names.join(' AND ')] + c_values).first
68
68
  end
69
69
  end
70
70
  end
@@ -4,23 +4,21 @@
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
5
  <%= csrf_meta_tag %>
6
6
  <title><%= t('manage.page_title') %></title>
7
- <%= stylesheet_link_tag "manage/main", "fancybox/jquery.fancybox-1.3.4" %>
8
- <%= stylesheet_link_tag "smoothness/jquery-ui-1.8.6.custom" %>
7
+ <%= stylesheet_link_tag "manage/main", "manage/buttons", "fancybox/jquery.fancybox-1.3.4" %>
8
+ <%= stylesheet_link_tag "smoothness/jquery-ui-1.8.13.custom" %>
9
9
  <!--[if lt IE 7]><%= stylesheet_link_tag "manage/ie" %><![endif]-->
10
10
 
11
11
  <script src="https://www.google.com/jsapi?key=" type="text/javascript"></script>
12
12
  <script language="Javascript" type="text/javascript">
13
13
  //<![CDATA[
14
14
  google.load("jquery", "1.5.1");
15
- google.load("jqueryui", "1.8.6");
16
- google.load("swfobject", "2.2");
15
+ google.load("jqueryui", "1.8.13");
17
16
  //]]>
18
17
  </script>
19
18
 
20
19
  <%= javascript_include_tag "jquery.tmpl.min", "jquery.fancybox-1.3.4.pack", "jquery.cookie" %>
21
20
  <%= javascript_include_tag "jquery-ui-timepicker-addon", "datepicker/jquery.ui.datepicker-#{I18n.locale}" %>
22
21
  <%= javascript_include_tag :ckeditor, "preloader", "rails", "manage" %>
23
- <%= attach_include_files %>
24
22
  <%= yield(:head)%>
25
23
  </head>
26
24
  <body>
@@ -36,5 +34,6 @@
36
34
  </div>
37
35
  </div>
38
36
  <%= yield(:footer) %>
37
+ <%= render :partial => 'manage/fileupload/tmpl' %>
39
38
  </body>
40
39
  </html>
@@ -1,10 +1,11 @@
1
- <%= content_tag(:div, :class=>"asset ill", :id => dom_id(picture)) do %>
1
+ <%= content_tag(:div, :class => "asset ill", :id => "asset_#{asset.id}") do %>
2
2
  <%= link_to image_tag("manage/empty.gif", :alt=>t('manage.delete'), :title=>t('manage.delete')),
3
- manage_asset_path(picture),
3
+ manage_asset_path(asset),
4
4
  :remote => true,
5
5
  :method => :delete,
6
6
  :confirm => t('manage.confirm_delete'),
7
7
  :class => "del" %>
8
8
 
9
- <%= link_to image_tag(picture.url(:thumb), :title => picture.filename), picture.url(:content), :class => "fancybox" %>
9
+ <%= link_to image_tag(asset.url(:thumb), :title => asset.filename, :width => 80, :height => 80),
10
+ asset.url, :class => "fancybox" %>
10
11
  <% end %>
@@ -0,0 +1,25 @@
1
+ <%= content_tag(:div, :class => 'fileupload', :id => element_id) do %>
2
+ <div class="gray-blocks">
3
+ <div class="bg-bl">
4
+ <div class="gr-title"><%= label %></div>
5
+ <div class="fileupload-list ill-bl galery">
6
+ <%= render :partial => 'manage/fileupload/asset', :collection => assets %>
7
+ </div>
8
+ <div class="file-types">
9
+ <span class="fileupload-button">
10
+ <button type="button" class="cupid-green"><%= t('manage.fileupload.button') %></button>
11
+ </span>
12
+ <div class="type-info">
13
+ <span><%= file_title %>. <%= t('manage.fileupload.max_size') %>:</span><strong><%= file_max_size %> MB</strong>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </div>
18
+ <% end %>
19
+
20
+ <%= javascript_tag :language => "Javascript" do -%>
21
+ $(document).ready(function(){
22
+ new qq.FileUploaderInput(<%=raw script_options %>);
23
+ Manage.init_assets('<%= element_id %>', '<%= sort_manage_assets_path(:klass=>asset_klass) %>', <%= multiple ? 'true' : 'false' %>);
24
+ });
25
+ <% end -%>
@@ -0,0 +1,14 @@
1
+ <script id="fileupload_tmpl" type="text/x-jquery-tmpl">
2
+ <div class="asset ill" id="asset_${id}">
3
+ <%= link_to image_tag("manage/empty.gif", :alt=>t('manage.delete'), :title=>t('manage.delete')),
4
+ "/manage/assets/${id}",
5
+ :remote => true,
6
+ :method => :delete,
7
+ :confirm => t('manage.confirm_delete'),
8
+ :class => "fileupload-cancel del" %>
9
+
10
+ <a href="${url}" class="fileupload-file fancybox">
11
+ <img width="80" height="80" src="${thumb_url}" title="${filename}">
12
+ </a>
13
+ </div>
14
+ </script>
@@ -1,3 +1,5 @@
1
+ <% javascript "fileupload/fileuploader.js", "manage-fileuploader.js" %>
2
+
1
3
  <%= manage_form_for @user do |f| %>
2
4
  <div class="edit-cont">
3
5
  <div class="inputs-bl">
@@ -8,7 +10,9 @@
8
10
  <%= f.input :role_type_id, :collection => RoleType.all %>
9
11
  </div>
10
12
 
11
- <%= f.attach_file_field :avatar, :input_html => { :file_max_size => 1 } %>
13
+ <%= f.attach_file_field :avatar, :file_max_size => 1 %>
14
+
15
+ <%= f.hidden_field :fileupload_guid if f.object.new_record? %>
12
16
  </div>
13
17
 
14
18
  <%= f.button :submit %>
@@ -3,7 +3,7 @@
3
3
  <%= link_to_function t('manage.model_filter.title'), "Manage.toggle_element('block_filter')", :class=>"dark-arr" %>
4
4
 
5
5
  <%= cookie_content_tag(:div, :id=>"block_filter", :class=>"filt") do %>
6
- <%= form_for @search, :as => :search, :url=>manage_users_path, :html=>{:method=>:get, :id=>"form_filter"} do |f| %>
6
+ <%= form_for @search, :as => :search, :url=>manage_users_path, :html=>{:method=>:get} do |f| %>
7
7
  <%= f.label :email, t('activerecord.attributes.user.email') %>
8
8
  <%= f.text_field :email, :class=>"text" %>
9
9
 
@@ -11,8 +11,10 @@
11
11
  <%= f.text_field :name, :class=>"text" %>
12
12
 
13
13
  <div class="buts">
14
- <%= f.submit t('manage.model_filter.search'), :style=>"display:none;" %>
15
- <%= link_to_function content_tag(:span, t('manage.model_filter.search')), "$('#form_filter').submit()", :class=>"gr" %>
14
+ <%= content_tag(:button, :value => "search", :type => "submit", :name => "commit", :class => "gr cupid-green") do %>
15
+ <%= t('manage.model_filter.search') %>
16
+ <% end %>
17
+
16
18
  <%= link_to t('manage.model_filter.clear'), manage_users_path, :class=>"erase" %>
17
19
  </div>
18
20
  <% end %>
@@ -11,6 +11,7 @@ en:
11
11
  city_name: "City"
12
12
  about: "About"
13
13
  remember_me: "Remember me"
14
+ role_type_id: "Role type"
14
15
 
15
16
  structure:
16
17
  title: "Name"
@@ -213,6 +214,10 @@ en:
213
214
  position_asc: "for the position of the ascending"
214
215
  sort_order_desc: "to sort in descending order"
215
216
  sort_order_asc: "to sort in ascending order"
217
+
218
+ fileupload:
219
+ button: "Select file"
220
+ max_size: "Max size"
216
221
 
217
222
  flash:
218
223
  manage:
@@ -11,6 +11,7 @@ ru:
11
11
  city_name: "Город"
12
12
  about: "О себе"
13
13
  remember_me: "Запомнить меня"
14
+ role_type_id: "Тип пользователя"
14
15
 
15
16
  structure:
16
17
  title: "Название"
@@ -213,6 +214,10 @@ ru:
213
214
  position_asc: "за позицией по возрастанию"
214
215
  sort_order_desc: "по сортировке по убыванию"
215
216
  sort_order_asc: "по сортировке по возрастанию"
217
+
218
+ fileupload:
219
+ button: "Выберите файл"
220
+ max_size: "Макс. р."
216
221
 
217
222
  flash:
218
223
  manage:
@@ -11,6 +11,7 @@ uk:
11
11
  city_name: "Місто"
12
12
  about: "Про себе"
13
13
  remember_me: "Запам'ятати мене"
14
+ role_type_id: "Тип користувача"
14
15
 
15
16
  structure:
16
17
  title: "Назва"
@@ -213,6 +214,10 @@ uk:
213
214
  position_asc: "за позицією за зростанням"
214
215
  sort_order_desc: "по сортуванню за спаданням"
215
216
  sort_order_asc: "по сортуванню за зростанням"
217
+
218
+ fileupload:
219
+ button: "Оберіть файл"
220
+ max_size: "Макс. р."
216
221
 
217
222
  flash:
218
223
  manage:
@@ -59,12 +59,6 @@ module Sunrise
59
59
  get "https://github.com/rails/jquery-ujs/raw/master/src/rails.js", "public/javascripts/rails.js"
60
60
  end
61
61
 
62
- # Add devise routes
63
- def add_routes
64
- route "devise_for :users"
65
- route "resources :pages, :only => [:show]"
66
- end
67
-
68
62
  # copy migration files
69
63
  def create_migrations
70
64
  if options.migrations
@@ -74,6 +68,32 @@ module Sunrise
74
68
  end
75
69
  end
76
70
 
71
+ def dependent_generators
72
+ say_status("invoke dependent generators", "", :green)
73
+
74
+ generate("simple_form:install")
75
+ generate("sunrise:file_upload:install")
76
+ generate("devise:install")
77
+ end
78
+
79
+ # Add devise routes
80
+ def add_routes
81
+ route "devise_for :users"
82
+ route "resources :pages, :only => [:show]"
83
+ route 'root :to => "welcome#index"'
84
+ end
85
+
86
+ def autoload_paths
87
+ log :autoload_paths, "models/defaults and app/sweepers"
88
+ sentinel = /\.autoload_paths\s+\+=\s+\%W\(\#\{config\.root\}\/extras\)\s*$/
89
+
90
+ code = 'config.autoload_paths += %W(#{config.root}/app/models/defaults #{config.root}/app/sweepers)'
91
+
92
+ in_root do
93
+ inject_into_file 'config/application.rb', " #{code}\n", { :after => sentinel, :verbose => false }
94
+ end
95
+ end
96
+
77
97
  def self.next_migration_number(dirname)
78
98
  if ActiveRecord::Base.timestamped_migrations
79
99
  current_time.utc.strftime("%Y%m%d%H%M%S")
@@ -1,16 +1,2 @@
1
1
  module Manage::AssetsHelper
2
-
3
- def manage_assets_path_with_session_information(klass = 'Asset', options = {})
4
- options = { :format => :xml, :protocol => "http://" }.merge(options)
5
- session_key = Rails.application.config.send(:session_options)[:key]
6
-
7
- options[session_key] = Rack::Utils.escape(cookies[session_key])
8
- options[:klass] = klass
9
-
10
- if protect_against_forgery?
11
- options[request_forgery_protection_token] = Rack::Utils.escape(form_authenticity_token)
12
- end
13
-
14
- manage_assets_url(options)
15
- end
16
2
  end
@@ -0,0 +1,182 @@
1
+ // Collection of all instances on page
2
+ qq.FileUploader.instances = new Object();
3
+
4
+ /**
5
+ * Class that creates upload widget with drag-and-drop and file list
6
+ * @inherits qq.FileUploaderBasic
7
+ */
8
+ qq.FileUploaderInput = function(o){
9
+ // call parent constructor
10
+ qq.FileUploaderBasic.apply(this, arguments);
11
+
12
+ // additional options
13
+ qq.extend(this._options, {
14
+ element: null,
15
+ // if set, will be used instead of qq-upload-list in template
16
+ listElement: null,
17
+
18
+ template_id: '#fileupload_tmpl',
19
+
20
+ classes: {
21
+ // used to get elements from templates
22
+ button: 'fileupload-button',
23
+ drop: 'fileupload-drop-area',
24
+ dropActive: 'fileupload-drop-area-active',
25
+ list: 'fileupload-list',
26
+ preview: 'fileupload-preview',
27
+
28
+ file: 'fileupload-file',
29
+ spinner: 'fileupload-spinner',
30
+ size: 'fileupload-size',
31
+ cancel: 'fileupload-cancel',
32
+
33
+ // added to list item when upload completes
34
+ // used in css to hide progress spinner
35
+ success: 'fileupload-success',
36
+ fail: 'fileupload-fail'
37
+ }
38
+ });
39
+ // overwrite options with user supplied
40
+ qq.extend(this._options, o);
41
+
42
+ this._element = document.getElementById(this._options.element);
43
+ this._listElement = this._options.listElement || this._find(this._element, 'list');
44
+
45
+ this._classes = this._options.classes;
46
+
47
+ this._button = this._createUploadButton(this._find(this._element, 'button'));
48
+
49
+ //this._setupDragDrop();
50
+
51
+ qq.FileUploader.instances[this._element.id] = this;
52
+ };
53
+
54
+ // inherit from Basic Uploader
55
+ qq.extend(qq.FileUploaderInput.prototype, qq.FileUploaderBasic.prototype);
56
+
57
+ qq.extend(qq.FileUploaderInput.prototype, {
58
+ /**
59
+ * Gets one of the elements listed in this._options.classes
60
+ **/
61
+ _find: function(parent, type){
62
+ var element = qq.getByClass(parent, this._options.classes[type])[0];
63
+ if (!element){
64
+ throw new Error('element not found ' + type);
65
+ }
66
+
67
+ return element;
68
+ },
69
+ _setupDragDrop: function(){
70
+ var self = this,
71
+ dropArea = this._find(this._element, 'drop');
72
+
73
+ var dz = new qq.UploadDropZone({
74
+ element: dropArea,
75
+ onEnter: function(e){
76
+ qq.addClass(dropArea, self._classes.dropActive);
77
+ e.stopPropagation();
78
+ },
79
+ onLeave: function(e){
80
+ e.stopPropagation();
81
+ },
82
+ onLeaveNotDescendants: function(e){
83
+ qq.removeClass(dropArea, self._classes.dropActive);
84
+ },
85
+ onDrop: function(e){
86
+ dropArea.style.display = 'none';
87
+ qq.removeClass(dropArea, self._classes.dropActive);
88
+ self._uploadFileList(e.dataTransfer.files);
89
+ }
90
+ });
91
+
92
+ dropArea.style.display = 'none';
93
+
94
+ qq.attach(document, 'dragenter', function(e){
95
+ if (!dz._isValidFileDrag(e)) return;
96
+
97
+ dropArea.style.display = 'block';
98
+ });
99
+ qq.attach(document, 'dragleave', function(e){
100
+ if (!dz._isValidFileDrag(e)) return;
101
+
102
+ var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);
103
+ // only fire when leaving document out
104
+ if ( ! relatedTarget || relatedTarget.nodeName == "HTML"){
105
+ dropArea.style.display = 'none';
106
+ }
107
+ });
108
+ },
109
+ _onSubmit: function(id, fileName){
110
+ qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments);
111
+ this._addToList(id, fileName);
112
+ },
113
+ _onProgress: function(id, fileName, loaded, total){
114
+ qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments);
115
+
116
+ /*var item = this._getItemByFileId(id);
117
+ var size = this._find(item, 'size');
118
+ size.style.display = 'inline';
119
+
120
+ var text;
121
+ if (loaded != total){
122
+ text = Math.round(loaded / total * 100) + '% from ' + this._formatSize(total);
123
+ } else {
124
+ text = this._formatSize(total);
125
+ }
126
+
127
+ qq.setText(size, text);*/
128
+ },
129
+ _onComplete: function(id, fileName, result){
130
+ qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments);
131
+
132
+ var item = this._getItemByFileId(id);
133
+ var asset = result.asset;
134
+
135
+ // mark completed
136
+ //qq.remove(this._find(item, 'cancel'));
137
+ //qq.remove(this._find(item, 'spinner'));
138
+
139
+ if (asset && asset.id){
140
+ qq.addClass(item, this._classes.success);
141
+
142
+ $(item).replaceWith( $(this._options.template_id).tmpl(asset) );
143
+ } else {
144
+ qq.addClass(item, this._classes.fail);
145
+ }
146
+ },
147
+ _addToList: function(id, fileName){
148
+ if (this._listElement) {
149
+ if (this._options.multiple === false) {
150
+ $(this._listElement).empty();
151
+ }
152
+
153
+ var asset = {id: 0, filename: this._formatFileName(fileName),
154
+ url: "#",
155
+ thumb_url: "/images/manage/preloader.gif"};
156
+
157
+ var item = $(this._options.template_id)
158
+ .tmpl(asset)
159
+ .attr('qqfileid', id)
160
+ .appendTo( this._listElement );
161
+
162
+ this._bindCancelEvent(item);
163
+ }
164
+ },
165
+ _getItemByFileId: function(id){
166
+ return $(this._listElement).find('div[qqfileid=' + id +']').get(0);
167
+ },
168
+ /**
169
+ * delegate click event for cancel link
170
+ **/
171
+ _bindCancelEvent: function(element){
172
+ var self = this,
173
+ item = $(element);
174
+
175
+ item.find('a.' + this._classes.cancel).bind('click', function(e){
176
+ self._handler.cancel( item.attr('qqfileid') );
177
+ item.remove();
178
+ qq.preventDefault(e);
179
+ return false;
180
+ });
181
+ }
182
+ });
@@ -85,8 +85,10 @@ var Manage = {
85
85
  }
86
86
  },
87
87
 
88
- init_assets: function(query, url)
88
+ init_assets: function(element_id, url, sortable)
89
89
  {
90
+ var query = '#' + element_id + ' div.galery';
91
+
90
92
  $(query + " a.fancybox").fancybox({
91
93
  'titleShow' : false,
92
94
  'transitionIn' : 'none',
@@ -97,18 +99,20 @@ var Manage = {
97
99
  $(this).parents('div.asset').remove();
98
100
  });
99
101
 
100
- $(query).sortable({
101
- revert: true,
102
- update: function(event, ui){
103
- var data = $(query).sortable('serialize');
104
- $.ajax({
105
- url: url,
106
- data: data,
107
- dataType: 'script',
108
- type: 'POST'
109
- });
110
- }
111
- });
102
+ if (sortable) {
103
+ $(query).sortable({
104
+ revert: true,
105
+ update: function(event, ui){
106
+ var data = $(query).sortable('serialize');
107
+ $.ajax({
108
+ url: url,
109
+ data: data,
110
+ dataType: 'script',
111
+ type: 'POST'
112
+ });
113
+ }
114
+ });
115
+ }
112
116
  }
113
117
  };
114
118
 
@@ -43,9 +43,5 @@ class User < ActiveRecord::Base
43
43
  # Setup accessible (or protected) attributes for your model
44
44
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me
45
45
 
46
- # acts_as_attach_file :avatar
47
-
48
- def to_param
49
- "#{id}-#{login}"
50
- end
46
+ fileuploads :avatar
51
47
  end
@@ -0,0 +1,42 @@
1
+ /* cupid green (inspired by okcupid.com)
2
+ *******************************************************************************/
3
+ button.cupid-green {
4
+ background: #7fbf4d;
5
+ background: -moz-linear-gradient(top, #7fbf4d 0%, #63a62f 100%);
6
+ background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#7fbf4d), to(#63a62f));
7
+ border: 1px solid #63a62f;
8
+ border-bottom: 1px solid #5b992b;
9
+ -moz-border-radius: 3px;
10
+ -webkit-border-radius: 3px;
11
+ border-radius: 3px;
12
+ -moz-box-shadow: inset 0 1px 0 0 #96ca6d;
13
+ -webkit-box-shadow: inset 0 1px 0 0 #96ca6d;
14
+ box-shadow: inset 0 1px 0 0 #96ca6d;
15
+ color: #fff;
16
+ font-family: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
17
+ font-size: 11px;
18
+ font-weight: bold;
19
+ line-height: 1;
20
+ padding: 7px 0 8px 0;
21
+ text-align: center;
22
+ text-shadow: 0 -1px 0 #4c9021;
23
+ width: 120px;
24
+ }
25
+
26
+ button.cupid-green:hover {
27
+ background: #76b347;
28
+ background: -moz-linear-gradient(top, #76b347 0%, #5e9e2e 100%);
29
+ background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#76b347), to(#5e9e2e));
30
+ -moz-box-shadow: inset 0 1px 0 0 #8dbf67;
31
+ -webkit-box-shadow: inset 0 1px 0 0 #8dbf67;
32
+ box-shadow: inset 0 1px 0 0 #8dbf67;
33
+ cursor: pointer;
34
+ }
35
+
36
+ button.cupid-green:active {
37
+ border: 1px solid #5b992b;
38
+ border-bottom: 1px solid #538c27;
39
+ -moz-box-shadow: inset 0 0 8px 4px #548c29, 0 1px 0 0 #eee;
40
+ -webkit-box-shadow: inset 0 0 8px 4px #548c29, 0 1px 0 0 #eee;
41
+ box-shadow: inset 0 0 8px 4px #548c29, 0 1px 0 0 #eee;
42
+ }
@@ -464,6 +464,17 @@ input.text {
464
464
  display: block;
465
465
  line-height: 37px;
466
466
  }
467
+ .buts button.gr {
468
+ display: block;
469
+ float: left;
470
+ color: #fff;
471
+ text-decoration: none;
472
+ line-height: 37px;
473
+ font-size: 1.1em;
474
+ }
475
+ .controls {
476
+ padding: 20px 0px 10px 20px;
477
+ }
467
478
  .sort {
468
479
  display: block;
469
480
  overflow: hidden;