grandstand 0.2.4 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. data/MIT-LICENSE +1 -1
  2. data/README.markdown +43 -0
  3. data/README.txt +0 -0
  4. data/Rakefile +7 -1
  5. data/VERSION +1 -1
  6. data/app/controllers/galleries_controller.rb +2 -2
  7. data/app/controllers/{admin → grandstand}/galleries_controller.rb +9 -13
  8. data/app/controllers/{admin → grandstand}/images_controller.rb +6 -9
  9. data/app/controllers/{admin → grandstand}/main_controller.rb +8 -8
  10. data/app/controllers/{admin → grandstand}/pages_controller.rb +9 -9
  11. data/app/controllers/grandstand/posts_controller.rb +64 -0
  12. data/app/controllers/{admin → grandstand}/sessions_controller.rb +8 -8
  13. data/app/controllers/grandstand/templates_controller.rb +8 -0
  14. data/app/controllers/{admin → grandstand}/users_controller.rb +10 -10
  15. data/app/controllers/posts_controller.rb +1 -1
  16. data/app/helpers/galleries_helper.rb +2 -0
  17. data/app/helpers/grandstand/galleries_helper.rb +2 -0
  18. data/app/helpers/grandstand/images_helpers.rb +2 -0
  19. data/app/helpers/grandstand/main_helper.rb +74 -0
  20. data/app/helpers/grandstand/pages_helper.rb +2 -0
  21. data/app/helpers/grandstand/posts_helper.rb +2 -0
  22. data/app/helpers/grandstand/sessions_helper.rb +2 -0
  23. data/app/helpers/grandstand/templates_helper.rb +2 -0
  24. data/app/helpers/grandstand/users_helper.rb +2 -0
  25. data/app/models/{gallery.rb → grandstand/gallery.rb} +2 -2
  26. data/app/models/{image.rb → grandstand/image.rb} +10 -9
  27. data/app/models/{page.rb → grandstand/page.rb} +1 -1
  28. data/app/models/grandstand/page_section.rb +6 -0
  29. data/app/models/{post.rb → grandstand/post.rb} +14 -2
  30. data/app/models/{template.rb → grandstand/template.rb} +2 -2
  31. data/app/models/{user.rb → grandstand/user.rb} +1 -1
  32. data/app/stylesheets/application.less +103 -10
  33. data/app/stylesheets/global.less +47 -30
  34. data/app/stylesheets/login.less +1 -1
  35. data/app/stylesheets/wysiwyg.less +77 -65
  36. data/app/views/{admin → grandstand}/galleries/_form.html.erb +2 -2
  37. data/app/views/grandstand/galleries/_gallery.html.erb +16 -0
  38. data/app/views/grandstand/galleries/_list.html.erb +17 -0
  39. data/app/views/grandstand/galleries/delete.html.erb +8 -0
  40. data/app/views/grandstand/galleries/edit.html.erb +8 -0
  41. data/app/views/grandstand/galleries/editor.html.erb +33 -0
  42. data/app/views/grandstand/galleries/index.html.erb +14 -0
  43. data/app/views/grandstand/galleries/new.html.erb +8 -0
  44. data/app/views/grandstand/galleries/show.html.erb +19 -0
  45. data/app/views/{admin → grandstand}/images/_form.html.erb +2 -2
  46. data/app/views/grandstand/images/delete.html.erb +8 -0
  47. data/app/views/grandstand/images/edit.html.erb +8 -0
  48. data/app/views/grandstand/images/new.html.erb +8 -0
  49. data/app/views/grandstand/images/show.html.erb +33 -0
  50. data/app/views/{admin → grandstand}/images/upload.html.erb +2 -2
  51. data/app/views/grandstand/main/index.html.erb +10 -0
  52. data/app/views/{admin → grandstand}/pages/_form.html.erb +2 -2
  53. data/app/views/grandstand/pages/_left.html.erb +3 -0
  54. data/app/views/{admin → grandstand}/pages/_row.html.erb +3 -3
  55. data/app/views/{admin → grandstand}/pages/delete.html.erb +2 -2
  56. data/app/views/{admin → grandstand}/pages/edit.html.erb +2 -2
  57. data/app/views/{admin → grandstand}/pages/index.html.erb +1 -1
  58. data/app/views/{admin → grandstand}/pages/new.html.erb +2 -2
  59. data/app/views/{admin → grandstand}/pages/show.html.erb +1 -1
  60. data/app/views/grandstand/posts/_form.html.erb +15 -0
  61. data/app/views/grandstand/posts/_left.html.erb +3 -0
  62. data/app/views/grandstand/posts/_list.html.erb +26 -0
  63. data/app/views/{admin → grandstand}/posts/delete.html.erb +2 -2
  64. data/app/views/grandstand/posts/edit.html.erb +8 -0
  65. data/app/views/{admin → grandstand}/posts/index.html.erb +1 -1
  66. data/app/views/grandstand/posts/new.html.erb +8 -0
  67. data/app/views/grandstand/posts/preview.html.erb +9 -0
  68. data/app/views/grandstand/posts/show.html.erb +8 -0
  69. data/app/views/{admin → grandstand}/sessions/forgot.html.erb +2 -2
  70. data/app/views/{admin → grandstand}/sessions/show.html.erb +2 -2
  71. data/app/views/grandstand/shared/_flash.html.erb +3 -0
  72. data/app/views/{admin → grandstand}/users/_form.html.erb +2 -2
  73. data/app/views/grandstand/users/_left.html.erb +3 -0
  74. data/app/views/{admin → grandstand}/users/delete.html.erb +2 -2
  75. data/app/views/grandstand/users/edit.html.erb +8 -0
  76. data/app/views/{admin → grandstand}/users/index.html.erb +3 -3
  77. data/app/views/grandstand/users/new.html.erb +8 -0
  78. data/app/views/grandstand/users/show.html.erb +12 -0
  79. data/app/views/layouts/grandstand.html.erb +76 -0
  80. data/app/views/layouts/grandstand_login.html.erb +17 -0
  81. data/app/views/layouts/{admin_xhr.html.erb → grandstand_xhr.html.erb} +0 -0
  82. data/app/views/posts/show.html.erb +2 -2
  83. data/{lib/grandstand → config}/routes.rb +9 -7
  84. data/grandstand.gemspec +139 -122
  85. data/lib/grandstand.rb +50 -19
  86. data/lib/grandstand/application.rb +27 -35
  87. data/lib/grandstand/controller.rb +4 -6
  88. data/lib/grandstand/form_builder.rb +19 -0
  89. data/lib/grandstand/helper.rb +1 -47
  90. data/lib/grandstand/session.rb +2 -11
  91. data/lib/grandstand/stylesheets_controller.rb +14 -0
  92. data/public/{admin → grandstand}/images/background-input.gif +0 -0
  93. data/public/{admin → grandstand}/images/background-progress-bar.png +0 -0
  94. data/public/{admin → grandstand}/images/background-progress-complete.gif +0 -0
  95. data/public/{admin → grandstand}/images/background-progress.gif +0 -0
  96. data/public/grandstand/images/galleries-empty.png +0 -0
  97. data/public/{admin → grandstand}/images/icons/add.png +0 -0
  98. data/public/{admin → grandstand}/images/icons/collapse.png +0 -0
  99. data/public/{admin → grandstand}/images/icons/delete.png +0 -0
  100. data/public/{admin → grandstand}/images/icons/edit.png +0 -0
  101. data/public/{admin → grandstand}/images/icons/editor/bold.png +0 -0
  102. data/public/{admin → grandstand}/images/icons/editor/gallery.png +0 -0
  103. data/public/{admin → grandstand}/images/icons/editor/image-center.png +0 -0
  104. data/public/{admin → grandstand}/images/icons/editor/image-left.png +0 -0
  105. data/public/{admin → grandstand}/images/icons/editor/image-right.png +0 -0
  106. data/public/{admin → grandstand}/images/icons/editor/image.png +0 -0
  107. data/public/{admin → grandstand}/images/icons/editor/italic.png +0 -0
  108. data/public/{admin → grandstand}/images/icons/editor/ordered-list.png +0 -0
  109. data/public/{admin → grandstand}/images/icons/editor/quote.png +0 -0
  110. data/public/{admin → grandstand}/images/icons/editor/source.png +0 -0
  111. data/public/{admin → grandstand}/images/icons/editor/strikethrough.png +0 -0
  112. data/public/{admin → grandstand}/images/icons/editor/underline.png +0 -0
  113. data/public/{admin → grandstand}/images/icons/editor/unordered-list.png +0 -0
  114. data/public/{admin → grandstand}/images/icons/error.png +0 -0
  115. data/public/{admin → grandstand}/images/icons/expand.png +0 -0
  116. data/public/{admin → grandstand}/images/icons/galleries.png +0 -0
  117. data/public/{admin → grandstand}/images/icons/gallery.png +0 -0
  118. data/public/{admin → grandstand}/images/icons/image.png +0 -0
  119. data/public/{admin → grandstand}/images/icons/okay.png +0 -0
  120. data/public/{admin → grandstand}/images/icons/pages.png +0 -0
  121. data/public/{admin → grandstand}/images/icons/posts.png +0 -0
  122. data/public/grandstand/images/icons/processing.gif +0 -0
  123. data/public/{admin → grandstand}/images/icons/upload.png +0 -0
  124. data/public/{admin → grandstand}/images/icons/users.png +0 -0
  125. data/public/{admin → grandstand}/images/logo.png +0 -0
  126. data/public/{admin → grandstand}/images/spinner-dark.gif +0 -0
  127. data/public/{admin → grandstand}/images/uploader.swf +0 -0
  128. data/public/{admin → grandstand}/javascripts/application.js +139 -54
  129. data/public/grandstand/javascripts/jquery.js +414 -0
  130. data/public/{admin → grandstand}/javascripts/mustache.js +0 -0
  131. data/public/grandstand/javascripts/preview.js +9 -0
  132. data/public/{admin → grandstand}/javascripts/selection.js +77 -57
  133. data/public/{admin → grandstand}/javascripts/string.js +7 -6
  134. data/public/grandstand/javascripts/wysiwyg.js +311 -0
  135. data/public/{admin → grandstand}/stylesheets/wysiwyg-content.css +15 -2
  136. metadata +207 -126
  137. data/README +0 -7
  138. data/app/controllers/admin/posts_controller.rb +0 -48
  139. data/app/controllers/admin/templates_controller.rb +0 -6
  140. data/app/helpers/admin/main_helper.rb +0 -31
  141. data/app/helpers/admin/pages_helper.rb +0 -2
  142. data/app/helpers/admin/posts_helper.rb +0 -2
  143. data/app/helpers/admin/sessions_helper.rb +0 -2
  144. data/app/helpers/admin/templates_helper.rb +0 -2
  145. data/app/helpers/admin/users_helper.rb +0 -2
  146. data/app/models/page_section.rb +0 -6
  147. data/app/stylesheets/_dialogs.less +0 -85
  148. data/app/views/admin/galleries/_gallery.html.erb +0 -16
  149. data/app/views/admin/galleries/_list.html.erb +0 -17
  150. data/app/views/admin/galleries/delete.html.erb +0 -8
  151. data/app/views/admin/galleries/edit.html.erb +0 -8
  152. data/app/views/admin/galleries/editor.html.erb +0 -13
  153. data/app/views/admin/galleries/editor_with_images.html.erb +0 -19
  154. data/app/views/admin/galleries/index.html.erb +0 -13
  155. data/app/views/admin/galleries/new.html.erb +0 -8
  156. data/app/views/admin/galleries/show.html.erb +0 -15
  157. data/app/views/admin/images/delete.html.erb +0 -8
  158. data/app/views/admin/images/edit.html.erb +0 -8
  159. data/app/views/admin/images/new.html.erb +0 -8
  160. data/app/views/admin/main/index.html.erb +0 -10
  161. data/app/views/admin/pages/_left.html.erb +0 -3
  162. data/app/views/admin/posts/_form.html.erb +0 -29
  163. data/app/views/admin/posts/_left.html.erb +0 -3
  164. data/app/views/admin/posts/_list.html.erb +0 -22
  165. data/app/views/admin/posts/edit.html.erb +0 -10
  166. data/app/views/admin/posts/new.html.erb +0 -10
  167. data/app/views/admin/posts/show.html.erb +0 -4
  168. data/app/views/admin/shared/_flash.html.erb +0 -3
  169. data/app/views/admin/users/_left.html.erb +0 -3
  170. data/app/views/admin/users/edit.html.erb +0 -8
  171. data/app/views/admin/users/new.html.erb +0 -8
  172. data/app/views/admin/users/show.html.erb +0 -12
  173. data/app/views/layouts/admin.html.erb +0 -80
  174. data/app/views/layouts/admin_login.html.erb +0 -17
  175. data/lib/grandstand/controller/development.rb +0 -15
  176. data/public/admin/javascripts/jquery.js +0 -404
  177. data/public/admin/javascripts/wysiwyg.js +0 -335
  178. data/public/admin/stylesheets/application.css +0 -1
  179. data/public/admin/stylesheets/global.css +0 -1
  180. data/public/admin/stylesheets/login.css +0 -1
  181. data/public/admin/stylesheets/wysiwyg.css +0 -1
