jabe 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/Gemfile +35 -0
  2. data/Gemfile.lock +217 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.textile +12 -0
  5. data/Rakefile +55 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/admin/base_controller.rb +3 -0
  8. data/app/controllers/admin/entries_controller.rb +42 -0
  9. data/app/controllers/admin/settings_controller.rb +11 -0
  10. data/app/controllers/comments_controller.rb +25 -0
  11. data/app/controllers/entries_controller.rb +26 -0
  12. data/app/helpers/application_helper.rb +9 -0
  13. data/app/models/admin.rb +9 -0
  14. data/app/models/comment.rb +17 -0
  15. data/app/models/entry.rb +17 -0
  16. data/app/models/settings.rb +2 -0
  17. data/app/stylesheets/_will_paginate.scss +102 -0
  18. data/app/stylesheets/application.scss +247 -0
  19. data/app/stylesheets/grid.scss +336 -0
  20. data/app/stylesheets/handheld.scss +7 -0
  21. data/app/stylesheets/style.scss +273 -0
  22. data/app/views/admin/entries/_form.html.haml +6 -0
  23. data/app/views/admin/entries/edit.html.haml +1 -0
  24. data/app/views/admin/entries/index.html.haml +43 -0
  25. data/app/views/admin/entries/new.html.haml +1 -0
  26. data/app/views/admin/settings/edit.html.haml +9 -0
  27. data/app/views/entries/_comment.html.haml +0 -0
  28. data/app/views/entries/_comment_form.html.haml +3 -0
  29. data/app/views/entries/index.html.haml +13 -0
  30. data/app/views/entries/show.html.haml +36 -0
  31. data/app/views/layouts/_footer.html.haml +2 -0
  32. data/app/views/layouts/_header.html.haml +4 -0
  33. data/app/views/layouts/_sidebar.html.haml +0 -0
  34. data/app/views/layouts/application.html.haml +59 -0
  35. data/config/initializers/sass.rb +5 -0
  36. data/config/initializers/settings.rb +5 -0
  37. data/config/initializers/time_formats.rb +4 -0
  38. data/config/routes.rb +26 -0
  39. data/features/admin.feature +30 -0
  40. data/features/entries.feature +24 -0
  41. data/features/step_definitions/admin_steps.rb +14 -0
  42. data/features/step_definitions/entry_steps.rb +35 -0
  43. data/features/step_definitions/support_steps.rb +3 -0
  44. data/features/step_definitions/web_steps.rb +219 -0
  45. data/features/support/blueprints.rb +31 -0
  46. data/features/support/env.rb +59 -0
  47. data/features/support/paths.rb +37 -0
  48. data/lib/generators/jabe/migrations/migrations_generator.rb +42 -0
  49. data/lib/generators/jabe/templates/migrations/create_comments.rb +20 -0
  50. data/lib/generators/jabe/templates/migrations/create_entries.rb +16 -0
  51. data/lib/generators/jabe/templates/migrations/create_settings.rb +21 -0
  52. data/lib/generators/jabe/templates/migrations/create_slugs.rb +18 -0
  53. data/lib/generators/jabe/templates/migrations/devise_create_admins.rb +26 -0
  54. data/lib/jabe.rb +9 -0
  55. data/public/.htaccess +220 -0
  56. data/public/apple-touch-icon.png +0 -0
  57. data/public/blackbird/blackbird.css +80 -0
  58. data/public/blackbird/blackbird.js +365 -0
  59. data/public/blackbird/blackbird.png +0 -0
  60. data/public/crossdomain.xml +25 -0
  61. data/public/images/delete_page.png +0 -0
  62. data/public/images/full_page.png +0 -0
  63. data/public/javascripts/application.js +34 -0
  64. data/public/javascripts/jquery-ui.js +11511 -0
  65. data/public/javascripts/jquery-ui.min.js +404 -0
  66. data/public/javascripts/jquery.js +7179 -0
  67. data/public/javascripts/jquery.min.js +167 -0
  68. data/public/javascripts/libs/dd_belatedpng.js +13 -0
  69. data/public/javascripts/libs/modernizr-1.6.min.js +30 -0
  70. data/public/javascripts/libs/profiling/charts.swf +0 -0
  71. data/public/javascripts/libs/profiling/config.js +59 -0
  72. data/public/javascripts/libs/profiling/yahoo-profiling.css +7 -0
  73. data/public/javascripts/libs/profiling/yahoo-profiling.min.js +39 -0
  74. data/public/javascripts/plugins.js +40 -0
  75. data/public/javascripts/rails.js +154 -0
  76. data/public/nginx.conf +108 -0
  77. data/public/robots.txt +5 -0
  78. data/spec/support/blueprints.rb +31 -0
  79. data/test/dummy/app/controllers/application_controller.rb +3 -0
  80. data/test/dummy/app/helpers/application_helper.rb +2 -0
  81. data/test/dummy/config/application.rb +45 -0
  82. data/test/dummy/config/boot.rb +10 -0
  83. data/test/dummy/config/environment.rb +5 -0
  84. data/test/dummy/config/environments/development.rb +26 -0
  85. data/test/dummy/config/environments/production.rb +49 -0
  86. data/test/dummy/config/environments/test.rb +35 -0
  87. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  88. data/test/dummy/config/initializers/devise.rb +142 -0
  89. data/test/dummy/config/initializers/inflections.rb +10 -0
  90. data/test/dummy/config/initializers/mime_types.rb +5 -0
  91. data/test/dummy/config/initializers/secret_token.rb +7 -0
  92. data/test/dummy/config/initializers/session_store.rb +8 -0
  93. data/test/dummy/config/routes.rb +58 -0
  94. data/test/dummy/db/migrate/20101229224027_create_settings.rb +21 -0
  95. data/test/dummy/db/migrate/20101229224028_create_slugs.rb +18 -0
  96. data/test/dummy/db/migrate/20101229224029_devise_create_admins.rb +26 -0
  97. data/test/dummy/db/migrate/20101229224030_create_entries.rb +16 -0
  98. data/test/dummy/db/migrate/20101229224031_create_comments.rb +20 -0
  99. data/test/dummy/db/schema.rb +82 -0
  100. data/test/dummy/vendor/plugins/acts_as_textiled/init.rb +8 -0
  101. data/test/dummy/vendor/plugins/acts_as_textiled/lib/acts_as_textiled.rb +108 -0
  102. data/test/dummy/vendor/plugins/acts_as_textiled/test/fixtures/author.rb +4 -0
  103. data/test/dummy/vendor/plugins/acts_as_textiled/test/fixtures/story.rb +4 -0
  104. data/test/dummy/vendor/plugins/acts_as_textiled/test/helper.rb +87 -0
  105. data/test/dummy/vendor/plugins/acts_as_textiled/test/textiled_test.rb +145 -0
  106. metadata +641 -0
