grandstand 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/.gitignore +2 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +7 -0
  4. data/Rakefile +44 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/admin/galleries_controller.rb +52 -0
  7. data/app/controllers/admin/images_controller.rb +68 -0
  8. data/app/controllers/admin/main_controller.rb +36 -0
  9. data/app/controllers/admin/pages_controller.rb +51 -0
  10. data/app/controllers/admin/posts_controller.rb +48 -0
  11. data/app/controllers/admin/sessions_controller.rb +41 -0
  12. data/app/controllers/admin/templates_controller.rb +6 -0
  13. data/app/controllers/admin/users_controller.rb +48 -0
  14. data/app/controllers/galleries_controller.rb +5 -0
  15. data/app/controllers/pages_controller.rb +5 -0
  16. data/app/controllers/posts_controller.rb +5 -0
  17. data/app/helpers/admin/main_helper.rb +31 -0
  18. data/app/helpers/admin/pages_helper.rb +2 -0
  19. data/app/helpers/admin/posts_helper.rb +2 -0
  20. data/app/helpers/admin/sessions_helper.rb +2 -0
  21. data/app/helpers/admin/templates_helper.rb +2 -0
  22. data/app/helpers/admin/users_helper.rb +2 -0
  23. data/app/helpers/pages_helper.rb +2 -0
  24. data/app/helpers/posts_helper.rb +2 -0
  25. data/app/helpers/site_helper.rb +2 -0
  26. data/app/models/gallery.rb +22 -0
  27. data/app/models/image.rb +61 -0
  28. data/app/models/page.rb +45 -0
  29. data/app/models/page_section.rb +6 -0
  30. data/app/models/post.rb +27 -0
  31. data/app/models/template.rb +33 -0
  32. data/app/models/user.rb +68 -0
  33. data/app/stylesheets/_buttons.less +76 -0
  34. data/app/stylesheets/_dialogs.less +85 -0
  35. data/app/stylesheets/application.less +238 -0
  36. data/app/stylesheets/global.less +435 -0
  37. data/app/stylesheets/login.less +30 -0
  38. data/app/stylesheets/wysiwyg.less +96 -0
  39. data/app/views/admin/galleries/_form.html.erb +11 -0
  40. data/app/views/admin/galleries/_gallery.html.erb +16 -0
  41. data/app/views/admin/galleries/_list.html.erb +17 -0
  42. data/app/views/admin/galleries/delete.html.erb +8 -0
  43. data/app/views/admin/galleries/edit.html.erb +8 -0
  44. data/app/views/admin/galleries/editor.html.erb +13 -0
  45. data/app/views/admin/galleries/editor_with_images.html.erb +19 -0
  46. data/app/views/admin/galleries/index.html.erb +13 -0
  47. data/app/views/admin/galleries/new.html.erb +8 -0
  48. data/app/views/admin/galleries/show.html.erb +15 -0
  49. data/app/views/admin/images/_form.html.erb +11 -0
  50. data/app/views/admin/images/delete.html.erb +8 -0
  51. data/app/views/admin/images/edit.html.erb +8 -0
  52. data/app/views/admin/images/new.html.erb +8 -0
  53. data/app/views/admin/images/upload.html.erb +11 -0
  54. data/app/views/admin/main/index.html.erb +10 -0
  55. data/app/views/admin/pages/_form.html.erb +33 -0
  56. data/app/views/admin/pages/_left.html.erb +3 -0
  57. data/app/views/admin/pages/_row.html.erb +9 -0
  58. data/app/views/admin/pages/delete.html.erb +8 -0
  59. data/app/views/admin/pages/edit.html.erb +8 -0
  60. data/app/views/admin/pages/index.html.erb +20 -0
  61. data/app/views/admin/pages/new.html.erb +8 -0
  62. data/app/views/admin/pages/show.html.erb +3 -0
  63. data/app/views/admin/posts/_form.html.erb +29 -0
  64. data/app/views/admin/posts/_left.html.erb +3 -0
  65. data/app/views/admin/posts/_list.html.erb +22 -0
  66. data/app/views/admin/posts/delete.html.erb +9 -0
  67. data/app/views/admin/posts/edit.html.erb +10 -0
  68. data/app/views/admin/posts/index.html.erb +10 -0
  69. data/app/views/admin/posts/new.html.erb +10 -0
  70. data/app/views/admin/posts/show.html.erb +4 -0
  71. data/app/views/admin/sessions/forgot.html.erb +8 -0
  72. data/app/views/admin/sessions/show.html.erb +12 -0
  73. data/app/views/admin/shared/_flash.html.erb +3 -0
  74. data/app/views/admin/users/_form.html.erb +16 -0
  75. data/app/views/admin/users/_left.html.erb +3 -0
  76. data/app/views/admin/users/delete.html.erb +10 -0
  77. data/app/views/admin/users/edit.html.erb +8 -0
  78. data/app/views/admin/users/index.html.erb +22 -0
  79. data/app/views/admin/users/new.html.erb +8 -0
  80. data/app/views/admin/users/show.html.erb +12 -0
  81. data/app/views/galleries/index.html.erb +0 -0
  82. data/app/views/galleries/show.html.erb +12 -0
  83. data/app/views/layouts/admin.html.erb +80 -0
  84. data/app/views/layouts/admin_login.html.erb +17 -0
  85. data/app/views/layouts/admin_xhr.html.erb +3 -0
  86. data/app/views/pages/show.html.erb +8 -0
  87. data/app/views/posts/show.html.erb +3 -0
  88. data/app/views/shared/404.html.erb +5 -0
  89. data/app/views/shared/gallery.html +14 -0
  90. data/app/views/shared/image.html +1 -0
  91. data/app/views/shared/page.html +0 -0
  92. data/app/views/shared/post.html +3 -0
  93. data/grandstand.gemspec +189 -0
  94. data/lib/grandstand/application.rb +50 -0
  95. data/lib/grandstand/controller/development.rb +15 -0
  96. data/lib/grandstand/controller.rb +104 -0
  97. data/lib/grandstand/helper.rb +117 -0
  98. data/lib/grandstand/routes.rb +59 -0
  99. data/lib/grandstand/session.rb +25 -0
  100. data/lib/grandstand.rb +27 -0
  101. data/public/.DS_Store +0 -0
  102. data/public/admin/.DS_Store +0 -0
  103. data/public/admin/images/.DS_Store +0 -0
  104. data/public/admin/images/background-input.gif +0 -0
  105. data/public/admin/images/background-progress-bar.png +0 -0
  106. data/public/admin/images/background-progress-complete.gif +0 -0
  107. data/public/admin/images/background-progress.gif +0 -0
  108. data/public/admin/images/icons/.DS_Store +0 -0
  109. data/public/admin/images/icons/add.png +0 -0
  110. data/public/admin/images/icons/collapse.png +0 -0
  111. data/public/admin/images/icons/delete.png +0 -0
  112. data/public/admin/images/icons/edit.png +0 -0
  113. data/public/admin/images/icons/editor/bold.png +0 -0
  114. data/public/admin/images/icons/editor/gallery.png +0 -0
  115. data/public/admin/images/icons/editor/image-center.png +0 -0
  116. data/public/admin/images/icons/editor/image-left.png +0 -0
  117. data/public/admin/images/icons/editor/image-right.png +0 -0
  118. data/public/admin/images/icons/editor/image.png +0 -0
  119. data/public/admin/images/icons/editor/italic.png +0 -0
  120. data/public/admin/images/icons/editor/ordered-list.png +0 -0
  121. data/public/admin/images/icons/editor/quote.png +0 -0
  122. data/public/admin/images/icons/editor/source.png +0 -0
  123. data/public/admin/images/icons/editor/strikethrough.png +0 -0
  124. data/public/admin/images/icons/editor/underline.png +0 -0
  125. data/public/admin/images/icons/editor/unordered-list.png +0 -0
  126. data/public/admin/images/icons/error.png +0 -0
  127. data/public/admin/images/icons/expand.png +0 -0
  128. data/public/admin/images/icons/galleries.png +0 -0
  129. data/public/admin/images/icons/gallery.png +0 -0
  130. data/public/admin/images/icons/image.png +0 -0
  131. data/public/admin/images/icons/okay.png +0 -0
  132. data/public/admin/images/icons/pages.png +0 -0
  133. data/public/admin/images/icons/posts.png +0 -0
  134. data/public/admin/images/icons/upload.png +0 -0
  135. data/public/admin/images/icons/users.png +0 -0
  136. data/public/admin/images/logo.png +0 -0
  137. data/public/admin/images/spinner-dark.gif +0 -0
  138. data/public/admin/images/uploader.swf +0 -0
  139. data/public/admin/javascripts/application.js +231 -0
  140. data/public/admin/javascripts/jquery.js +404 -0
  141. data/public/admin/javascripts/mustache.js +324 -0
  142. data/public/admin/javascripts/selection.js +280 -0
  143. data/public/admin/javascripts/string.js +264 -0
  144. data/public/admin/javascripts/wysiwyg.js +335 -0
  145. data/public/admin/stylesheets/application.css +1 -0
  146. data/public/admin/stylesheets/global.css +1 -0
  147. data/public/admin/stylesheets/login.css +1 -0
  148. data/public/admin/stylesheets/wysiwyg-content.css +20 -0
  149. data/public/admin/stylesheets/wysiwyg.css +1 -0
  150. data/vendor/cache/more-0.1.1.gem +0 -0
  151. metadata +216 -0
