strelka-admin 0.0.1.pre7

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 (61) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.rdoc +4 -0
  3. data/Manifest.txt +58 -0
  4. data/README.rdoc +65 -0
  5. data/Rakefile +42 -0
  6. data/data/strelka-admin/app.conf +7 -0
  7. data/data/strelka-admin/apps/config-service +72 -0
  8. data/data/strelka-admin/apps/strelka-admin +102 -0
  9. data/data/strelka-admin/apps/strelka-setup +32 -0
  10. data/data/strelka-admin/host-config.rb +44 -0
  11. data/data/strelka-admin/static/css/bootstrap-responsive.css +581 -0
  12. data/data/strelka-admin/static/css/bootstrap-responsive.min.css +4 -0
  13. data/data/strelka-admin/static/css/bootstrap.css +3496 -0
  14. data/data/strelka-admin/static/css/bootstrap.min.css +632 -0
  15. data/data/strelka-admin/static/css/master.css +337 -0
  16. data/data/strelka-admin/static/css/reset.css +112 -0
  17. data/data/strelka-admin/static/fonts/IstokWeb-Bold.ttf +0 -0
  18. data/data/strelka-admin/static/fonts/IstokWeb-BoldItalic.ttf +0 -0
  19. data/data/strelka-admin/static/fonts/IstokWeb-Italic.ttf +0 -0
  20. data/data/strelka-admin/static/fonts/IstokWeb-Regular.ttf +0 -0
  21. data/data/strelka-admin/static/fonts/OFL.txt +94 -0
  22. data/data/strelka-admin/static/images/21d1-16.png +0 -0
  23. data/data/strelka-admin/static/images/21d1.png +0 -0
  24. data/data/strelka-admin/static/images/glyphicons-halflings-white.png +0 -0
  25. data/data/strelka-admin/static/images/glyphicons-halflings.png +0 -0
  26. data/data/strelka-admin/static/images/icons/blank.png +0 -0
  27. data/data/strelka-admin/static/images/icons/cross-button.png +0 -0
  28. data/data/strelka-admin/static/images/icons/tick-button.png +0 -0
  29. data/data/strelka-admin/static/images/icons/tick-circle-frame.png +0 -0
  30. data/data/strelka-admin/static/images/icons/tick-circle.png +0 -0
  31. data/data/strelka-admin/static/images/icons/tick-octagon-frame.png +0 -0
  32. data/data/strelka-admin/static/images/icons/tick-octagon.png +0 -0
  33. data/data/strelka-admin/static/images/icons/tick-red.png +0 -0
  34. data/data/strelka-admin/static/images/icons/tick-shield.png +0 -0
  35. data/data/strelka-admin/static/images/icons/tick-small-circle.png +0 -0
  36. data/data/strelka-admin/static/images/icons/tick-small-red.png +0 -0
  37. data/data/strelka-admin/static/images/icons/tick-small-white.png +0 -0
  38. data/data/strelka-admin/static/images/icons/tick-small.png +0 -0
  39. data/data/strelka-admin/static/images/icons/tick-white.png +0 -0
  40. data/data/strelka-admin/static/images/icons/tick.png +0 -0
  41. data/data/strelka-admin/static/images/noise.jpg +0 -0
  42. data/data/strelka-admin/static/images/noise.png +0 -0
  43. data/data/strelka-admin/static/js/admin/app.js +60 -0
  44. data/data/strelka-admin/static/js/vendor/backbone.js +1290 -0
  45. data/data/strelka-admin/static/js/vendor/bootstrap.js +1720 -0
  46. data/data/strelka-admin/static/js/vendor/bootstrap.min.js +1 -0
  47. data/data/strelka-admin/static/js/vendor/jquery-1.7.1.js +9266 -0
  48. data/data/strelka-admin/static/js/vendor/jquery.jeditable.mini.js +38 -0
  49. data/data/strelka-admin/static/js/vendor/jquery.tmpl.min.js +10 -0
  50. data/data/strelka-admin/static/js/vendor/jquery.tmplPlus.min.js +11 -0
  51. data/data/strelka-admin/static/js/vendor/jquery.tools.min.js +20 -0
  52. data/data/strelka-admin/static/js/vendor/json2.js +487 -0
  53. data/data/strelka-admin/static/js/vendor/underscore.js +999 -0
  54. data/data/strelka-admin/templates/admin/console.tmpl +80 -0
  55. data/data/strelka-admin/templates/admin/host.tmpl +75 -0
  56. data/data/strelka-admin/templates/admin/message.tmpl +14 -0
  57. data/data/strelka-admin/templates/admin/server.tmpl +75 -0
  58. data/data/strelka-admin/templates/layout.tmpl +85 -0
  59. data/lib/strelka/admin.rb +63 -0
  60. metadata +210 -0
  61. metadata.gz.sig +0 -0