@@ -1,5 +1,5 @@
1
1
  class PostsController < ApplicationController
2
2
  def show
3
- return not_found unless @post = Post.where("#{Post.extract_year('created_at')} = ? AND #{Post.extract_month('created_at')} = ? AND url = ?", params[:year], params[:month].rjust(2, '0'), params[:id]).first
3
+ return not_found unless @post = Grandstand::Post.posted_on(params[:year], params[:month]).where(:url => params[:id]).first
4
4
  end
5
5
  end
@@ -0,0 +1,2 @@
1
+ module GalleriesHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Grandstand::GalleriesHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Grandstand::ImagesHelper
2
+ end
@@ -0,0 +1,74 @@
1
+ module Grandstand::MainHelper
2
+ # Renders a <button> tag. Helpful for forms and the like.
3
+ #
4
+ # <%= button("Save Changes", :class => "blue") %>
5
+ #
6
+ # ... produces
7
+ #
8
+ # <button class="button blue"><span class="inner"><span>Save Changes</span></span></button>
9
+ def button(*args)
10
+ label = args.shift
11
+ options = {:name => 'submit', :value => label}.merge(args.extract_options! || {})
12
+ options, icon = button_options(options)
13
+ content_tag(:button, options) { content_tag(:span, :class => icon ? "#{icon} icon" : nil) { label } }
14
+ end
15
+
16
+ # Similar to button, but generates a link instead of a button element. Useful for providing
17
+ # buttons to GET actions:
18
+ #
19
+ # <%= button_link_to("Get Help", support_path, :icon => "help") %>
20
+ #
21
+ # ... produces
22
+ #
23
+ # <a class="button blue" href="/support"><span class="inner"><span class="help icon">Get Help</span></span></button>
24
+ #
25
+ # The extra spans are for any sliding door styling you may be interested in adding. Adding :icon to the options will
26
+ # give the inner-most span a class of "#{options[:icon]} icon", allowing you to add extra images inside of your button.
27
+ def button_link_to(*args)
28
+ options, icon = button_options(args.extract_options! || {})
29
+ link_to(content_tag(:span, :class => icon ? "#{icon} icon" : nil) { args.shift }, *args.push(options))
30
+ end
31
+
32
+ def button_options(options)
33
+ classes = %w(button)
34
+ if icon = options.delete(:icon)
35
+ classes.push('has-icon')
36
+ end
37
+ if options.delete(:default)
38
+ classes.push('default')
39
+ end
40
+ classes.push(options[:class].to_s.split(' ')) if options[:class]
41
+ options[:class] = classes.uniq.join(' ')
42
+ [options, icon]
43
+ end
44
+
45
+ def expand(*controllers)
46
+ options = controllers.extract_options!
47
+ options[:class] = Array(options[:class]).compact
48
+ options[:class].push(:expandable)
49
+ section = controllers.first
50
+ controllers.map!(&:to_s)
51
+ if controllers.include?(controller_name) || !((session[:expand] ||= []) & controllers).empty?
52
+ options[:class].push(:expanded)
53
+ end
54
+ raw %( class="#{options[:class].join(' ')}")
55
+ end
56
+
57
+ def expand_link(section)
58
+ link_to(raw('<span></span>'), '#', :class => 'expand', :rel => section)
59
+ end
60
+
61
+ def hide(condition)
62
+ raw ' style="display:none;"' if condition
63
+ end
64
+
65
+ # A form wrapper that's used to override the default field_error_proc in a thread-safeish way.
66
+ # The new field_error_proc returns a <div> with class "errors" on it, instead of an irritating
67
+ # "fieldWithErrors" classname that nobody likes or wants to use. Only used in admin at the moment.
68
+ def wrap_grandstand_form(&block)
69
+ field_error_proc = ActionView::Base.field_error_proc
70
+ ActionView::Base.field_error_proc = Proc.new {|html_tag, instance| raw("<div class=\"errors\">#{html_tag}</div>") }
71
+ concat(capture(&block))
72
+ ActionView::Base.field_error_proc = field_error_proc
73
+ end
74
+ end
@@ -0,0 +1,2 @@
1
+ module Grandstand::PagesHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Grandstand::PostsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Grandstand::SessionsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Grandstand::TemplatesHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Grandstand::UsersHelper
2
+ end
@@ -1,4 +1,4 @@
1
- class Gallery < ActiveRecord::Base
1
+ class Grandstand::Gallery < ActiveRecord::Base
2
2
  before_save :set_url