@@ -0,0 +1,37 @@
1
+ module NavigationHelpers
2
+ # Maps a name to a path. Used by the
3
+ #
4
+ # When /^I go to (.+)$/ do |page_name|
5
+ #
6
+ # step definition in web_steps.rb
7
+ #
8
+ def path_to(page_name)
9
+ case page_name
10
+
11
+ when /the home\s?page/
12
+ '/'
13
+ when 'the admin home page'
14
+ admin_root_path
15
+ when 'the entry page'
16
+ entry_path(Entry.last)
17
+
18
+ # Add more mappings here.
19
+ # Here is an example that pulls values out of the Regexp:
20
+ #
21
+ # when /^(.*)'s profile page$/i
22
+ # user_profile_path(User.find_by_login($1))
23
+
24
+ else
25
+ begin
26
+ page_name =~ /the (.*) page/
27
+ path_components = $1.split(/\s+/)
28
+ self.send(path_components.push('path').join('_').to_sym)
29
+ rescue Object => e
30
+ raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
31
+ "Now, go and add a mapping in #{__FILE__}"
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ World(NavigationHelpers)
@@ -0,0 +1,42 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+
4
+ module Jabe
5
+ module Generators
6
+ class MigrationsGenerator < Rails::Generators::Base
7
+ include Rails::Generators::Migration
8
+
9
+ self.source_root(File.expand_path(
10
+ File.join(__FILE__, '..', '..', 'templates', 'migrations'))
11
+ )
12
+
13
+ desc "run this generator to create the necessary migrations"
14
+
15
+ def create_migrations
16
+ existing_migrations = Dir["db/migrate/*.rb"]
17
+ migrations = %w(
18
+ create_settings.rb
19
+ create_slugs.rb
20
+ devise_create_admins.rb
21
+ create_entries.rb
22
+ create_comments.rb
23
+ ).reject { |file|
24
+ existing_migrations.any? { |migration|
25
+ match = migration.match(/#{file}$/)
26
+ puts "skipping #{file}, exists." if match
27
+ match
28
+ }
29
+ }
30
+
31
+ migrations.each do |migration|
32
+ migration_template migration, "db/migrate/#{migration}"
33
+ sleep 1 # timestamps...
34
+ end
35
+ end
36
+
37
+ def self.next_migration_number(dirname)
38
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,20 @@
1
+ class CreateComments < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :comments do |t|
4
+ t.integer :entry_id
5
+ t.string :name
6
+ t.string :email
7
+ t.string :url
8
+ t.text :body
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :comments, :entry_id
14
+ end
15
+
16
+ def self.down
17
+ remove_index :comments, :entry_id
18
+ drop_table :comments
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ class CreateEntries < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :entries do |t|
4
+ t.string :cached_slug
5
+ t.string :title
6
+ t.text :body
7
+ t.boolean :draft
8
+ t.datetime :published_at
9
+ t.timestamps
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :entries
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ class CreateSettings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :settings do |t|
4
+ t.string :site_url
5
+ t.string :host_name
6
+ t.string :mail_from
7
+ t.string :site_name
8
+ t.string :tagline
9
+ t.string :time_zone
10
+ t.string :google_tracker_id
11
+ t.boolean :blackbird_enabled
12
+ t.integer :entries_per_page
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+
18
+ def self.down
19
+ drop_table :settings
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ class CreateSlugs < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :slugs do |t|
4
+ t.string :name
5
+ t.integer :sluggable_id
6
+ t.integer :sequence, :null => false, :default => 1
7
+ t.string :sluggable_type, :limit => 40
8
+ t.string :scope
9
+ t.datetime :created_at
10
+ end
11
+ add_index :slugs, :sluggable_id
12
+ add_index :slugs, [:name, :sluggable_type, :sequence, :scope], :name => "index_slugs_on_n_s_s_and_s", :unique => true
13
+ end
14
+
15
+ def self.down
16
+ drop_table :slugs
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ class DeviseCreateAdmins < ActiveRecord::Migration
2
+ def self.up
3
+ create_table(:admins) do |t|
4
+ t.database_authenticatable :null => false
5
+ t.recoverable
6
+ t.rememberable
7
+ t.trackable
8
+
9
+ # t.confirmable
10
+ # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
11
+ # t.token_authenticatable
12
+
13
+
14
+ t.timestamps
15
+ end
16
+
17
+ add_index :admins, :email, :unique => true
18
+ add_index :admins, :reset_password_token, :unique => true
19
+ # add_index :admins, :confirmation_token, :unique => true
20
+ # add_index :admins, :unlock_token, :unique => true
21
+ end
22
+
23
+ def self.down
24
+ drop_table :admins
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ require "rails/all"
2
+
3
+ module Jabe
4
+ class Engine < Rails::Engine
5
+ initializer "static assets" do |app|
6
+ app.middleware.use ::ActionDispatch::Static, "#{root}/public"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,220 @@
1
+ # Apache configuration file
2
+ # httpd.apache.org/docs/2.2/mod/quickreference.html
3
+
4
+ # Techniques in here adapted from all over, including:
5
+ # Kroc Camen: camendesign.com/.htaccess
6
+ # perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/
7
+
8
+
9
+ # Force the latest IE version, in various cases when it may fall back to IE7 mode
10
+ # github.com/rails/rails/commit/123eb25#commitcomment-118920
11
+ # Use ChromeFrame if it's installed for a better experience for the poor IE folk
12
+ <IfModule mod_setenvif.c>
13
+ <IfModule mod_headers.c>
14
+ BrowserMatch MSIE ie
15
+ Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
16
+ </IfModule>
17
+ </IfModule>
18
+
19
+ <IfModule mod_headers.c>
20
+ # Because X-UA-Compatible isn't sent to non-IE (to save header bytes),
21
+ # We need to inform proxies that content changes based on UA
22
+ Header append Vary User-Agent
23
+ # Cache control is set only if mod_headers is enabled, so that's unncessary to declare
24
+ </IfModule>
25
+
26
+ # hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/
27
+ # Disabled. Uncomment to serve cross-domain ajax requests
28
+ #<IfModule mod_headers.c>
29
+ # Header set Access-Control-Allow-Origin "*"
30
+ #</IfModule>
31
+
32
+
33
+
34
+
35
+ # allow access from all domains for webfonts
36
+ # alternatively you could only whitelist
37
+ # your subdomains like "sub.domain.com"
38
+
39
+ <FilesMatch "\.(ttf|otf|eot|woff|font.css)$">
40
+ <IfModule mod_headers.c>
41
+ Header set Access-Control-Allow-Origin "*"
42
+ </IfModule>
43
+ </FilesMatch>
44
+
45
+
46
+ # video
47
+ AddType video/ogg ogg ogv
48
+ AddType video/mp4 mp4
49
+ AddType video/webm webm
50
+
51
+ # Proper svg serving. Required for svg webfonts on iPad
52
+ # twitter.com/FontSquirrel/status/14855840545
53
+ AddType image/svg+xml svg svgz
54
+ AddEncoding gzip svgz
55
+
56
+ # webfonts
57
+ AddType application/vnd.ms-fontobject eot
58
+ AddType font/truetype ttf
59
+ AddType font/opentype otf
60
+ AddType font/woff woff
61
+
62
+ # assorted types
63
+ AddType image/vnd.microsoft.icon ico
64
+ AddType image/webp webp
65
+ AddType text/cache-manifest manifest
66
+ AddType text/x-component htc
67
+ AddType application/x-chrome-extension crx
68
+
69
+
70
+
71
+
72
+ # allow concatenation from within specific js and css files
73
+
74
+ # e.g. Inside of script.combined.js you could have
75
+ # <!--#include file="jquery-1.4.2.js" -->
76
+ # <!--#include file="jquery.idletimer.js" -->
77
+ # and they would be included into this single file
78
+
79
+ # this is not in use in the boilerplate as it stands. you may
80
+ # choose to name your files in this way for this advantage
81
+ # or concatenate and minify them manually.
82
+ # Disabled by default.
83
+
84
+ # <FilesMatch "\.combined\.(js|css)$">
85
+ # Options +Includes
86
+ # SetOutputFilter INCLUDES
87
+ # </FilesMatch>
88
+
89
+
90
+
91
+
92
+
93
+ # gzip compression.
94
+ <IfModule mod_deflate.c>
95
+
96
+ # html, txt, css, js, json, xml, htc:
97
+ AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
98
+ AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript
99
+ AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
100
+
101
+ # webfonts and svg:
102
+ <FilesMatch "\.(ttf|otf|eot|svg)$" >
103
+ SetOutputFilter DEFLATE
104
+ </FilesMatch>
105
+ </IfModule>
106
+
107
+
108
+
109
+ # these are pretty far-future expires headers
110
+ # they assume you control versioning with cachebusting query params like
111
+ # <script src="application.js?20100608">
112
+ # additionally, consider that outdated proxies may miscache
113
+ # www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
114
+
115
+ # if you don't use filenames to version, lower the css and js to something like
116
+ # "access plus 1 week" or so
117
+
118
+ <IfModule mod_expires.c>
119
+ Header set Cache-Control "public"
120
+ ExpiresActive on
121
+
122
+ # Perhaps better to whitelist expires rules? Perhaps.
123
+ ExpiresDefault "access plus 1 month"
124
+
125
+ # cache.manifest needs re-requests in FF 3.6 (thx Remy ~Introducing HTML5)
126
+ ExpiresByType text/cache-manifest "access plus 0 seconds"
127
+
128
+ # your document html
129
+ ExpiresByType text/html "access plus 0 seconds"
130
+
131
+ # data
132
+ ExpiresByType text/xml "access plus 0 seconds"
133
+ ExpiresByType application/xml "access plus 0 seconds"
134
+ ExpiresByType application/json "access plus 0 seconds"
135
+
136
+
137
+ # rss feed
138
+ ExpiresByType application/rss+xml "access plus 1 hour"
139
+
140
+ # favicon (cannot be renamed)
141
+ ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
142
+
143
+ # media: images, video, audio
144
+ ExpiresByType image/gif "access plus 1 month"
145
+ ExpiresByType image/png "access plus 1 month"
146
+ ExpiresByType image/jpg "access plus 1 month"
147
+ ExpiresByType image/jpeg "access plus 1 month"
148
+ ExpiresByType video/ogg "access plus 1 month"
149
+ ExpiresByType audio/ogg "access plus 1 month"
150
+ ExpiresByType video/mp4 "access plus 1 month"
151
+ ExpiresByType video/webm "access plus 1 month"
152
+
153
+ # webfonts
154
+ ExpiresByType font/truetype "access plus 1 month"
155
+ ExpiresByType font/opentype "access plus 1 month"
156
+ ExpiresByType font/woff "access plus 1 month"
157
+ ExpiresByType image/svg+xml "access plus 1 month"
158
+ ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
159
+
160
+ # css and javascript
161
+ ExpiresByType text/css "access plus 1 month"
162
+ ExpiresByType application/javascript "access plus 1 month"
163
+ ExpiresByType text/javascript "access plus 1 month"
164
+ </IfModule>
165
+
166
+
167
+
168
+
169
+ # Since we're sending far-future expires, we don't need ETags for
170
+ # static content.
171
+ # developer.yahoo.com/performance/rules.html#etags
172
+ FileETag None
173
+
174
+
175
+
176
+
177
+ # Allow cookies to be set from iframes (for IE only)
178
+ # If needed, uncomment and specify a path or regex in the Location directive
179
+
180
+ # <IfModule mod_headers.c>
181
+ # <Location />
182
+ # Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
183
+ # </Location>
184
+ # </IfModule>
185
+
186
+
187
+ # you probably want www.example.com to forward to example.com -- shorter URLs are sexier.
188
+ # no-www.org/faq.php?q=class_b
189
+ <IfModule mod_rewrite.c>
190
+ RewriteEngine On
191
+ RewriteCond %{HTTPS} !=on
192
+ RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
193
+ RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
194
+ </IfModule>
195
+
196
+ # without -MultiViews, Apache will give a 404 for a rewrite if a folder of the same name does not exist
197
+ # e.g. /blog/hello : webmasterworld.com/apache/3808792.htm
198
+ Options -MultiViews
199
+ # -Indexes will have Apache block users from browsing folders without a default document
200
+ # Options -Indexes
201
+
202
+
203
+
204
+ # custom 404 page
205
+ ErrorDocument 404 /404.html
206
+
207
+
208
+
209
+ # use utf-8 encoding for anything served text/plain or text/html
210
+ AddDefaultCharset utf-8
211
+ # force utf-8 for a number of file formats
212
+ AddCharset utf-8 .html .css .js .xml .json .rss
213
+
214
+
215
+
216
+ # We don't need to tell everyone we're apache.
217
+ ServerSignature Off
218
+
219
+
220
+
@@ -0,0 +1,80 @@
1
+ /*
2
+ Blackbird - Open Source JavaScript Logging Utility
3
+ Author: G Scott Olson
4
+ Web: http://blackbirdjs.googlecode.com/
5
+ http://www.gscottolson.com/blackbirdjs/
6
+ Version: 1.0
7
+
8
+ The MIT License - Copyright (c) 2008 Blackbird Project
9
+ */
10
+ #blackbird { margin:0; padding:0; position:fixed; _position:absolute; font:11px/1.3 Consolas, 'Lucida Console', Monaco, monospace; _border:2px solid #BBB; }
11
+ #blackbird.bb-top-left { top:0; left:0; _top:expression(eval(document.documentElement.scrollTop+8)); _left:expression(eval(document.documentElement.scrollLeft+8)); }
12
+ #blackbird.bb-top-right { top:0; right:0; }
13
+ * html .bb-top-right { right:auto; top:expression(eval(document.documentElement.scrollTop+8)); left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById('blackbird').offsetWidth-8)); }
14
+ #blackbird.bb-bottom-left { bottom:0; left:0; }
15
+ * html .bb-bottom-left { bottom:auto; top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById('blackbird').offsetHeight-8)); left:expression(eval(document.documentElement.scrollLeft+8)); }
16
+ #blackbird.bb-bottom-right { bottom:0; right:0; }
17
+ * html .bb-bottom-right { bottom:auto; right:auto; top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById('blackbird').offsetHeight-8)); left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById('blackbird').offsetWidth-8)); }
18
+
19
+ #blackbird.bb-small { width:300px; _width:272px; }
20
+ #blackbird.bb-small .bb-header { _width:272px; }
21
+ #blackbird.bb-small .bb-header div.bb-left, #blackbird.bb-small .bb-footer div.bb-left { width:150px; }
22
+ #blackbird.bb-small .bb-main { _width:272px; }
23
+ #blackbird.bb-small .bb-main div { height:200px; }
24
+ #blackbird.bb-small .bb-main div.bb-mainBody { width:272px; }
25
+ #blackbird.bb-small .bb-footer { _width:272px; }
26
+
27
+ #blackbird.bb-large { width:500px; _width:472px; }
28
+ #blackbird.bb-large .bb-header { _width:472px; }
29
+ #blackbird.bb-large .bb-header div.bb-left, #blackbird.bb-large .bb-footer div.bb-left { width:350px; }
30
+ #blackbird.bb-large .bb-main { _width:472px; }
31
+ #blackbird.bb-large .bb-main div { height:500px; }
32
+ #blackbird.bb-large .bb-main div.bb-mainBody { width:472px; }
33
+ #blackbird.bb-large .bb-footer { _width:472px; }
34
+
35
+ #blackbird .bb-header span { cursor: pointer; position:relative; width:16px; height:16px; margin:0 4px; float:left; background-image:url(blackbird.png); background-repeat:no-repeat; }
36
+ #blackbird .bb-header span.bb-error { background-position:100% -84px; }
37
+ #blackbird .bb-header span.bb-warn { background-position:100% -100px; }
38
+ #blackbird .bb-header span.bb-info { background-position:100% -116px; }
39
+ #blackbird .bb-header span.bb-debug { background-position:100% -132px; }
40
+ #blackbird .bb-header span.bb-profile { background-position:100% -148px; }
41
+ #blackbird .bb-header span.bb-close { background-position:100% -68px; }
42
+ #blackbird .bb-header span.bb-clear { background-position:100% -52px; }
43
+ #blackbird .bb-header span.bb-contract { background-position:100% -20px; }
44
+ #blackbird .bb-header span.bb-expand { background-position:100% -36px; }
45
+ #blackbird .bb-header span.bb-disabled { opacity: 0.4; *filter:alpha(opacity=40); }
46
+
47
+ #blackbird .bb-header > div, #blackbird .bb-main > div, #blackbird .bb-footer > div { background-image:url(blackbird.png); background-repeat:no-repeat; }
48
+
49
+ #blackbird .bb-header div { float:left; _background-color:#000; }
50
+ #blackbird .bb-header div.bb-left { background-position:0 0; height:40px; _height:16px; }
51
+ #blackbird #bbFilters { margin-left: -4px; padding:16px 0 0 19px; float:left; _padding:6px 8px; }
52
+ #blackbird .bb-header div.bb-right { background-position:-350px 0; height:40px; width:150px; _width:122px; _height:16px; }
53
+ #blackbird #bbControls { padding:16px 24px 0 0; float:right; _padding:6px 8px; }
54
+ #blackbird #bbControls span { margin:0 2px; }
55
+ #blackbird #bbControls span.bb-clear { margin-right:8px; }
56
+
57
+ #blackbird .bb-main div { float:left; }
58
+ #blackbird .bb-main div.bb-left { background-position:0 -30px; width:11px; _width:0; }
59
+ #blackbird .bb-main div.bb-mainBody { background-position:-11px -40px; _background-color:#000; _filter:alpha(opacity='90'); }
60
+ #blackbird .bb-main .bb-mainBody ol { line-height: 1.45; height:100%; overflow:auto; width:100%; list-style-type:none; margin:0; padding:0; }
61
+ #blackbird .bb-main .bb-mainBody ol li { padding:1px 4px 1px 24px; border-bottom: 1px solid #333; color:#CCC; margin: 2px 2px; _text-indent: -2px; }
62
+ #blackbird .bb-main .bb-mainBody ol li span { display:block; _display:inline-block; _font-size:6px; _line-height:0; height: 8px; width: 8px; background: url(blackbird.png) no-repeat 0 0; margin: 3px 0 1px -16px; }
63
+
64
+ #blackbird .bb-main .bb-mainBody ol li.bb-error span { background-position:100% -164px; }
65
+ #blackbird .bb-main .bb-mainBody ol li.bb-warn span { background-position:100% -172px; }
66
+ #blackbird .bb-main .bb-mainBody ol li.bb-info span { background-position:100% -180px; }
67
+ #blackbird .bb-main .bb-mainBody ol li.bb-debug span { background-position:100% -188px; }
68
+ #blackbird .bb-main .bb-mainBody ol li.bb-profile span { background-position:100% -196px; }
69
+
70
+ #blackbird .bb-main .bb-mainBody ol li.bb-profile { color:#DDD; font-style:italic; }
71
+
72
+ #blackbird .bb-error-hidden li.bb-error, #blackbird .bb-warn-hidden li.bb-warn, #blackbird .bb-info-hidden li.bb-info, #blackbird .bb-debug-hidden li.bb-debug, #blackbird .bb-profile-hidden li.bb-profile { display:none; }
73
+
74
+ #blackbird .bb-main div.bb-right { background-position:-483px -30px; width:17px; _width:0; }
75
+
76
+ #blackbird .bb-footer div { height:50px; float:left; _background-color:#000; _height:auto; _filter:alpha(opacity='90'); }
77
+ #blackbird .bb-footer div.bb-left { cursor: pointer; background-position:bottom left; _width:100% !important; font-family:Arial,sans-serif; color:#BBB; padding-top: 10px; height: 40px; _height:auto; _padding:4px 0 6px; }
78
+ #blackbird .bb-footer div.bb-left span { cursor: pointer; display:block; float:left; _float:none; _display:inline-block; _font-size:6px; _line-height:0; background:transparent url(blackbird.png) no-repeat -506px -10px; height:10px; width:10px; margin:2px 4px 0 20px; position:relative; _margin:4px 4px 0 8px; }
79
+ #blackbird .bb-footer div.bb-left span.checked { background-position: -506px 0; }
80
+ #blackbird .bb-footer div.bb-right { background-position:-350px -550px; width:150px; _width:0; }