Binary file
@@ -0,0 +1,4 @@
1
+ == v0.0.1 [2012-02-29] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Initial release.
4
+
@@ -0,0 +1,58 @@
1
+ History.rdoc
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ data/strelka-admin/app.conf
6
+ data/strelka-admin/apps/config-service
7
+ data/strelka-admin/apps/strelka-admin
8
+ data/strelka-admin/apps/strelka-setup
9
+ data/strelka-admin/host-config.rb
10
+ data/strelka-admin/static/css/bootstrap-responsive.css
11
+ data/strelka-admin/static/css/bootstrap-responsive.min.css
12
+ data/strelka-admin/static/css/bootstrap.css
13
+ data/strelka-admin/static/css/bootstrap.min.css
14
+ data/strelka-admin/static/css/master.css
15
+ data/strelka-admin/static/css/reset.css
16
+ data/strelka-admin/static/fonts/IstokWeb-Bold.ttf
17
+ data/strelka-admin/static/fonts/IstokWeb-BoldItalic.ttf
18
+ data/strelka-admin/static/fonts/IstokWeb-Italic.ttf
19
+ data/strelka-admin/static/fonts/IstokWeb-Regular.ttf
20
+ data/strelka-admin/static/fonts/OFL.txt
21
+ data/strelka-admin/static/images/21d1-16.png
22
+ data/strelka-admin/static/images/21d1.png
23
+ data/strelka-admin/static/images/glyphicons-halflings-white.png
24
+ data/strelka-admin/static/images/glyphicons-halflings.png
25
+ data/strelka-admin/static/images/icons/blank.png
26
+ data/strelka-admin/static/images/icons/cross-button.png
27
+ data/strelka-admin/static/images/icons/tick-button.png
28
+ data/strelka-admin/static/images/icons/tick-circle-frame.png
29
+ data/strelka-admin/static/images/icons/tick-circle.png
30
+ data/strelka-admin/static/images/icons/tick-octagon-frame.png
31
+ data/strelka-admin/static/images/icons/tick-octagon.png
32
+ data/strelka-admin/static/images/icons/tick-red.png
33
+ data/strelka-admin/static/images/icons/tick-shield.png
34
+ data/strelka-admin/static/images/icons/tick-small-circle.png
35
+ data/strelka-admin/static/images/icons/tick-small-red.png
36
+ data/strelka-admin/static/images/icons/tick-small-white.png
37
+ data/strelka-admin/static/images/icons/tick-small.png
38
+ data/strelka-admin/static/images/icons/tick-white.png
39
+ data/strelka-admin/static/images/icons/tick.png
40
+ data/strelka-admin/static/images/noise.jpg
41
+ data/strelka-admin/static/images/noise.png
42
+ data/strelka-admin/static/js/admin/app.js
43
+ data/strelka-admin/static/js/vendor/backbone.js
44
+ data/strelka-admin/static/js/vendor/bootstrap.js
45
+ data/strelka-admin/static/js/vendor/bootstrap.min.js
46
+ data/strelka-admin/static/js/vendor/jquery-1.7.1.js
47
+ data/strelka-admin/static/js/vendor/jquery.jeditable.mini.js
48
+ data/strelka-admin/static/js/vendor/jquery.tmpl.min.js
49
+ data/strelka-admin/static/js/vendor/jquery.tmplPlus.min.js
50
+ data/strelka-admin/static/js/vendor/jquery.tools.min.js
51
+ data/strelka-admin/static/js/vendor/json2.js
52
+ data/strelka-admin/static/js/vendor/underscore.js
53
+ data/strelka-admin/templates/admin/console.tmpl
54
+ data/strelka-admin/templates/admin/host.tmpl
55
+ data/strelka-admin/templates/admin/message.tmpl
56
+ data/strelka-admin/templates/admin/server.tmpl
57
+ data/strelka-admin/templates/layout.tmpl
58
+ lib/strelka/admin.rb
@@ -0,0 +1,65 @@
1
+ = Strelka
2
+
3
+ * http://deveiate.org/projects/Strelka/wiki/AdminConsole
4
+
5
+ == Description
6
+
7
+ Strelka is a framework for creating and deploying Mongrel2 web applications
8
+ in Ruby, and for managing a Mongrel2 cluster.
9
+
10
+ It's named after the Russian dog who was one of the first space travelers
11
+ to orbit the Earth and return alive.
12
+
13
+
14
+ == Prerequisites
15
+
16
+ * Strelka[http://deveiate.org/projects/Strelka]
17
+ * Ruby 1.9.3 or better
18
+
19
+
20
+ == Installation
21
+
22
+ $ gem install strelka-admin
23
+ $ leash setup /usr/local/strelka-admin strelka-admin /usr/local/var/db/mongrel2.sqlite
24
+ $ cd /usr/local/strelka-admin
25
+ $ emacs app.conf
26
+ $ leash start strelka-admin app.conf
27
+
28
+
29
+ == Contributing
30
+
31
+ You can check out the current development source with
32
+ Mercurial[http://repo.deveiate.org/Strelka-Admin], or if you prefer
33
+ Git, via {its Github mirror}[https://github.com/ged/strelka-admin].
34
+
35
+
36
+ == License
37
+
38
+ Copyright (c) 2011-2012, Michael Granger
39
+ All rights reserved.
40
+
41
+ Redistribution and use in source and binary forms, with or without
42
+ modification, are permitted provided that the following conditions are met:
43
+
44
+ * Redistributions of source code must retain the above copyright notice,
45
+ this list of conditions and the following disclaimer.
46
+
47
+ * Redistributions in binary form must reproduce the above copyright notice,
48
+ this list of conditions and the following disclaimer in the documentation
49
+ and/or other materials provided with the distribution.
50
+
51
+ * Neither the name of the author/s, nor the names of the project's
52
+ contributors may be used to endorse or promote products derived from this
53
+ software without specific prior written permission.
54
+
55
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
56
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
57
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
58
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
59
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
60
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
61
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
62
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
63
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
64
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65
+
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'rake/clean'
4
+
5
+ begin
6
+ require 'hoe'
7
+ rescue LoadError
8
+ abort "This Rakefile requires 'hoe' (gem install hoe)"
9
+ end
10
+
11
+ Hoe.plugin :mercurial
12
+ Hoe.plugin :signing
13
+ Hoe.plugin :manualgen
14
+
15
+ Hoe.plugins.delete :rubyforge
16
+
17
+ hoespec = Hoe.spec 'strelka-admin' do
18
+ self.readme_file = 'README.rdoc'
19
+ self.history_file = 'History.rdoc'
20
+ self.extra_rdoc_files = FileList[ '*.rdoc' ]
21
+
22
+ self.developer 'Michael Granger', 'ged@FaerieMUD.org'
23
+
24
+ self.dependency 'strelka', '~> 0.0'
25
+ self.dependency 'rspec', '~> 2.8', :developer
26
+
27
+ self.spec_extras[:licenses] = ["BSD"]
28
+ self.require_ruby_version( '>=1.9.3' )
29
+ self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
30
+ self.check_history_on_release = true if self.respond_to?( :check_history_on_release= )
31
+
32
+ self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
33
+ end
34
+
35
+ ENV['VERSION'] ||= hoespec.spec.version.to_s
36
+
37
+ # Ensure the specs pass before checking in
38
+ task 'hg:precheckin' => [ :check_history, :check_manifest ]
39
+
40
+ # Rebuild the ChangeLog immediately before release
41
+ task :prerelease => 'ChangeLog'
42
+
@@ -0,0 +1,7 @@
1
+ templates:
2
+ template_paths:
3
+ - /Users/mgranger/source/ruby/Strelka/data/strelka/templates
4
+
5
+ mongrel2:
6
+ configdb: data/strelka/strelka.sqlite
7
+
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'configurability'
4
+ require 'strelka'
5
+ require 'uuidtools'
6
+
7
+ # The Strelka mongrel2 config service app.
8
+ class Strelka::ConfigService < Strelka::App
9
+ extend Configurability
10
+
11
+ # Piggyback on the
12
+
13
+ # The version of this service API -- used in determining the
14
+ # versioned route. If this changes in a non-backward compatible way,
15
+ # this should be incremented
16
+ APIVERSION = 1
17
+
18
+ # The 'appid' of the route to point the application at
19
+ ID = Strelka::CONFIGSERVICE_ID
20
+
21
+ # Load some plugins
22
+ plugins :restresources
23
+
24
+ # By default, responses are HTML
25
+ default_type 'text/html'
26
+
27
+ # Templating -- wrap human-viewable stuff in a consistent layout
28
+ layout 'layout.tmpl'
29
+ # templates \
30
+ # :overview => 'configservice/overview.tmpl'
31
+
32
+
33
+ # GET /uuid -- fetch a plain-text random UUID
34
+ get '/uuid' do |req|
35
+ res = req.response
36
+ uuid = UUIDTools::UUID.random_create.to_s
37
+
38
+ res.for( :text, :yaml, :json ) {[ uuid ]}
39
+ res.for( :html ) do
40
+ tmpl = self.template( :message )
41
+ tmpl.message = uuid
42
+ self.log.debug "Returning message template: %p" % [ tmpl ]
43
+ tmpl
44
+ end
45
+
46
+ return res
47
+ end
48
+
49
+
50
+ #
51
+ # Config Service API
52
+ #
53
+
54
+ def self::configure( * )
55
+ resource Mongrel2::Config::Server
56
+ resource Mongrel2::Config::Host
57
+ resource Mongrel2::Config::Route
58
+ resource Mongrel2::Config::Setting
59
+ resource Mongrel2::Config::Filter
60
+ resource Mongrel2::Config::Mimetype
61
+
62
+ end # class Strelka::AdminConsole
63
+
64
+
65
+ if __FILE__ == $0
66
+ Strelka.load_config
67
+ Strelka::ConfigService.run
68
+ end
69
+
70
+
71
+
72
+
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'strelka'
4
+ require 'strelka/admin'
5
+
6
+
7
+ # The Strelka admin web console.
8
+ class Strelka::AdminConsole < Strelka::App
9
+
10
+ # The 'appid' of the route to point the application at
11
+ ID = Strelka::ADMINSERVER_ID
12
+
13
+ # Load some plugins
14
+ plugins :templating, :routing, :filters, :errors
15
+
16
+
17
+ # By default, responses are HTML
18
+ default_type 'text/html'
19
+
20
+ #
21
+ # Templating
22
+ #
23
+
24
+ # Templating -- wrap everything in the layout
25
+ layout 'layout.tmpl'
26
+ templates \
27
+ :console => 'admin/console.tmpl',
28
+ :server => 'admin/server.tmpl',
29
+ :host => 'admin/host.tmpl',
30
+ :message => 'admin/message.tmpl'
31
+
32
+
33
+ #
34
+ # Filters
35
+ #
36
+
37
+ # Add some custom headers to all responses
38
+ filter( :response ) do |res|
39
+ res.headers.x_strelka_version = Strelka.version_string( true )
40
+ end
41
+
42
+
43
+ #
44
+ # Routes
45
+ #
46
+
47
+ ### Initialize some application data.
48
+ def initialize( * )
49
+
50
+ # Commonalize all the loggers
51
+ Mongrel2.logger = Strelka.logger
52
+ Configurability.logger = Strelka.logger
53
+ Inversion.logger.level = Logger::WARN
54
+
55
+ @adminserver = Mongrel2::Config::Server.by_uuid( ADMINSERVER_ID ).first
56
+ @control = @adminserver.control_socket
57
+
58
+ super
59
+ end
60
+
61
+
62
+ #
63
+ # Custom Error Responses
64
+ #
65
+
66
+ # on_status 404, :missing
67
+ #
68
+ # on_status 302,304, :redirect
69
+
70
+
71
+
72
+ #
73
+ # App Routes
74
+ #
75
+
76
+ # GET / -- console view
77
+ get do |req|
78
+ tmpl = self.template( :console )
79
+ tmpl.request = req
80
+ tmpl.control = @control
81
+ tmpl.servers = Mongrel2::Config.servers
82
+
83
+ return tmpl
84
+ end
85
+
86
+ end # class Strelka::AdminConsole
87
+
88
+
89
+ if __FILE__ == $0
90
+ require 'configurability/config'
91
+
92
+ # Commonalize all the loggers
93
+ Mongrel2.logger = Strelka.logger
94
+ Configurability.logger = Strelka.logger
95
+ PluginFactory.logger = Strelka.logger
96
+
97
+ Inversion.logger.level = Logger::WARN
98
+
99
+ Strelka.load_config
100
+ Strelka::AdminConsole.run
101
+ end
102
+
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'inversion'
4
+ require 'strelka'
5
+
6
+ # The Strelka setup web application.
7
+ class Strelka::SetupProcess < Strelka::App
8
+
9
+ # NOTE:
10
+ # This is currently just a sketch for an idea of how Strelka could support stateful
11
+ # 'process' applications ala Tir's coroutine-based "natural" handlers. It's not
12
+ # implemented yet, so this will error:
13
+ plugins :process
14
+
15
+ layout 'setup/layout.tmpl'
16
+
17
+ views :step1 => 'setup/step1',
18
+ :step2 => 'setup/step2'
19
+
20
+
21
+ ### Progress through the setup process.
22
+ def main( req )
23
+ params = show( :step1 )
24
+ params = show( :step2, params )
25
+
26
+ end
27
+
28
+ end # class Strelka::AdminConsole
29
+
30
+
31
+ Strelka::SetupProcess.run( 'strelka-setup' )
32
+
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pathname'
4
+
5
+ require 'mongrel2/config'
6
+ include Mongrel2::Config::DSL
7
+
8
+ require 'strelka'
9
+ require 'strelka/constants'
10
+ include Strelka::Constants
11
+
12
+ # Load the app classes to grab their appids. Only necessary for bootstrapping.
13
+ adminapp = Strelka::App.load( DATADIR + 'apps/strelka-admin' ).first
14
+ helloapp = Strelka::App.load( DATADIR + 'apps/hello-world' ).first
15
+
16
+ # This is the config that's loaded by 'leash setup' to get the admin server
17
+ # up and running.
18
+ server ADMINSERVER_ID do
19
+ name 'Strelka Admin Server'
20
+ port 8833
21
+ chroot '.'
22
+ access_log '/logs/admin-access.log'
23
+ error_log '/logs/admin-error.log'
24
+ pid_file '/run/admin.pid'
25
+ bind_addr '127.0.0.1'
26
+
27
+ default_host 'localhost'
28
+
29
+ host 'localhost' do
30
+ route '/', handler( 'tcp://127.0.0.1:19999', adminapp.default_appid )
31
+ route '/hello', handler( 'tcp://127.0.0.1:19995', helloapp.default_appid )
32
+
33
+ route '/css', directory( 'static/css/', 'base.css', 'text/css' )
34
+ route '/images', directory( 'static/images/' )
35
+ route '/fonts', directory( 'static/fonts/' )
36
+ route '/js', directory( 'static/js/', 'index.js', 'text/javascript' )
37
+ end
38
+ end
39
+
40
+ setting "control_port", 'ipc://run/control'
41
+
42
+ mimetypes '.ttf' => 'application/x-font-truetype',
43
+ '.otf' => 'application/x-font-opentype'
44
+
@@ -0,0 +1,581 @@
1
+ /*!
2
+ * Bootstrap Responsive v2.0.1
3
+ *
4
+ * Copyright 2012 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ */
10
+ .clearfix {
11
+ *zoom: 1;
12
+ }
13
+ .clearfix:before, .clearfix:after {
14
+ display: table;
15
+ content: "";
16
+ }
17
+ .clearfix:after {
18
+ clear: both;
19
+ }
20
+ .hidden {
21
+ display: none;
22
+ visibility: hidden;
23
+ }
24
+ @media (max-width: 480px) {
25
+ .nav-collapse {
26
+ -webkit-transform: translate3d(0, 0, 0);
27
+ }
28
+ .page-header h1 small {
29
+ display: block;
30
+ line-height: 18px;
31
+ }
32
+ input[class*="span"],
33
+ select[class*="span"],
34
+ textarea[class*="span"],
35
+ .uneditable-input {
36
+ display: block;
37
+ width: 100%;
38
+ min-height: 28px;
39
+ /* Make inputs at least the height of their button counterpart */
40
+
41
+ /* Makes inputs behave like true block-level elements */
42
+
43
+ -webkit-box-sizing: border-box;
44
+ /* Older Webkit */
45
+
46
+ -moz-box-sizing: border-box;
47
+ /* Older FF */
48
+
49
+ -ms-box-sizing: border-box;
50
+ /* IE8 */
51
+
52
+ box-sizing: border-box;
53
+ /* CSS3 spec*/
54
+
55
+ }
56
+ .input-prepend input[class*="span"], .input-append input[class*="span"] {
57
+ width: auto;
58
+ }
59
+ input[type="checkbox"], input[type="radio"] {
60
+ border: 1px solid #ccc;
61
+ }
62
+ .form-horizontal .control-group > label {
63
+ float: none;
64
+ width: auto;
65
+ padding-top: 0;
66
+ text-align: left;
67
+ }
68
+ .form-horizontal .controls {
69
+ margin-left: 0;
70
+ }
71
+ .form-horizontal .control-list {
72
+ padding-top: 0;
73
+ }
74
+ .form-horizontal .form-actions {
75
+ padding-left: 10px;
76
+ padding-right: 10px;
77
+ }
78
+ .modal {
79
+ position: absolute;
80
+ top: 10px;
81
+ left: 10px;
82
+ right: 10px;
83
+ width: auto;
84
+ margin: 0;
85
+ }
86
+ .modal.fade.in {
87
+ top: auto;
88
+ }
89
+ .modal-header .close {
90
+ padding: 10px;
91
+ margin: -10px;
92
+ }
93
+ .carousel-caption {
94
+ position: static;
95
+ }
96
+ }
97
+ @media (max-width: 767px) {
98
+ .container {
99
+ width: auto;
100
+ padding: 0 20px;
101
+ }
102
+ .row-fluid {
103
+ width: 100%;
104
+ }
105
+ .row {
106
+ margin-left: 0;
107
+ }
108
+ .row > [class*="span"], .row-fluid > [class*="span"] {
109
+ float: none;
110
+ display: block;
111
+ width: auto;
112
+ margin: 0;
113
+ }
114
+ }
115
+ @media (min-width: 768px) and (max-width: 979px) {
116
+ .row {
117
+ margin-left: -20px;
118
+ *zoom: 1;
119
+ }
120
+ .row:before, .row:after {
121
+ display: table;
122
+ content: "";
123
+ }
124
+ .row:after {
125
+ clear: both;
126
+ }
127
+ [class*="span"] {
128
+ float: left;
129
+ margin-left: 20px;
130
+ }
131
+ .span1 {
132
+ width: 42px;
133
+ }
134
+ .span2 {
135
+ width: 104px;
136
+ }
137
+ .span3 {
138
+ width: 166px;
139
+ }
140
+ .span4 {
141
+ width: 228px;
142
+ }
143
+ .span5 {
144
+ width: 290px;
145
+ }
146
+ .span6 {
147
+ width: 352px;
148
+ }
149
+ .span7 {
150
+ width: 414px;
151
+ }
152
+ .span8 {
153
+ width: 476px;
154
+ }
155
+ .span9 {
156
+ width: 538px;
157
+ }
158
+ .span10 {
159
+ width: 600px;
160
+ }
161
+ .span11 {
162
+ width: 662px;
163
+ }
164
+ .span12, .container {
165
+ width: 724px;
166
+ }
167
+ .offset1 {
168
+ margin-left: 82px;
169
+ }
170
+ .offset2 {
171
+ margin-left: 144px;
172
+ }
173
+ .offset3 {
174
+ margin-left: 206px;
175
+ }
176
+ .offset4 {
177
+ margin-left: 268px;
178
+ }
179
+ .offset5 {
180
+ margin-left: 330px;
181
+ }
182
+ .offset6 {
183
+ margin-left: 392px;
184
+ }
185
+ .offset7 {
186
+ margin-left: 454px;
187
+ }
188
+ .offset8 {
189
+ margin-left: 516px;
190
+ }
191
+ .offset9 {
192
+ margin-left: 578px;
193
+ }
194
+ .offset10 {
195
+ margin-left: 640px;
196
+ }
197
+ .offset11 {
198
+ margin-left: 702px;
199
+ }
200
+ .row-fluid {
201
+ width: 100%;
202
+ *zoom: 1;
203
+ }
204
+ .row-fluid:before, .row-fluid:after {
205
+ display: table;
206
+ content: "";
207
+ }
208
+ .row-fluid:after {
209
+ clear: both;
210
+ }
211
+ .row-fluid > [class*="span"] {
212
+ float: left;
213
+ margin-left: 2.762430939%;
214
+ }
215
+ .row-fluid > [class*="span"]:first-child {
216
+ margin-left: 0;
217
+ }
218
+ .row-fluid > .span1 {
219
+ width: 5.801104972%;
220
+ }
221
+ .row-fluid > .span2 {
222
+ width: 14.364640883%;
223
+ }
224
+ .row-fluid > .span3 {
225
+ width: 22.928176794%;
226
+ }
227
+ .row-fluid > .span4 {
228
+ width: 31.491712705%;
229
+ }
230
+ .row-fluid > .span5 {
231
+ width: 40.055248616%;
232
+ }
233
+ .row-fluid > .span6 {
234
+ width: 48.618784527%;
235
+ }
236
+ .row-fluid > .span7 {
237
+ width: 57.182320438000005%;
238
+ }
239
+ .row-fluid > .span8 {
240
+ width: 65.74585634900001%;
241
+ }
242
+ .row-fluid > .span9 {
243
+ width: 74.30939226%;
244
+ }
245
+ .row-fluid > .span10 {
246
+ width: 82.87292817100001%;
247
+ }
248
+ .row-fluid > .span11 {
249
+ width: 91.436464082%;
250
+ }
251
+ .row-fluid > .span12 {
252
+ width: 99.999999993%;
253
+ }
254
+ input.span1, textarea.span1, .uneditable-input.span1 {
255
+ width: 32px;
256
+ }
257
+ input.span2, textarea.span2, .uneditable-input.span2 {
258
+ width: 94px;
259
+ }
260
+ input.span3, textarea.span3, .uneditable-input.span3 {
261
+ width: 156px;
262
+ }
263
+ input.span4, textarea.span4, .uneditable-input.span4 {
264
+ width: 218px;
265
+ }
266
+ input.span5, textarea.span5, .uneditable-input.span5 {
267
+ width: 280px;
268
+ }
269
+ input.span6, textarea.span6, .uneditable-input.span6 {
270
+ width: 342px;
271
+ }
272
+ input.span7, textarea.span7, .uneditable-input.span7 {
273
+ width: 404px;
274
+ }
275
+ input.span8, textarea.span8, .uneditable-input.span8 {
276
+ width: 466px;
277
+ }
278
+ input.span9, textarea.span9, .uneditable-input.span9 {
279
+ width: 528px;
280
+ }
281
+ input.span10, textarea.span10, .uneditable-input.span10 {
282
+ width: 590px;
283
+ }
284
+ input.span11, textarea.span11, .uneditable-input.span11 {
285
+ width: 652px;
286
+ }
287
+ input.span12, textarea.span12, .uneditable-input.span12 {
288
+ width: 714px;
289
+ }
290
+ }
291
+ @media (max-width: 979px) {
292
+ body {
293
+ padding-top: 0;
294
+ }
295
+ .navbar-fixed-top {
296
+ position: static;
297
+ margin-bottom: 18px;
298
+ }
299
+ .navbar-fixed-top .navbar-inner {
300
+ padding: 5px;
301
+ }
302
+ .navbar .container {
303
+ width: auto;
304
+ padding: 0;
305
+ }
306
+ .navbar .brand {
307
+ padding-left: 10px;
308
+ padding-right: 10px;
309
+ margin: 0 0 0 -5px;
310
+ }
311
+ .navbar .nav-collapse {
312
+ clear: left;
313
+ }
314
+ .navbar .nav {
315
+ float: none;
316
+ margin: 0 0 9px;
317
+ }
318
+ .navbar .nav > li {
319
+ float: none;
320
+ }
321
+ .navbar .nav > li > a {
322
+ margin-bottom: 2px;
323
+ }
324
+ .navbar .nav > .divider-vertical {
325
+ display: none;
326
+ }
327
+ .navbar .nav .nav-header {
328
+ color: #999999;
329
+ text-shadow: none;
330
+ }
331
+ .navbar .nav > li > a, .navbar .dropdown-menu a {
332
+ padding: 6px 15px;
333
+ font-weight: bold;
334
+ color: #999999;
335
+ -webkit-border-radius: 3px;
336
+ -moz-border-radius: 3px;
337
+ border-radius: 3px;
338
+ }
339
+ .navbar .dropdown-menu li + li a {
340
+ margin-bottom: 2px;
341
+ }
342
+ .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover {
343
+ background-color: #222222;
344
+ }
345
+ .navbar .dropdown-menu {
346
+ position: static;
347
+ top: auto;
348
+ left: auto;
349
+ float: none;
350
+ display: block;
351
+ max-width: none;
352
+ margin: 0 15px;
353
+ padding: 0;
354
+ background-color: transparent;
355
+ border: none;
356
+ -webkit-border-radius: 0;
357
+ -moz-border-radius: 0;
358
+ border-radius: 0;
359
+ -webkit-box-shadow: none;
360
+ -moz-box-shadow: none;
361
+ box-shadow: none;
362
+ }
363
+ .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {
364
+ display: none;
365
+ }
366
+ .navbar .dropdown-menu .divider {
367
+ display: none;
368
+ }
369
+ .navbar-form, .navbar-search {
370
+ float: none;
371
+ padding: 9px 15px;
372
+ margin: 9px 0;
373
+ border-top: 1px solid #222222;
374
+ border-bottom: 1px solid #222222;
375
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
376
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
377
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
378
+ }
379
+ .navbar .nav.pull-right {
380
+ float: none;
381
+ margin-left: 0;
382
+ }
383
+ .navbar-static .navbar-inner {
384
+ padding-left: 10px;
385
+ padding-right: 10px;
386
+ }
387
+ .btn-navbar {
388
+ display: block;
389
+ }
390
+ .nav-collapse {
391
+ overflow: hidden;
392
+ height: 0;
393
+ }
394
+ }
395
+ @media (min-width: 980px) {
396
+ .nav-collapse.collapse {
397
+ height: auto !important;
398
+ }
399
+ }
400
+ @media (min-width: 1200px) {
401
+ .row {
402
+ margin-left: -30px;
403
+ *zoom: 1;
404
+ }
405
+ .row:before, .row:after {
406
+ display: table;
407
+ content: "";
408
+ }
409
+ .row:after {
410
+ clear: both;
411
+ }
412
+ [class*="span"] {
413
+ float: left;
414
+ margin-left: 30px;
415
+ }
416
+ .span1 {
417
+ width: 70px;
418
+ }
419
+ .span2 {
420
+ width: 170px;
421
+ }
422
+ .span3 {
423
+ width: 270px;
424
+ }
425
+ .span4 {
426
+ width: 370px;
427
+ }
428
+ .span5 {
429
+ width: 470px;
430
+ }
431
+ .span6 {
432
+ width: 570px;
433
+ }
434
+ .span7 {
435
+ width: 670px;
436
+ }
437
+ .span8 {
438
+ width: 770px;
439
+ }
440
+ .span9 {
441
+ width: 870px;
442
+ }
443
+ .span10 {
444
+ width: 970px;
445
+ }
446
+ .span11 {
447
+ width: 1070px;
448
+ }
449
+ .span12, .container {
450
+ width: 1170px;
451
+ }
452
+ .offset1 {
453
+ margin-left: 130px;
454
+ }
455
+ .offset2 {
456
+ margin-left: 230px;
457
+ }
458
+ .offset3 {
459
+ margin-left: 330px;
460
+ }
461
+ .offset4 {
462
+ margin-left: 430px;
463
+ }
464
+ .offset5 {
465
+ margin-left: 530px;
466
+ }
467
+ .offset6 {
468
+ margin-left: 630px;
469
+ }
470
+ .offset7 {
471
+ margin-left: 730px;
472
+ }
473
+ .offset8 {
474
+ margin-left: 830px;
475
+ }
476
+ .offset9 {
477
+ margin-left: 930px;
478
+ }
479
+ .offset10 {
480
+ margin-left: 1030px;
481
+ }
482
+ .offset11 {
483
+ margin-left: 1130px;
484
+ }
485
+ .row-fluid {
486
+ width: 100%;
487
+ *zoom: 1;
488
+ }
489
+ .row-fluid:before, .row-fluid:after {
490
+ display: table;
491
+ content: "";
492
+ }
493
+ .row-fluid:after {
494
+ clear: both;
495
+ }
496
+ .row-fluid > [class*="span"] {
497
+ float: left;
498
+ margin-left: 2.564102564%;
499
+ }
500
+ .row-fluid > [class*="span"]:first-child {
501
+ margin-left: 0;
502
+ }
503
+ .row-fluid > .span1 {
504
+ width: 5.982905983%;
505
+ }
506
+ .row-fluid > .span2 {
507
+ width: 14.529914530000001%;
508
+ }
509
+ .row-fluid > .span3 {
510
+ width: 23.076923077%;
511
+ }
512
+ .row-fluid > .span4 {
513
+ width: 31.623931624%;
514
+ }
515
+ .row-fluid > .span5 {
516
+ width: 40.170940171000005%;
517
+ }
518
+ .row-fluid > .span6 {
519
+ width: 48.717948718%;
520
+ }
521
+ .row-fluid > .span7 {
522
+ width: 57.264957265%;
523
+ }
524
+ .row-fluid > .span8 {
525
+ width: 65.81196581200001%;
526
+ }
527
+ .row-fluid > .span9 {
528
+ width: 74.358974359%;
529
+ }
530
+ .row-fluid > .span10 {
531
+ width: 82.905982906%;
532
+ }
533
+ .row-fluid > .span11 {
534
+ width: 91.45299145300001%;
535
+ }
536
+ .row-fluid > .span12 {
537
+ width: 100%;
538
+ }
539
+ input.span1, textarea.span1, .uneditable-input.span1 {
540
+ width: 60px;
541
+ }
542
+ input.span2, textarea.span2, .uneditable-input.span2 {
543
+ width: 160px;
544
+ }
545
+ input.span3, textarea.span3, .uneditable-input.span3 {
546
+ width: 260px;
547
+ }
548
+ input.span4, textarea.span4, .uneditable-input.span4 {
549
+ width: 360px;
550
+ }
551
+ input.span5, textarea.span5, .uneditable-input.span5 {
552
+ width: 460px;
553
+ }
554
+ input.span6, textarea.span6, .uneditable-input.span6 {
555
+ width: 560px;
556
+ }
557
+ input.span7, textarea.span7, .uneditable-input.span7 {
558
+ width: 660px;
559
+ }
560
+ input.span8, textarea.span8, .uneditable-input.span8 {
561
+ width: 760px;
562
+ }
563
+ input.span9, textarea.span9, .uneditable-input.span9 {
564
+ width: 860px;
565
+ }
566
+ input.span10, textarea.span10, .uneditable-input.span10 {
567
+ width: 960px;
568
+ }
569
+ input.span11, textarea.span11, .uneditable-input.span11 {
570
+ width: 1060px;
571
+ }
572
+ input.span12, textarea.span12, .uneditable-input.span12 {
573
+ width: 1160px;
574
+ }
575
+ .thumbnails {
576
+ margin-left: -30px;
577
+ }
578
+ .thumbnails > li {
579
+ margin-left: 30px;
580
+ }
581
+ }