3
3
  belongs_to :user
4
4
  default_scope order('position, id')
@@ -8,7 +8,7 @@ class Gallery < ActiveRecord::Base
8
8
  validates_uniqueness_of :name, :message => 'A gallery with that name already exists'
9
9
 
10
10
  def cover_image
11
- images.first || Image.new
11
+ images.first || Grandstand::Image.new
12
12
  end
13
13
 
14
14
  # def to_param
@@ -1,18 +1,19 @@
1
- class Image < ActiveRecord::Base
1
+ class Grandstand::Image < ActiveRecord::Base
2
2
  belongs_to :gallery
3
3
  belongs_to :user
4
4
  default_scope order('position, id')
5
5
 
6
6
  has_attached_file :file,
7
- :default_url => "http://dummyimage.com/:dimensions",
8
- :path => '/images/:padded_id-:style.:extension',
7
+ :convert_options => Hash[*(Grandstand.image_sizes.keys + [:grandstand_icon, :grandstand_medium]).map {|key| [key, '-gravity North']}.flatten],
8
+ :default_url => "http://dummyimage.com/:dimensions/fff/888&text=No+Images!",
9
+ :path => '/images/:gallery_id/:padded_id-:style.:extension',
9
10
  :styles => {
10
- :admin_icon => '16x16#',
11
- :admin_medium => '200x200#'
12
- }.merge(Grandstand::Application.image_sizes),
11
+ :grandstand_icon => '16x16#',
12
+ :grandstand_medium => '200x200#'
13
+ }.merge(Grandstand.image_sizes),
13
14
  :storage => :s3,
