macournoyer-invisible 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. data/README +63 -0
  2. data/Rakefile +64 -0
  3. data/app_generators/flat/flat_generator.rb +40 -0
  4. data/app_generators/flat/templates/README +10 -0
  5. data/app_generators/flat/templates/app.rb +16 -0
  6. data/app_generators/flat/templates/rack.ru +17 -0
  7. data/app_generators/full/full_generator.rb +80 -0
  8. data/app_generators/full/templates/README +10 -0
  9. data/app_generators/full/templates/Rakefile +16 -0
  10. data/app_generators/full/templates/app.rb +7 -0
  11. data/app_generators/full/templates/config/boot.rb +5 -0
  12. data/app_generators/full/templates/config/env.rb +18 -0
  13. data/app_generators/full/templates/config/env/development.rb +6 -0
  14. data/app_generators/full/templates/config/env/production.rb +7 -0
  15. data/app_generators/full/templates/config/env/test.rb +1 -0
  16. data/app_generators/full/templates/config/rack.ru +6 -0
  17. data/app_generators/full/templates/gitignore +3 -0
  18. data/app_generators/full/templates/public/stylesheets/ie.css +16 -0
  19. data/app_generators/full/templates/public/stylesheets/print.css +21 -0
  20. data/app_generators/full/templates/public/stylesheets/screen.css +242 -0
  21. data/app_generators/full/templates/spec/app_spec.rb +7 -0
  22. data/app_generators/full/templates/spec/spec_helper.rb +14 -0
  23. data/app_generators/full/templates/test/app_test.rb +7 -0
  24. data/app_generators/full/templates/test/test_helper.rb +15 -0
  25. data/app_generators/full/templates/views/layout.erb +18 -0
  26. data/bin/invisible +18 -0
  27. data/invisible.gemspec +119 -0
  28. data/lib/invisible.rb +212 -0
  29. data/lib/invisible/core_ext.rb +12 -0
  30. data/lib/invisible/erb.rb +16 -0
  31. data/lib/invisible/erubis.rb +14 -0
  32. data/lib/invisible/haml.rb +14 -0
  33. data/lib/invisible/helpers.rb +5 -0
  34. data/lib/invisible/mock.rb +20 -0
  35. data/lib/invisible/reloader.rb +22 -0
  36. metadata +119 -0