@@ -0,0 +1,27 @@
1
+ class Post < ActiveRecord::Base
2
+ before_save :set_url
3
+ belongs_to :user
4
+ default_scope order('created_at DESC')
5
+
6
+ validates_presence_of :name, :message => 'Your post needs a name'
7
+ validates_uniqueness_of :name, :message => 'A post with that name already exists'
8
+
9
+ class << self
10
+ def extract_month(attribute)
11
+ "strftime('%m', #{attribute})"
12
+ end
13
+
14
+ def extract_year(attribute)
15
+ "strftime('%Y', #{attribute})"
16
+ end
17
+ end
18
+
19
+ # def to_param
20
+ # url
21
+ # end
22
+
23
+ protected
24
+ def set_url
25
+ self.url ||= name.parameterize
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ class Template
2
+ class << self
3
+ def [](name)
4
+ @templates ||= {}
5
+ @templates[name] ||= new(name)
6
+ end
7
+
8
+ protected
9
+ def method_missing(*args)
10
+ method = args.shift.to_sym
11
+ self[method].render
12
+ end
13
+ end
14
+
15
+ def initialize(name, body = nil)
16
+ @file = Dir[*ApplicationController.view_paths.map {|path| File.join(path.to_s, 'shared', "#{name}.html")}].find {|file| File.file?(file)}
17
+ if body
18
+ @body = body
19
+ elsif @file
20
+ @body = File.read(@file)
21
+ else
22
+ return false
23
+ end
24
+ end
25
+
26
+ def path
27
+ @file.freeze
28
+ end
29
+
30
+ def render
31
+ @body.freeze
32
+ end
33
+ end
@@ -0,0 +1,68 @@
1
+ class User < ActiveRecord::Base
2
+ attr_accessor :password
3
+ attr_accessible :email, :first_name, :last_name, :password, :password_confirmation
4
+
5
+ before_save :encrypt_password
6
+
7
+ default_scope :order => [:first_name, :last_name]
8
+
9
+ has_many :galleries
10
+ has_many :images
11
+ has_many :posts
12
+
13
+ validates_confirmation_of :password, :allow_nil => true
14
+ validates_presence_of :email
15
+ validates_uniqueness_of :email, :allow_nil => true
16
+
17
+ class << self
18
+ def authenticates_with(credentials)
19
+ password = credentials.delete(:password)
20
+ first(:conditions => credentials)
21
+ end
22
+ end
23
+
24
+ # Check whether or not a given password hashes out to this models'
25
+ # stored password.
26
+ def authenticates_with?(check_password)
27
+ encrypted_password == password_digest(check_password)
28
+ end
29
+
30
+ # Provides a mailto: formatted link to this users' e-mail address
31
+ def mailto
32
+ "mailto:#{email}"
33
+ end
34
+
35
+ # Creates a whitespace-cleaned combination of this users' first and
36
+ # last names
37
+ def name
38
+ return @name if @name
39
+ name = [first_name, last_name].reject(&:blank?).join(' ')
40
+ @name = name.blank? ? email : name
41
+ end
42
+
43
+ protected
44
+ # Store a models' salt and password fields. Salting ensures that
45
+ # identical passwords do not appear the same in the database. So
46
+ # if two people have "foobar" as their password, they'll be completely
47
+ # different. Helps prevent rainbow-style attackyness.
48
+ def encrypt_password
49
+ unless password.blank?
50
+ self.salt = Digest::SHA1.hexdigest([Time.now.to_s, (1..10).map{ rand.to_s }].join('--'))
51
+ self.encrypted_password = password_digest(password)
52
+ end
53
+ end
54
+
55
+ # Returns a hash of a given password string. Used both for storing
56
+ # passwords and authenticating later. The DIGEST_STRETCHES constant
57
+ # ensures passwords are hashed more than once - which prevents brute-
58
+ # force attacks from being even remotely efficient. Take that, hacker
59
+ # dickheads.
60
+ def password_digest(password)
61
+ password_digest = SITE_KEY
62
+ # Perform stretching per RESTful Authentication's guidelines
63
+ DIGEST_STRETCHES.times do
64
+ password_digest = Digest::SHA1.hexdigest([password_digest, salt, password, SITE_KEY].join('--'))
65
+ end
66
+ password_digest
67
+ end
68
+ end
@@ -0,0 +1,76 @@
1
+ /*
2
+ buttons.less contains all button styling. Button styling should be mixed-in
3
+ using #grandstand > .button-class to whatever elements need to look like buttons -
4
+ be they links, button tags, or menu items.
5
+ */
6
+ #grandstand {
7
+ .styled-toolbar {
8
+ background-color:#a7a7a7;
9
+ background-image:-moz-linear-gradient(top, #cacaca, #a7a7a7);
10
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#cacaca), to(#a7a7a7));
11
+ overflow:hidden;
12
+ padding:5px;
13
+ }
14
+
15
+ .button-default {
16
+ background-color:#ececec;
17
+ background-image:-moz-linear-gradient(top, #f4f4f4, #ececec);
18
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#f4f4f4), to(#ececec));
19
+ border:1px solid #d4d4d4;
20
+ color:#333;
21
+ cursor:pointer;
22
+ display:inline-block;
23
+ font-size:12px;
24
+ font-weight:bold;
25
+ line-height:16px;
26
+ margin:0;
27
+ overflow:hidden;
28
+ padding:4px 10px;
29
+ text-decoration:none;
30
+ text-shadow:#fff 0 1px 0;
31
+ vertical-align:baseline;
32
+ vertical-align:middle;
33
+ -moz-border-radius:2px;
34
+ -webkit-border-radius:2px;
35
+ }
36
+
37
+ .button-hover {
38
+ background-color:#3072b3;
39
+ background-image:-moz-linear-gradient(top, #599bdc, #3072b3);
40
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#599bdc), to(#3072b3));
41
+ border-color:#518cc6;
42
+ border-bottom-color:#2a65a0;
43
+ color:#fff;
44
+ text-shadow:rgba(0, 0, 0, 0.4) 0 -1px 0;
45
+ }
46
+
47
+ .button-active {
48
+ background-color:#599bdc;
49
+ background-image:-moz-linear-gradient(top, #3072b3, #599bdc);
50
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#3072b3), to(#599bdc));
51
+ border-bottom-color:#518cc6;
52
+ border-top-color:#2a65a0;
53
+ -moz-box-shadow:inset rgba(0, 0, 0, 0.2) 0 0 1px;
54
+ -webkit-box-shadow:inset rgba(0, 0, 0, 0.2) 0 0 1px;
55
+ }
56
+
57
+ .button-grey {
58
+ background-color:#333;
59
+ background-image:-moz-linear-gradient(top, #333, #444);
60
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#444), to(#333));
61
+ border-color:#000;
62
+ color:#fff;
63
+ text-shadow:#000 0 -1px 0;
64
+ }
65
+
66
+ .button-grey-hover {
67
+ background-color:#444;
68
+ background-image:-moz-linear-gradient(top, #333, #444);
69
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#333), to(#444));
70
+ }
71
+
72
+ .button-grey-active {
73
+ -moz-box-shadow:inset rgba(0, 0, 0, 1) 0 0px 1px;
74
+ -webkit-box-shadow:inset rgba(0, 0, 0, 1) 0 0px 1px;
75
+ }
76
+ }
@@ -0,0 +1,85 @@
1
+ /*
2
+ dialogs.less contains the styling for drop-down dialogs in the WYSIWYG editor. Ideally,
3
+ it should be merged with the #pulldown styling from application.less to create something
4
+ a bit more seamless
5
+ */
6
+ .admin .wysiwyg .dialog {
7
+ > form {
8
+ background:#fff;
9
+ left:50%;
10
+ margin-left:-40%;
11
+ position:absolute;
12
+ top:0;
13
+ width:80%;
14
+ z-index:3;
15
+ -moz-border-radius-bottomleft:5px;
16
+ -moz-border-radius-bottomright:5px;
17
+ -moz-box-shadow:#444 0 2px 2px;
18
+ -webkit-border-bottom-left-radius:5px;
19
+ -webkit-border-bottom-right-radius:5px;
20
+ -webkit-box-shadow:#444 0 2px 2px;
21
+ }
22
+
23
+ .pad {
24
+ padding:10px;
25
+ }
26
+
27
+ .xhr, form, .source, .destination {
28
+ /* height:100%;*/
29
+ }
30
+
31
+ .source {
32
+ background:#d9dfe8;
33
+ border-right:1px solid #aaa;
34
+ float:left;
35
+ overflow-x:hidden;
36
+ overflow-y:auto;
37
+ width:200px;
38
+ -moz-border-radius-bottomleft:5px;
39
+ -webkit-border-bottom-left-radius:5px;
40
+
41
+ .header {
42
+ background-image:none !important;
43
+ border-width:0 !important;
44
+ color:#505d81;
45
+ font-weight:bold;
46
+ padding:10px 10px 5px 10px;
47
+ text-shadow:#f1f5f8 0 1px 0;
48
+ text-transform:uppercase;
49
+ }
50
+
51
+ a {
52
+ border-top:1px solid #d9dfe8;
53
+ color:#000;
54
+ display:block;
55
+ padding:5px 5px 5px 20px;
56
+ text-decoration:none;
57
+ }
58
+
59
+ a.active {
60
+ background:-webkit-gradient(linear, left top, left bottom, from(#63a4e2), to(#0066c0));
61
+ border-top:1px solid #4691d6;
62
+ color:#fff;
63
+ text-shadow:#000 0 1px 0;
64
+ }
65
+ }
66
+
67
+ .destination {
68
+ margin-left:201px;
69
+ }
70
+
71
+ .image {
72
+ cursor:pointer;
73
+ }
74
+
75
+ .scrollable {
76
+ /* height:100%;*/
77
+ overflow-x:hidden;
78
+ overflow-y:auto;
79
+ padding:10px 0;
80
+ width:100%;
81
+ -moz-box-sizing:border-box;
82
+ -ms-box-sizing:border-box;
83
+ -webkit-box-sizing:border-box;
84
+ }
85
+ }
@@ -0,0 +1,238 @@
1
+ /*
2
+ application.less contains all of the layout elements for the logged-in application state. This is styling
3
+ for the editor UI ONLY. It relies heavily on global.less, which provides all form element styling and much
4
+ of the generic UI found in the app - including during inline editing and the like.
5
+ */
6
+ @import url('_buttons');
7
+
8
+ /* Layout Elements */
9
+
10
+ body {
11
+ overflow:hidden;
12
+ }
13
+
14
+ #header {
15
+ background-color:#eee;
16
+ background-image:-moz-linear-gradient(top, #eee, #ddd);
17
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#eee), to(#ddd));
18
+ border-bottom:1px solid #eee;
19
+ border-top:1px solid #fff;
20
+ height:32px;
21
+ left:0;
22
+ padding:0 10px;
23
+ position:absolute;
24
+ width:100%;
25
+ z-index:2;
26
+ box-sizing:border-box;
27
+ -moz-box-sizing:border-box;
28
+ -ms-box-sizing:border-box;
29
+ -webkit-box-sizing:border-box;
30
+ -moz-box-shadow:#111 0 2px 2px;
31
+ -webkit-box-shadow:#999 0 1px 2px;
32
+
33
+ .float-right {
34
+ line-height:30px;
35
+ /* margin-top:11px;*/
36
+ }
37
+
38
+ .float-right a {
39
+ color:#000;
40
+ display:inline-block;
41
+ padding:0 7px;
42
+ }
43
+
44
+ .float-right a:hover {
45
+ background-color:rgba(255, 255, 255, 0.3);
46
+ text-decoration:underline;
47
+ }
48
+ }
49
+
50
+ #logo {
51
+ display:inline-block;
52
+ padding-top:0;
53
+ }
54
+
55
+ #content {
56
+ height:100%;
57
+ overflow:hidden;
58
+ padding:31px 0 0 0;
59
+ position:absolute;
60
+ width:100%;
61
+ box-sizing:border-box;
62
+ -moz-box-sizing:border-box;
63
+ -ms-box-sizing:border-box;
64
+ -webkit-box-sizing:border-box;
65
+ }
66
+
67
+ #left {
68
+ left:20px;
69
+ position:absolute;
70
+ top:51px;
71
+ width:150px;
72
+
73
+ .button {
74
+ display:block;
75
+ margin-bottom:10px;
76
+ }
77
+
78
+ ul {
79
+ background-color:#ececec;
80
+ background-image:-moz-linear-gradient(top, #f4f4f4, #ececec);
81
+ background-image:-webkit-gradient(linear, left top, left bottom, from(#f4f4f4), to(#ececec));
82
+ list-style-type:none;
83
+ margin:0;
84
+ padding:0;
85
+ -moz-border-radius:2px;
86
+ -webkit-border-radius:2px;
87
+
88
+ li.first {
89
+ > a {
90
+ border-top-color:#d4d4d4;
91
+ -webkit-border-top-left-radius:2px;
92
+ }
93
+
94
+ a.expand {
95
+ -webkit-border-top-left-radius:0;
96
+ -webkit-border-top-right-radius:2px;
97
+ }
98
+ }
99
+
100
+ li {
101
+ margin:0;
102
+ padding:0;
103
+
104
+ a {
105
+ #grandstand > .button-default;
106
+ border-top-color:#f4f4f4;
107
+ display:block;
108
+ padding:5px;
109
+ -moz-border-radius:0;
110
+ -webkit-border-radius:0;
111
+ }
112
+
113
+ a:hover {
114
+ #grandstand > .button-hover;
115
+ }
116
+
117
+ a:active {
118
+ #grandstand > .button-active;
119
+ }
120
+
121
+ a.expand {
122
+ float:right;
123
+ margin-right:0;
124
+ height:26px;
125
+ line-height:26px;
126
+ padding:0;
127
+ width:15px;
128
+
129
+ span {
130
+ background:url(../images/icons/expand.png) center bottom no-repeat;
131
+ display:block;
132
+ height:16px;
133
+ margin-top:4px;
134
+ width:16px;
135
+ }
136
+ }
137
+
138
+ ul {
139
+ display:none;
140
+
141
+ li a {
142
+ font-size:10px;
143
+ padding-left:20px;
144
+ }
145
+ }
146
+ }
147
+
148
+ li.expandable {
149
+ > a {
150
+ border-right-width:0;
151
+ }
152
+
153
+ > a.expand {
154
+ border-right-width:1px;
155
+ }
156
+ }
157
+
158
+ li.last a {
159
+ -webkit-border-bottom-left-radius:2px;
160
+ -webkit-border-bottom-right-radius:2px;
161
+ }
162
+
163
+ li.expanded {
164
+ a.expand span {
165
+ background-image:url(../images/icons/collapse.png);
166
+ }
167
+
168
+ ul {
169
+ display:block;
170
+ }
171
+ }
172
+ }
173
+ }
174
+
175
+ #main {
176
+ height:100%;
177
+ padding:20px 20px 20px 190px;
178
+ overflow-x:hidden;
179
+ overflow-y:auto;
180
+ box-sizing:border-box;
181
+ -moz-box-sizing:border-box;
182
+ -ms-box-sizing:border-box;
183
+ -webkit-box-sizing:border-box;
184
+ }
185
+
186
+ #cover {
187
+ background-color:#000;
188
+ height:100%;
189
+ left:0;
190
+ opacity:0.6;
191
+ position:fixed;
192
+ top:0;
193
+ width:100%;
194
+ z-index:2;
195
+ }
196
+
197
+ #pulldown {
198
+ left:50%;
199
+ margin-left:-200px;
200
+ position:fixed;
201
+ top:0;
202
+ width:400px;
203
+ z-index:3;
204
+
205
+ h2 {
206
+ background:#fafafa;
207
+ border-bottom:1px solid #ddd;
208
+ color:#555;
209
+ font-size:10pt;
210
+ margin-bottom:0;
211
+ padding:5px;
212
+ text-shadow:#fff 0 1px 0;
213
+ }
214
+
215
+ form {
216
+ border-top:1px solid #fff;
217
+ margin:0;
218
+ }
219
+
220
+ form .field {
221
+ background:#f0f0f0;
222
+ padding:10px;
223
+ }
224
+
225
+ .toolbar {
226
+ #grandstand > .styled-toolbar;
227
+ border-top:1px solid #888;
228
+ text-align:right;
229
+ -moz-border-radius-bottomleft:5px;
230
+ -moz-border-radius-bottomright:5px;
231
+ -webkit-border-bottom-left-radius:5px;
232
+ -webkit-border-bottom-right-radius:5px;
233
+
234
+ .button {
235
+ border-color:#888;
236
+ }
237
+ }
238
+ }