14
- :s3_credentials => Grandstand::Application.s3[:credentials],
15
- :bucket => Grandstand::Application.s3[:bucket]
15
+ :s3_credentials => Grandstand.s3[:credentials],
16
+ :bucket => Grandstand.s3[:bucket]
16
17
 
17
18
  delegate :url, :to => :file
18
19
 
@@ -27,7 +28,7 @@ class Image < ActiveRecord::Base
27
28
  def sizes
28
29
  return @sizes if defined? @sizes
29
30
  sorted_sizes = ActiveSupport::OrderedHash.new
30
- Image.attachment_definitions[:file][:styles].reject {|style, dimensions| style.to_s =~ /^admin_/ }.inject({}) do |sizes, style_definition|
31
+ Grandstand::Image.attachment_definitions[:file][:styles].reject {|style, dimensions| style.to_s =~ /^grandstand_/ }.inject({}) do |sizes, style_definition|
31
32
  style, dimensions = style_definition
32
33
  width, height = dimensions.gsub(/[^0-9x]/, '').split('x').map(&:to_i)
33
34
  width ||= 0
@@ -1,4 +1,4 @@
1
- class Page < ActiveRecord::Base
1
+ class Grandstand::Page < ActiveRecord::Base
2
2
  attr_writer :new_parent_slug