data/README ADDED
@@ -0,0 +1,63 @@
1
+ = THE INVISIBLE FRAMEWORK
2
+ Invisible is like a giant robot combining the
3
+ awesomeness of Rails, Merb, Camping and Sinatra.
4
+ Except, it's tiny (100 sloc).
5
+
6
+ It's easy to deploy and get started with using the
7
+ friendly generator.
8
+
9
+ Get started today!
10
+
11
+ invisible my_lil_app
12
+ cd my_lil_app
13
+ thin start config/rack.ru
14
+ edit app.rb
15
+
16
+ Or, if you're really into tiny things:
17
+
18
+ invisible my_very_lil_app --flat
19
+
20
+ == Build web apps in just a few lines
21
+ The app syntax looks a lot like Sinatra:
22
+
23
+ get "/session/:value" do
24
+ session[:invisible] = params[:value]
25
+ render do
26
+ h2 "I added this to the session for you:"
27
+ pre params[:value].inspect
28
+ p { a "Go back", :href => "/" }
29
+ end
30
+ end
31
+
32
+ You can also render ERB, eRubis and Haml templates.
33
+
34
+ == TATFT (aka Test all the fucking time)
35
+ Invisible also comes with support for easy
36
+ testing, using Test::Unit or RSpec.
37
+
38
+ def test_should_get_root
39
+ assert get("/").ok?
40
+ end
41
+
42
+ it "should get /" do
43
+ get("/").should be_ok
44
+ end
45
+
46
+ == The extras you were missing in a micro-framework
47
+ Invisible has:
48
+ * reloading
49
+ * configurable multi-environment support
50
+ * multi-app in the same VM
51
+ * session support (Cookie, Memcache, etc.)
52
+ * a love affair with Rack middlewares
53
+ * another love affair with testing
54
+ * load just what you need approach (low mem)
55
+ * awesomeness builtin, twice!
56
+ * all that under 100 LOC (+ taxes)
57
+
58
+ I'm like, WOW! What are you waiting for?
59
+ Go build the next Twitter now, mkay?
60
+
61
+ Ruby License, http://ruby-lang.org/en/LICENSE.txt
62
+ Invisible is copyright Marc-Andre Cournoyer
63
+ macournoyer@gmail.com
@@ -0,0 +1,64 @@
1
+ require "spec/rake/spectask"
2
+ require "yaml"
3
+
4
+ Spec::Rake::SpecTask.new do |t|
5
+ t.spec_opts = %w(-fs -c)
6
+ end
7
+ task :default => :spec
8
+
9
+ desc "Compute LOC in invisible.rb"
10
+ task :size do
11
+ loc = File.read("lib/invisible.rb").split("\n").reject { |l| l =~ /^\s*\#/ || l =~ /^\s*$/ }.size
12
+ puts "#{loc} LOC"
13
+ end
14
+
15
+ namespace :site do
16
+ task :build do
17
+ mkdir_p 'tmp/site/images'
18
+ cd 'tmp/site' do
19
+ sh "SITE_ROOT='/invisible' ruby ../../site/thin.rb --dump"
20
+ end
21
+ cp 'site/style.css', 'tmp/site'
22
+ cp_r Dir['site/images/*'], 'tmp/site/images'
23
+ end
24
+
25
+ desc 'Upload website to code.macournoyer.com'
26
+ task :upload => :build do
27
+ sh %{scp -rq tmp/site/* macournoyer@code.macournoyer.com:code.macournoyer.com/invisible}
28
+ upload 'tmp/site/*', 'invisible'
29
+ end
30
+ end
31
+
32
+
33
+ gemspec = Gem::Specification.new do |s|
34
+ s.name = "invisible"
35
+ s.version = "0.0.1"
36
+ s.date = Time.today.strftime("%Y-%m-%d")
37
+ s.summary = "The Invisible Web Framework"
38
+ s.email = "macournoyer@gmail.com"
39
+ s.homepage = "http://github.com/macournoyer/invisible"
40
+ s.description = "Invisible is like a giant robot combining the awesomeness of Rails, Merb, Camping and Sinatra. Except, it's tiny (100 sloc)."
41
+ s.authors = ["Marc-Andre Cournoyer"]
42
+ s.files = %w(README Rakefile invisible.gemspec) + Dir["{bin,lib,app_generators}/**/*"]
43
+
44
+ # RDoc
45
+ s.has_rdoc = true
46
+ s.rdoc_options = ["--main", "README"]
47
+ s.extra_rdoc_files = ["README"]
48
+
49
+ # Dependencies
50
+ s.add_dependency "rack", ">= 0.4.0"
51
+ s.add_dependency "markaby", ">= 0.5"
52
+
53
+ # Binary
54
+ s.bindir = "bin"
55
+ s.default_executable = "invisible"
56
+ s.executables = "invisible"
57
+ end
58
+
59
+ namespace :gem do
60
+ desc "Update the gemspec for GitHub's gem server"
61
+ task :github do
62
+ File.open("invisible.gemspec", 'w') { |f| f << YAML.dump(gemspec) }
63
+ end
64
+ end
@@ -0,0 +1,40 @@
1
+ class FlatGenerator < RubiGen::Base
2
+ attr_reader :name
3
+
4
+ def initialize(runtime_args, runtime_options = {})
5
+ super
6
+ usage if args.empty?
7
+ @destination_root = File.expand_path(args.shift)
8
+ @name = base_name
9
+ extract_options
10
+ end
11
+
12
+ def manifest
13
+ record do |m|
14
+ # Root directory and all subdirectories.
15
+ m.directory ''
16
+
17
+ # Templates
18
+ m.template_copy_each %w( README )
19
+
20
+ # Static files
21
+ m.file_copy_each %w( app.rb
22
+ rack.ru )
23
+ end
24
+ end
25
+
26
+ protected
27
+ def banner
28
+ <<-EOS
29
+ Creates a new Invisible app with just the minimum.
30
+
31
+ USAGE: invisible my_app --flat [options]
32
+ EOS
33
+ end
34
+
35
+ def add_options!(opts)
36
+ end
37
+
38
+ def extract_options
39
+ end
40
+ end
@@ -0,0 +1,10 @@
1
+ <%= name.titleize %>
2
+ <%= "=" * name.titleize.size %>
3
+
4
+ Run with Thin:
5
+
6
+ thin start -R rack.ru
7
+
8
+ Or Rack rackup command, using Mongrel (by default):
9
+
10
+ rackup rack.ru
@@ -0,0 +1,16 @@
1
+ layout do
2
+ html do
3
+ head do
4
+ title 'Invisible'
5
+ end
6
+ body do
7
+ self << @content
8
+ end
9
+ end
10
+ end
11
+
12
+ get "/" do
13
+ render do
14
+ h1 "This is Invisible"
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require "rubygems"
2
+ require "invisible"
3
+
4
+ RACK_ENV = ENV["RACK_ENV"] ||= "development"
5
+
6
+ Invisible.run do
7
+ if RACK_ENV == "development"
8
+ require "invisible/reloader"
9
+
10
+ use Invisible::Reloader, self
11
+ use Rack::ShowExceptions
12
+ use Rack::CommonLogger
13
+ use Rack::Lint
14
+ end
15
+
16
+ load "app"
17
+ end
@@ -0,0 +1,80 @@
1
+ class FullGenerator < RubiGen::Base
2
+ attr_reader :name
3
+
4
+ def initialize(runtime_args, runtime_options = {})
5
+ super
6
+ usage if args.empty?
7
+ @destination_root = File.expand_path(args.shift)
8
+ @name = base_name
9
+ extract_options
10
+ end
11
+
12
+ def manifest
13
+ record do |m|
14
+ # Root directory and all subdirectories.
15
+ m.directory ''
16
+ m.directory 'config'
17
+ m.directory 'config/env'
18
+ m.directory 'lib'
19
+ m.directory 'public'
20
+ m.directory 'public/stylesheets'
21
+ m.directory 'public/javascripts'
22
+ m.directory 'public/images'
23
+ m.directory 'views'
24
+
25
+ # Templates
26
+ m.template_copy_each %w( README Rakefile )
27
+
28
+ # Static files
29
+ m.file_copy_each %w( app.rb
30
+ config/boot.rb
31
+ config/env/production.rb
32
+ config/env/development.rb
33
+ config/env/test.rb
34
+ config/env.rb
35
+ config/rack.ru
36
+ public/stylesheets/ie.css
37
+ public/stylesheets/print.css
38
+ public/stylesheets/screen.css
39
+ views/layout.erb )
40
+
41
+ if options[:rspec]
42
+ m.directory 'spec'
43
+ m.file_copy_each %w( spec/spec_helper.rb
44
+ spec/app_spec.rb )
45
+ else # Test::Unit
46
+ m.directory 'test'
47
+ m.file_copy_each %w( test/test_helper.rb
48
+ test/app_test.rb )
49
+ end
50
+
51
+ if options[:git]
52
+ m.file "gitignore", ".gitignore"
53
+ end
54
+ end
55
+ end
56
+
57
+ protected
58
+ def banner
59
+ <<-EOS
60
+ Creates a new Invisible app.
61
+
62
+ USAGE: invisible my_app [options]
63
+ EOS
64
+ end
65
+
66
+ def add_options!(opts)
67
+ opts.separator ''
68
+ opts.separator 'Options:'
69
+ opts.on("-S", "--rspec", "Use RSpec for testing (default to Test::Unit)") { |options[:rspec]| }
70
+ opts.on("-g", "--git", "Add Git stuff (default: true)") { |options[:git]| }
71
+ opts.on( "--flat", "Generate just the bare minimum files to run")
72
+ end
73
+
74
+ def extract_options
75
+ # for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
76
+ # Templates can access these value via the attr_reader-generated methods, but not the
77
+ # raw instance variable value.
78
+ # @author = options[:author]
79
+ end
80
+ end
@@ -0,0 +1,10 @@
1
+ <%= name.titleize %>
2
+ <%= "=" * name.titleize.size %>
3
+
4
+ Run with Thin:
5
+
6
+ thin start -R config/rack.ru
7
+
8
+ Or Rack rackup command, using Mongrel (by default):
9
+
10
+ rackup config/rack.ru
@@ -0,0 +1,16 @@
1
+ <% if options[:rspec] %>
2
+ require 'spec/rake/spectask'
3
+
4
+ Spec::Rake::SpecTask.new do |t|
5
+ t.spec_opts = %w(-fs -c)
6
+ end
7
+ task :default => :spec
8
+ <% else %>
9
+ require 'rake/testtask'
10
+
11
+ Rake::TestTask.new do |t|
12
+ t.pattern = "test/**/*_test.rb"
13
+ t.verbose = true
14
+ end
15
+ task :default => :test
16
+ <% end %>
@@ -0,0 +1,7 @@
1
+ layout { erb(:layout) }
2
+
3
+ get "/" do
4
+ render do
5
+ h1 "This is Invisible"
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ require "rubygems"
2
+ require "invisible"
3
+ $:.unshift File.dirname(__FILE__) + "/../lib"
4
+
5
+ RACK_ENV = ENV["RACK_ENV"] ||= "development"
@@ -0,0 +1,18 @@
1
+ # Optional Invisible libs
2
+ require "invisible/erb"
3
+ # require "invisible/erubis" Remove previous if you uncomment this
4
+ # require "invisible/haml"
5
+
6
+ load "config/env/#{RACK_ENV}", :reload => false
7
+
8
+ # If you want to split your app in several files,
9
+ # load all the files here.
10
+ load "app"
11
+
12
+ # Install middleware for session support.
13
+ # See http://rack.rubyforge.org/doc/classes/Rack/Session.html
14
+ use Rack::Session::Cookie
15
+
16
+ # To serve static files
17
+ use Rack::Static, :urls => %w(/stylesheets /javascripts /images),
18
+ :root => root + "/public"
@@ -0,0 +1,6 @@
1
+ require "invisible/reloader"
2
+
3
+ use Invisible::Reloader, self
4
+ use Rack::ShowExceptions
5
+ use Rack::CommonLogger
6
+ use Rack::Lint
@@ -0,0 +1,7 @@
1
+ # Setup caching.
2
+ # See http://tomayko.com/src/rack-cache/
3
+ # require 'rack/cache'
4
+ # use Rack::Cache,
5
+ # :verbose => true,
6
+ # :metastore => "file:/#{root}/tmp/cache/meta"
7
+ # :entitystore => "file:/#{root}/tmp/cache/body"
@@ -0,0 +1 @@
1
+ use Rack::Lint
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + "/boot"
2
+
3
+ Invisible.run do
4
+ root File.dirname(__FILE__) + "/.."
5
+ load "config/env", :reload => false
6
+ end
@@ -0,0 +1,3 @@
1
+ *.cache
2
+ tmp
3
+ log
@@ -0,0 +1,16 @@
1
+ /* Blueprint CSS Framework 0.7.1
2
+ * http://blueprintcss.googlecode.com
3
+ * Copyright (c) 2007-2008 Olav Bjorkoy (olav at bjorkoy.com) */
4
+
5
+ /* ie.css */
6
+ body {text-align:center;}
7
+ .container {text-align:left;}
8
+ * html .column {overflow-x:hidden;}
9
+ * html legend {margin:-18px -8px 16px 0;padding:0;}
10
+ ol {margin-left:2em;}
11
+ sup {vertical-align:text-top;}
12
+ sub {vertical-align:text-bottom;}
13
+ html>body p code {*white-space:normal;}
14
+ hr {margin:-8px auto 11px;}
15
+ .clearfix, .container {display:inline-block;}
16
+ * html .clearfix, * html .container {height:1%;}
@@ -0,0 +1,21 @@
1
+ /* Blueprint CSS Framework 0.7.1
2
+ * http://blueprintcss.googlecode.com
3
+ * Copyright (c) 2007-2008 Olav Bjorkoy (olav at bjorkoy.com) */
4
+
5
+ /* print.css */
6
+ body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;}
7
+ .container {background:none;}
8
+ hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;}
9
+ hr.space {background:#fff;color:#fff;}
10
+ h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;}
11
+ code {font:.9em "Courier New", Monaco, Courier, monospace;}
12
+ img {float:left;margin:1.5em 1.5em 1.5em 0;}
13
+ a img {border:none;}
14
+ p img.top {margin-top:0;}
15
+ blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;}
16
+ .small {font-size:.9em;}
17
+ .large {font-size:1.1em;}
18
+ .quiet {color:#999;}
19
+ .hide {display:none;}
20
+ a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;}
21
+ a:link:after, a:visited:after {content:" (" attr(href) ") ";font-size:90%;}
@@ -0,0 +1,242 @@
1
+ /* Blueprint CSS Framework 0.7.1
2
+ * http://blueprintcss.googlecode.com
3
+ * Copyright (c) 2007-2008 Olav Bjorkoy (olav at bjorkoy.com) */
4
+
5
+ /* reset.css */
6
+ html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
7
+ body {line-height:1.5;}
8
+ table {border-collapse:separate;border-spacing:0;}
9
+ caption, th, td {text-align:left;font-weight:normal;}
10
+ table, td, th {vertical-align:middle;}
11
+ blockquote:before, blockquote:after, q:before, q:after {content:"";}
12
+ blockquote, q {quotes:"" "";}
13
+ a img {border:none;}
14
+
15
+ /* typography.css */
16
+ body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;}
17
+ h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
18
+ h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
19
+ h2 {font-size:2em;margin-bottom:0.75em;}
20
+ h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
21
+ h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
22
+ h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
23
+ h6 {font-size:1em;font-weight:bold;}
24
+ h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
25
+ p {margin:0 0 1.5em;}
26
+ p img {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;}
27
+ p img.right {float:right;margin:1.5em 0 1.5em 1.5em;}
28
+ a:focus, a:hover {color:#000;}
29
+ a {color:#009;text-decoration:underline;}
30
+ blockquote {margin:1.5em;color:#666;font-style:italic;}
31
+ strong {font-weight:bold;}
32
+ em, dfn {font-style:italic;}
33
+ dfn {font-weight:bold;}
34
+ sup, sub {line-height:0;}
35
+ abbr, acronym {border-bottom:1px dotted #666;}
36
+ address {margin:0 0 1.5em;font-style:italic;}
37
+ del {color:#666;}
38
+ pre {margin:1.5em 0;white-space:pre;}
39
+ pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
40
+ li ul, li ol {margin:0 1.5em;}
41
+ ul, ol {margin:0 1.5em 1.5em 1.5em;}
42
+ ul {list-style-type:disc;}
43
+ ol {list-style-type:decimal;}
44
+ dl {margin:0 0 1.5em 0;}
45
+ dl dt {font-weight:bold;}
46
+ dd {margin-left:1.5em;}
47
+ table {margin-bottom:1.4em;width:100%;}
48
+ th {font-weight:bold;background:#C3D9FF;}
49
+ th, td {padding:4px 10px 4px 5px;}
50
+ tr.even td {background:#E5ECF9;}
51
+ tfoot {font-style:italic;}
52
+ caption {background:#eee;}
53
+ .small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
54
+ .large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
55
+ .hide {display:none;}
56
+ .quiet {color:#666;}
57
+ .loud {color:#000;}
58
+ .highlight {background:#ff0;}
59
+ .added {background:#060;color:#fff;}
60
+ .removed {background:#900;color:#fff;}
61
+ .first {margin-left:0;padding-left:0;}
62
+ .last {margin-right:0;padding-right:0;}
63
+ .top {margin-top:0;padding-top:0;}
64
+ .bottom {margin-bottom:0;padding-bottom:0;}
65
+
66
+ /* grid.css */
67
+ .container {width:950px;margin:0 auto;}
68
+ .showgrid {background:url(src/grid.png);}
69
+ body {margin:1.5em 0;}
70
+ .column, div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23, div.span-24 {float:left;margin-right:10px;}
71
+ .last, div.last {margin-right:0;}
72
+ .span-1 {width:30px;}
73
+ .span-2 {width:70px;}
74
+ .span-3 {width:110px;}
75
+ .span-4 {width:150px;}
76
+ .span-5 {width:190px;}
77
+ .span-6 {width:230px;}
78
+ .span-7 {width:270px;}
79
+ .span-8 {width:310px;}
80
+ .span-9 {width:350px;}
81
+ .span-10 {width:390px;}
82
+ .span-11 {width:430px;}
83
+ .span-12 {width:470px;}
84
+ .span-13 {width:510px;}
85
+ .span-14 {width:550px;}
86
+ .span-15 {width:590px;}
87
+ .span-16 {width:630px;}
88
+ .span-17 {width:670px;}
89
+ .span-18 {width:710px;}
90
+ .span-19 {width:750px;}
91
+ .span-20 {width:790px;}
92
+ .span-21 {width:830px;}
93
+ .span-22 {width:870px;}
94
+ .span-23 {width:910px;}
95
+ .span-24, div.span-24 {width:950px;margin:0;}
96
+ input.span-1, textarea.span-1, select.span-1 {width:30px!important;}
97
+ input.span-2, textarea.span-2, select.span-2 {width:50px!important;}
98
+ input.span-3, textarea.span-3, select.span-3 {width:90px!important;}
99
+ input.span-4, textarea.span-4, select.span-4 {width:130px!important;}
100
+ input.span-5, textarea.span-5, select.span-5 {width:170px!important;}
101
+ input.span-6, textarea.span-6, select.span-6 {width:210px!important;}
102
+ input.span-7, textarea.span-7, select.span-7 {width:250px!important;}
103
+ input.span-8, textarea.span-8, select.span-8 {width:290px!important;}
104
+ input.span-9, textarea.span-9, select.span-9 {width:330px!important;}
105
+ input.span-10, textarea.span-10, select.span-10 {width:370px!important;}
106
+ input.span-11, textarea.span-11, select.span-11 {width:410px!important;}
107
+ input.span-12, textarea.span-12, select.span-12 {width:450px!important;}
108
+ input.span-13, textarea.span-13, select.span-13 {width:490px!important;}
109
+ input.span-14, textarea.span-14, select.span-14 {width:530px!important;}
110
+ input.span-15, textarea.span-15, select.span-15 {width:570px!important;}
111
+ input.span-16, textarea.span-16, select.span-16 {width:610px!important;}
112
+ input.span-17, textarea.span-17, select.span-17 {width:650px!important;}
113
+ input.span-18, textarea.span-18, select.span-18 {width:690px!important;}
114
+ input.span-19, textarea.span-19, select.span-19 {width:730px!important;}
115
+ input.span-20, textarea.span-20, select.span-20 {width:770px!important;}
116
+ input.span-21, textarea.span-21, select.span-21 {width:810px!important;}
117
+ input.span-22, textarea.span-22, select.span-22 {width:850px!important;}
118
+ input.span-23, textarea.span-23, select.span-23 {width:890px!important;}
119
+ input.span-24, textarea.span-24, select.span-24 {width:940px!important;}
120
+ .append-1 {padding-right:40px;}
121
+ .append-2 {padding-right:80px;}
122
+ .append-3 {padding-right:120px;}
123
+ .append-4 {padding-right:160px;}
124
+ .append-5 {padding-right:200px;}
125
+ .append-6 {padding-right:240px;}
126
+ .append-7 {padding-right:280px;}
127
+ .append-8 {padding-right:320px;}
128
+ .append-9 {padding-right:360px;}
129
+ .append-10 {padding-right:400px;}
130
+ .append-11 {padding-right:440px;}
131
+ .append-12 {padding-right:480px;}
132
+ .append-13 {padding-right:520px;}
133
+ .append-14 {padding-right:560px;}
134
+ .append-15 {padding-right:600px;}
135
+ .append-16 {padding-right:640px;}
136
+ .append-17 {padding-right:680px;}
137
+ .append-18 {padding-right:720px;}
138
+ .append-19 {padding-right:760px;}
139
+ .append-20 {padding-right:800px;}
140
+ .append-21 {padding-right:840px;}
141
+ .append-22 {padding-right:880px;}
142
+ .append-23 {padding-right:920px;}
143
+ .prepend-1 {padding-left:40px;}
144
+ .prepend-2 {padding-left:80px;}
145
+ .prepend-3 {padding-left:120px;}
146
+ .prepend-4 {padding-left:160px;}
147
+ .prepend-5 {padding-left:200px;}
148
+ .prepend-6 {padding-left:240px;}
149
+ .prepend-7 {padding-left:280px;}
150
+ .prepend-8 {padding-left:320px;}
151
+ .prepend-9 {padding-left:360px;}
152
+ .prepend-10 {padding-left:400px;}
153
+ .prepend-11 {padding-left:440px;}
154
+ .prepend-12 {padding-left:480px;}
155
+ .prepend-13 {padding-left:520px;}
156
+ .prepend-14 {padding-left:560px;}
157
+ .prepend-15 {padding-left:600px;}
158
+ .prepend-16 {padding-left:640px;}
159
+ .prepend-17 {padding-left:680px;}
160
+ .prepend-18 {padding-left:720px;}
161
+ .prepend-19 {padding-left:760px;}
162
+ .prepend-20 {padding-left:800px;}
163
+ .prepend-21 {padding-left:840px;}
164
+ .prepend-22 {padding-left:880px;}
165
+ .prepend-23 {padding-left:920px;}
166
+ div.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;}
167
+ div.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;}
168
+ .pull-1 {margin-left:-40px;}
169
+ .pull-2 {margin-left:-80px;}
170
+ .pull-3 {margin-left:-120px;}
171
+ .pull-4 {margin-left:-160px;}
172
+ .pull-5 {margin-left:-200px;}
173
+ .pull-6 {margin-left:-240px;}
174
+ .pull-7 {margin-left:-280px;}
175
+ .pull-8 {margin-left:-320px;}
176
+ .pull-9 {margin-left:-360px;}
177
+ .pull-10 {margin-left:-400px;}
178
+ .pull-11 {margin-left:-440px;}
179
+ .pull-12 {margin-left:-480px;}
180
+ .pull-13 {margin-left:-520px;}
181
+ .pull-14 {margin-left:-560px;}
182
+ .pull-15 {margin-left:-600px;}
183
+ .pull-16 {margin-left:-640px;}
184
+ .pull-17 {margin-left:-680px;}
185
+ .pull-18 {margin-left:-720px;}
186
+ .pull-19 {margin-left:-760px;}
187
+ .pull-20 {margin-left:-800px;}
188
+ .pull-21 {margin-left:-840px;}
189
+ .pull-22 {margin-left:-880px;}
190
+ .pull-23 {margin-left:-920px;}
191
+ .pull-24 {margin-left:-960px;}
192
+ .pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;}
193
+ .push-1 {margin:0 -40px 1.5em 40px;}
194
+ .push-2 {margin:0 -80px 1.5em 80px;}
195
+ .push-3 {margin:0 -120px 1.5em 120px;}
196
+ .push-4 {margin:0 -160px 1.5em 160px;}
197
+ .push-5 {margin:0 -200px 1.5em 200px;}
198
+ .push-6 {margin:0 -240px 1.5em 240px;}
199
+ .push-7 {margin:0 -280px 1.5em 280px;}
200
+ .push-8 {margin:0 -320px 1.5em 320px;}
201
+ .push-9 {margin:0 -360px 1.5em 360px;}
202
+ .push-10 {margin:0 -400px 1.5em 400px;}
203
+ .push-11 {margin:0 -440px 1.5em 440px;}
204
+ .push-12 {margin:0 -480px 1.5em 480px;}
205
+ .push-13 {margin:0 -520px 1.5em 520px;}
206
+ .push-14 {margin:0 -560px 1.5em 560px;}
207
+ .push-15 {margin:0 -600px 1.5em 600px;}
208
+ .push-16 {margin:0 -640px 1.5em 640px;}
209
+ .push-17 {margin:0 -680px 1.5em 680px;}
210
+ .push-18 {margin:0 -720px 1.5em 720px;}
211
+ .push-19 {margin:0 -760px 1.5em 760px;}
212
+ .push-20 {margin:0 -800px 1.5em 800px;}
213
+ .push-21 {margin:0 -840px 1.5em 840px;}
214
+ .push-22 {margin:0 -880px 1.5em 880px;}
215
+ .push-23 {margin:0 -920px 1.5em 920px;}
216
+ .push-24 {margin:0 -960px 1.5em 960px;}
217
+ .push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;}
218
+ .prepend-top {margin-top:1.5em;}
219
+ .append-bottom {margin-bottom:1.5em;}
220
+ .box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;}
221
+ hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
222
+ hr.space {background:#fff;color:#fff;}
223
+ .clearfix:after, .container:after {content:".";display:block;height:0;clear:both;visibility:hidden;}
224
+ .clearfix, .container {display:block;}
225
+ .clear {clear:both;}
226
+
227
+ /* forms.css */
228
+ label {font-weight:bold;}
229
+ fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
230
+ legend {font-weight:bold;font-size:1.2em;}
231
+ input.text, input.title, textarea, select {margin:0.5em 0;border:1px solid #bbb;}
232
+ input.text:focus, input.title:focus, textarea:focus, select:focus {border:1px solid #666;}
233
+ input.text, input.title {width:300px;padding:5px;}
234
+ input.title {font-size:1.5em;}
235
+ textarea {width:390px;height:250px;padding:5px;}
236
+ .error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
237
+ .error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
238
+ .notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
239
+ .success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
240
+ .error a {color:#8a1f11;}
241
+ .notice a {color:#514721;}
242
+ .success a {color:#264409;}