3
3
 
4
4
  after_update :update_children
@@ -0,0 +1,6 @@
1
+ class Grandstand::PageSection < ActiveRecord::Base
2
+ belongs_to :page
3
+ Grandstand.page_sections.each do |section|
4
+ scope section.to_sym, where(:section => section)
5
+ end
6
+ end
@@ -1,9 +1,13 @@
1
- class Post < ActiveRecord::Base
1
+ class Grandstand::Post < ActiveRecord::Base
2
2
  before_save :set_url
3
+ before_validation :set_posted_at
3
4
  belongs_to :user
4
- default_scope order('created_at DESC')
5
+ default_scope order('posted_at DESC, created_at DESC, id DESC')
6
+
7
+ scope :posted_on, lambda {|year, month| where("#{extract_year('posted_at')} = ? AND #{extract_month('posted_at')} = ?", year, month.to_s.rjust(2, '0')) }
5
8
 
6
9
  validates_presence_of :name, :message => 'Your post needs a name'
10
+ validates_presence_of :posted_at
7
11
  validates_uniqueness_of :name, :message => 'A post with that name already exists'
8
12
 
9
13
  class << self
@@ -30,11 +34,19 @@ class Post < ActiveRecord::Base
30
34
  end
31
35
  end
32
36
 
37
+ def to_html
38
+ @to_html ||= Mustache.render(Grandstand::Template.post, as_json)
39
+ end
40
+
33
41
  # def to_param
34
42
  # url
35
43
  # end
36
44
 
37
45
  protected
46
+ def set_posted_at
47
+ self.posted_at ||= Time.now
48
+ end
49
+
38
50
  def set_url
39
51
  self.url ||= name.parameterize
40
52
  end
@@ -1,4 +1,4 @@
1
- class Template
1
+ class Grandstand::Template
2
2
  class << self
3
3
  def [](name)
4
4
  @templates ||= {}
@@ -30,4 +30,4 @@ class Template
30
30
  def render
31
31
  @body.freeze
32
32
  end
33
- end
33
+ end
@@ -1,4 +1,4 @@
1
- class User < ActiveRecord::Base
1
+ class Grandstand::User < ActiveRecord::Base
2
2
  attr_accessor :password
3
3
  attr_accessible :email, :first_name, :last_name, :password, :password_confirmation
4
4
 
@@ -3,7 +3,7 @@
3
3
  for the editor UI ONLY. It relies heavily on global.less, which provides all form element styling and much
4
4
  of the generic UI found in the app - including during inline editing and the like.
5
5
  */
6
- @import url('_buttons');
6
+ @import url('_buttons.less');
7
7
 
8
8
  /* Layout Elements */
9
9
 
@@ -17,7 +17,7 @@ body {
17
17
  background-image:-webkit-gradient(linear, left top, left bottom, from(#eee), to(#ddd));
18
18
  border-bottom:1px solid #eee;
19
19
  border-top:1px solid #fff;
20
- height:32px;
20
+ height:35px;
21
21
  left:0;
22
22
  padding:0 10px;
23
23
  position:absolute;
@@ -27,11 +27,11 @@ body {
27
27
  -moz-box-sizing:border-box;
28
28
  -ms-box-sizing:border-box;
29
29
  -webkit-box-sizing:border-box;
30
- -moz-box-shadow:#111 0 2px 2px;
31
- -webkit-box-shadow:#999 0 1px 2px;
30
+ -moz-box-shadow:#999 0 1px 2px;
31
+ -webkit-box-shadow:#999 0 1px 2px;
32
32
 
33
33
  .float-right {
34
- line-height:30px;
34
+ line-height:35px;
35
35
  /* margin-top:11px;*/
36
36
  }
37
37
 
@@ -49,13 +49,13 @@ body {
49
49
 
50
50
  #logo {
51
51
  display:inline-block;
52
- padding-top:0;
52
+ padding-top:1px;
53
53
  }
54
54
 
55
55
  #content {
56
56
  height:100%;
57
57
  overflow:hidden;
58
- padding:31px 0 0 0;
58
+ padding:36px 0 0 0;
59
59
  position:absolute;
60
60
  width:100%;
61
61
  box-sizing:border-box;
@@ -88,10 +88,13 @@ body {
88
88
  li.first {
89
89
  > a {
90
90
  border-top-color:#d4d4d4;
91
+ -moz-border-radius-topleft:2px;
91
92
  -webkit-border-top-left-radius:2px;
92
93
  }
93
94
 
94
95
  a.expand {
96
+ -moz-border-radius-topleft:0;
97
+ -moz-border-radius-topright:2px;
95
98
  -webkit-border-top-left-radius:0;
96
99
  -webkit-border-top-right-radius:2px;
97
100
  }
@@ -156,6 +159,8 @@ body {
156
159
  }
157
160
 
158
161
  li.last a {
162
+ -moz-border-radius-bottomleft:2px;
163
+ -moz-border-radius-bottomright:2px;
159
164
  -webkit-border-bottom-left-radius:2px;
160
165
  -webkit-border-bottom-right-radius:2px;
161
166
  }
@@ -194,20 +199,32 @@ body {
194
199
  z-index:2;
195
200
  }
196
201
 
197
- #pulldown {
202
+ #cover.loading {
203
+ background-image:url(../images/spinner-dark.gif);
204
+ background-position:center center;
205
+ background-repeat:no-repeat;
206
+ }
207
+
208
+ #dialog {
198
209
  left:50%;
199
210
  margin-left:-200px;
200
211
  position:fixed;
201
212
  top:0;
202
213
  width:400px;
203
214
  z-index:3;
215
+ -moz-border-radius-bottomleft:5px;
216
+ -moz-border-radius-bottomright:5px;
217
+ -webkit-border-bottom-left-radius:5px;
218
+ -webkit-border-bottom-right-radius:5px;
219
+ -moz-box-shadow:#333 0 1px 2px;
220
+ -webkit-box-shadow:#333 0 1px 2px;
204
221
 
205
222
  h2 {
206
223
  background:#fafafa;
207
224
  border-bottom:1px solid #ddd;
208
225
  color:#555;
209
226
  font-size:10pt;
210
- margin-bottom:0;
227
+ margin:0 !important;
211
228
  padding:5px;
212
229
  text-shadow:#fff 0 1px 0;
213
230
  }
@@ -217,14 +234,80 @@ body {
217
234
  margin:0;
218
235
  }
219
236
 
220
- form .field {
237
+ form.two-pane {
238
+ background:#d9dfe8;
239
+ border-top-width:0;
240
+ -moz-border-radius-bottomleft:5px;
241
+ -moz-border-radius-bottomright:5px;
242
+ -webkit-border-bottom-left-radius:5px;
243
+ -webkit-border-bottom-right-radius:5px;
244
+ }
245
+
246
+ .destination {
247
+ background-color:#fff;
248
+ border-left:1px solid #aaa;
249
+ height:100%;
250
+ margin-left:200px;
251
+ }
252
+
253
+ .field {
221
254
  background:#f0f0f0;
222
255
  padding:10px;
223
256
  }
224
257
 
258
+ .image {
259
+ cursor:pointer;
260
+ }
261
+
262
+ .scrollable {
263
+ /* height:100%;*/
264
+ overflow-x:hidden;
265
+ overflow-y:auto;
266
+ padding:10px 0;
267
+ width:100%;
268
+ -moz-box-sizing:border-box;
269
+ -ms-box-sizing:border-box;
270
+ -webkit-box-sizing:border-box;
271
+ }
272
+
273
+ .source {
274
+ float:left;
275
+ height:100%;
276
+ overflow-x:hidden;
277
+ overflow-y:auto;
278
+ width:200px;
279
+
280
+ .header {
281
+ background-color:transparent !important;
282
+ background-image:none !important;
283
+ border-width:0 !important;
284
+ color:#505d81;
285
+ font-weight:bold;
286
+ padding:10px 10px 5px 10px;
287
+ text-shadow:#f1f5f8 0 1px 0;
288
+ text-transform:uppercase;
289
+ }
290
+
291
+ a {
292
+ border-top:1px solid #d9dfe8;
293
+ color:#000;
294
+ display:block;
295
+ padding:5px 5px 5px 20px;
296
+ text-decoration:none;
297
+ }
298
+
299
+ a.active {
300
+ background:-webkit-gradient(linear, left top, left bottom, from(#63a4e2), to(#0066c0));
301
+ border-top:1px solid #4691d6;
302
+ color:#fff;
303
+ text-shadow:#000 0 1px 0;
304
+ }
305
+ }
306
+
225
307
  .toolbar {
226
308
  #grandstand > .styled-toolbar;
227
309
  border-top:1px solid #888;
310
+ clear:both;
228
311
  text-align:right;
229
312
  -moz-border-radius-bottomleft:5px;
230
313
  -moz-border-radius-bottomright:5px;
@@ -236,3 +319,13 @@ body {
236
319
  }
237
320
  }
238
321
  }
322
+
323
+ #dialog.large {
324
+ margin-left:-450px;
325
+ width:900px;
326
+ }
327
+
328
+ #dialog.medium {
329
+ margin-left:-300px;
330
+ width:600px;
331
+ }
@@ -1,15 +1,15 @@
1
1
  /*
2
- global.less contains the styling for rendering the admin UI in any context, assuming
3
- it lives somewhere underneath a .admin item. This will allow you to take global UI
2
+ global.less contains the styling for rendering the grandstand UI in any context, assuming
3
+ it lives somewhere underneath a .grandstand item. This will allow you to take global UI
4
4
  elements and apply them externally or internally - whatever you feel like.
5
5
  */
6
- @import url('_buttons');
6
+ @import url('_buttons.less');
7
7
 
8
8
  body, html {
9
9
  min-height:100%;
10
10
  }
11
11
 
12
- body.admin {
12
+ body.grandstand {
13
13
  background-color:#fff;
14
14
  background-image:-moz-linear-gradient(top, #fff, #eee);
15
15
  background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), to(#eee));
@@ -18,7 +18,7 @@ body.admin {
18
18
  padding:0;
19
19
  }
20
20
 
21
- .admin {
21
+ .grandstand {
22
22
  /* HTML Tags (excluding form input elements) */
23
23
  a {
24
24
  cursor:pointer;
@@ -30,7 +30,7 @@ body.admin {
30
30
  }
31
31
 
32
32
  form {
33
- label {
33
+ label, .label {
34
34
  color:#666;
35
35
  display:block;
36
36
  font:bold 12px Arial;
@@ -39,6 +39,7 @@ body.admin {
39
39
 
40
40
  .field {
41
41
  margin:0;
42
+ overflow:hidden;
42
43
  padding:10px 5px;
43
44
  }
44
45
  }
@@ -58,6 +59,7 @@ body.admin {
58
59
  }
59
60
 
60
61
  h2 {
62
+ display:block !important;
61
63
  margin:0 0 5px 0;
62
64
  font-size:14pt;
63
65
  }
@@ -219,22 +221,27 @@ body.admin {
219
221
  #grandstand > .button-hover;
220
222
  }
221
223
 
222
- .button:active {
224
+ .button:active, .button.active {
225
+ #grandstand > .button-hover;
223
226
  #grandstand > .button-active;
224
227
  }
225
228
 
226
- .button.grey {
229
+ .button.default {
227
230
  #grandstand > .button-grey;
228
231
  }
229
232
 
230
- .button.grey:hover {
233
+ .button.default:hover {
231
234
  #grandstand > .button-grey-hover;
232
235
  }
233
236
 
234
- .button.grey:active {
237
+ .button.default:active {
235
238
  #grandstand > .button-grey-active;
236
239
  }
237
240
 
241
+ .center {
242
+ text-align:center;
243
+ }
244
+
238
245
  .error {
239
246
  margin-top:5px;
240
247
  }
@@ -247,25 +254,6 @@ body.admin {
247
254
  border:1px solid #f00;
248
255
  }
249
256
 
250
- .flash {
251
- bottom:20px;
252
- position:fixed;
253
- text-align:center;
254
- width:100%;
255
- z-index:4;
256
- }
257
-
258
- .flash .inner {
259
- background:rgba(0, 0, 0, 0.7);
260
- color:#fff;
261
- display:inline-block;
262
- font-size:24pt;
263
- margin:0 auto;
264
- padding:10px 20px;
265
- -moz-border-radius:70px;
266
- -webkit-border-radius:70px;
267
- }
268
-
269
257
  .float-left {
270
258
  float:left;
271
259
  }
@@ -330,6 +318,11 @@ body.admin {
330
318
  background-image:url(../images/icons/posts.png);
331
319
  }
332
320
 
321
+ .icon.processing {
322
+ background-image:url(../images/icons/processing.gif);
323
+ background-position:left bottom;
324
+ }
325
+
333
326
  .icon.upload {
334
327
  background-image:url(../images/icons/upload.png);
335
328
  }
@@ -344,12 +337,17 @@ body.admin {
344
337
  }
345
338
 
346
339
  .inset {
347
- background-color:#f0f0f0;
340
+ background-color:#f5f5f5;
348
341
  padding:10px;
349
342
  -moz-border-radius:5px;
350
343
  -webkit-border-radius:5px;
351
344
  -moz-box-shadow:inset #888 0 1px 2px;
352
345
  -webkit-box-shadow:inset #888 0 1px 2px;
346
+
347
+ .button {
348
+ -moz-box-shadow:rgba(255, 255, 255, 0.6) 0 1px 0;
349
+ -webkit-box-shadow:rgba(255, 255, 255, 0.6) 0 1px 0;
350
+ }
353
351
  }
354
352
 
355
353
  .inset.icon {
@@ -358,6 +356,25 @@ body.admin {
358
356
  padding-left:68px;
359
357
  }
360
358
 
359
+ .notification {
360
+ bottom:20px;
361
+ position:fixed;
362
+ text-align:center;
363
+ width:100%;
364
+ z-index:4;
365
+ }
366
+
367
+ .notification .inner {
368
+ background:rgba(0, 0, 0, 0.7);
369
+ color:#fff;
370
+ display:inline-block;
371
+ font-size:24pt;
372
+ margin:0 auto;
373
+ padding:10px 20px;
374
+ -moz-border-radius:70px;
375
+ -webkit-border-radius:70px;
376
+ }
377
+
361
378
  .progress-bar {
362
379
  background:url(../images/background-progress-bar.png) repeat-x left center;
363
380
  margin:0;