ramaze 2011.07.25 → 2011.10.23
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.
- data/.gitignore +3 -0
- data/.mailmap +3 -2
- data/.travis.yml +17 -0
- data/.yardopts +13 -0
- data/README.md +95 -352
- data/examples/app/blog/app.rb +25 -64
- data/examples/app/blog/config.ru +11 -9
- data/examples/app/blog/controller/init.rb +29 -86
- data/examples/app/blog/controller/posts.rb +232 -0
- data/examples/app/blog/controller/users.rb +160 -0
- data/examples/app/blog/layout/default.xhtml +61 -0
- data/examples/app/blog/migrations/01_create_schema.rb +50 -0
- data/examples/app/blog/model/comment.rb +41 -54
- data/examples/app/blog/model/init.rb +41 -13
- data/examples/app/blog/model/post.rb +35 -0
- data/examples/app/blog/model/user.rb +105 -0
- data/examples/app/blog/public/.htaccess +24 -0
- data/examples/app/blog/public/css/grid.css +107 -0
- data/examples/app/blog/public/css/layout.css +203 -0
- data/examples/app/blog/public/css/reset.css +123 -0
- data/examples/app/blog/public/css/text.css +109 -0
- data/examples/app/blog/public/dispatch.fcgi +11 -0
- data/examples/app/blog/public/favicon.ico +0 -0
- data/examples/app/blog/public/images/bg.png +0 -0
- data/examples/app/blog/start.rb +18 -3
- data/examples/app/blog/view/feed.xhtml +23 -0
- data/examples/app/blog/view/form.xhtml +11 -0
- data/examples/app/blog/view/index.xhtml +44 -0
- data/examples/app/blog/view/users/form.xhtml +12 -0
- data/examples/app/blog/view/users/index.xhtml +30 -0
- data/examples/app/blog/view/users/login.xhtml +8 -0
- data/examples/app/blog/view/view.xhtml +68 -0
- data/{doc → guide}/AUTHORS +5 -3
- data/{doc → guide}/CHANGELOG +428 -0
- data/{doc/GPL → guide/GPL_LICENSE} +0 -0
- data/{doc/COPYING → guide/RUBY_LICENSE} +3 -6
- data/guide/_static/logo.png +0 -0
- data/guide/_static/logo.svg +49 -0
- data/guide/_static/ramaze_console.png +0 -0
- data/guide/css/common.css +20 -0
- data/guide/general/cache.md +167 -0
- data/guide/general/configuration.md +168 -0
- data/guide/general/contributing.md +108 -0
- data/guide/general/controllers.md +115 -0
- data/guide/general/helpers.md +76 -0
- data/guide/general/installation.md +58 -0
- data/guide/general/logging.md +99 -0
- data/guide/general/middlewares.md +100 -0
- data/guide/general/models.md +78 -0
- data/guide/general/principles.md +53 -0
- data/guide/general/ramaze_command.md +155 -0
- data/guide/general/routes.md +81 -0
- data/guide/general/sessions.md +140 -0
- data/guide/general/special_thanks.md +67 -0
- data/guide/general/testing.md +61 -0
- data/guide/general/views.md +322 -0
- data/guide/tutorials/introduction.md +259 -0
- data/lib/proto/config.ru +1 -1
- data/lib/proto/public/favicon.ico +0 -0
- data/lib/proto/view/index.xhtml +7 -7
- data/lib/ramaze.rb +4 -4
- data/lib/ramaze/app.rb +11 -11
- data/lib/ramaze/app_graph.rb +2 -4
- data/lib/ramaze/bin/console.rb +3 -3
- data/lib/ramaze/bin/create.rb +2 -2
- data/lib/ramaze/bin/restart.rb +4 -4
- data/lib/ramaze/bin/runner.rb +5 -5
- data/lib/ramaze/bin/start.rb +19 -4
- data/lib/ramaze/bin/status.rb +3 -3
- data/lib/ramaze/bin/stop.rb +3 -3
- data/lib/ramaze/cache.rb +1 -0
- data/lib/ramaze/cache/lru.rb +8 -4
- data/lib/ramaze/cache/memcache.rb +32 -13
- data/lib/ramaze/cache/redis.rb +164 -0
- data/lib/ramaze/cache/sequel.rb +43 -28
- data/lib/ramaze/controller.rb +1 -2
- data/lib/ramaze/dependencies.rb +40 -3
- data/lib/ramaze/helper/bench.rb +26 -16
- data/lib/ramaze/helper/blue_form.rb +46 -73
- data/lib/ramaze/helper/cache.rb +10 -6
- data/lib/ramaze/helper/csrf.rb +35 -39
- data/lib/ramaze/helper/disqus.rb +5 -4
- data/lib/ramaze/helper/email.rb +35 -24
- data/lib/ramaze/helper/erector.rb +9 -13
- data/lib/ramaze/helper/flash.rb +7 -9
- data/lib/ramaze/helper/formatting.rb +194 -179
- data/lib/ramaze/helper/gravatar.rb +4 -8
- data/lib/ramaze/helper/identity.rb +3 -3
- data/lib/ramaze/helper/layout.rb +23 -8
- data/lib/ramaze/helper/markaby.rb +1 -1
- data/lib/ramaze/helper/paginate.rb +46 -39
- data/lib/ramaze/helper/request_accessor.rb +3 -1
- data/lib/ramaze/helper/simple_captcha.rb +18 -17
- data/lib/ramaze/helper/stack.rb +1 -1
- data/lib/ramaze/helper/tagz.rb +4 -2
- data/lib/ramaze/helper/upload.rb +523 -0
- data/lib/ramaze/helper/user.rb +4 -8
- data/lib/ramaze/helper/xhtml.rb +11 -15
- data/lib/ramaze/log.rb +9 -6
- data/lib/ramaze/log/rotatinginformer.rb +62 -27
- data/lib/ramaze/log/syslog.rb +20 -15
- data/lib/ramaze/log/xosd.rb +2 -1
- data/lib/ramaze/reloader.rb +2 -0
- data/lib/ramaze/request.rb +11 -10
- data/lib/ramaze/setup.rb +23 -6
- data/lib/ramaze/snippets/array/put_within.rb +3 -9
- data/lib/ramaze/snippets/binding/locals.rb +5 -10
- data/lib/ramaze/snippets/fiber.rb +1 -23
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +3 -6
- data/lib/ramaze/snippets/numeric/filesize_format.rb +3 -5
- data/lib/ramaze/snippets/numeric/time.rb +3 -7
- data/lib/ramaze/snippets/object/__dir__.rb +3 -7
- data/lib/ramaze/snippets/object/instance_variable_defined.rb +3 -6
- data/lib/ramaze/snippets/object/pretty.rb +3 -7
- data/lib/ramaze/snippets/object/scope.rb +7 -9
- data/lib/ramaze/snippets/proc/locals.rb +12 -12
- data/lib/ramaze/snippets/ramaze/acquire.rb +15 -14
- data/lib/ramaze/snippets/ramaze/deprecated.rb +1 -1
- data/lib/ramaze/snippets/ramaze/fiber.rb +1 -1
- data/lib/ramaze/snippets/ramaze/lru_hash.rb +2 -3
- data/lib/ramaze/snippets/ramaze/struct.rb +2 -4
- data/lib/ramaze/snippets/string/camel_case.rb +8 -10
- data/lib/ramaze/snippets/string/color.rb +3 -4
- data/lib/ramaze/snippets/string/end_with.rb +3 -6
- data/lib/ramaze/snippets/string/esc.rb +3 -8
- data/lib/ramaze/snippets/string/ord.rb +3 -8
- data/lib/ramaze/snippets/string/snake_case.rb +6 -9
- data/lib/ramaze/snippets/string/start_with.rb +3 -8
- data/lib/ramaze/snippets/string/unindent.rb +3 -6
- data/lib/ramaze/snippets/thread/into.rb +1 -3
- data/lib/ramaze/spec.rb +2 -31
- data/lib/ramaze/spec/bacon.rb +18 -2
- data/lib/ramaze/version.rb +1 -1
- data/lib/ramaze/view.rb +1 -1
- data/ramaze.gemspec +1 -1
- data/spec/helper.rb +2 -1
- data/spec/ramaze/bin/start.rb +16 -20
- data/spec/ramaze/cache/localmemcache.rb +4 -7
- data/spec/ramaze/cache/memcache.rb +3 -1
- data/spec/ramaze/cache/redis.rb +62 -0
- data/spec/ramaze/helper/blue_form.rb +33 -4
- data/spec/ramaze/helper/layout.rb +40 -7
- data/spec/ramaze/helper/upload.rb +149 -0
- data/spec/ramaze/helper/uploads/text_1.txt +1 -0
- data/spec/ramaze/helper/uploads/text_2.txt +1 -0
- data/spec/ramaze/log/growl.rb +4 -6
- data/spec/ramaze/log/syslog.rb +6 -0
- data/spec/ramaze/view/lokar.rb +5 -0
- data/spec/ramaze/view/nagoro.rb +5 -0
- data/tasks/authors.rake +1 -1
- data/tasks/bacon.rake +14 -5
- data/tasks/changelog.rake +1 -1
- data/tasks/yard.rake +12 -4
- metadata +277 -239
- data/doc/LEGAL +0 -26
- data/examples/app/blog/README +0 -3
- data/examples/app/blog/controller/comment.rb +0 -45
- data/examples/app/blog/controller/entry.rb +0 -85
- data/examples/app/blog/controller/main.rb +0 -20
- data/examples/app/blog/controller/tag.rb +0 -9
- data/examples/app/blog/layout/default.nag +0 -31
- data/examples/app/blog/model/entry.rb +0 -89
- data/examples/app/blog/model/tag.rb +0 -36
- data/examples/app/blog/public/css/screen.css +0 -273
- data/examples/app/blog/spec/blog.rb +0 -87
- data/examples/app/blog/view/comment/form.nag +0 -10
- data/examples/app/blog/view/comment/show.nag +0 -16
- data/examples/app/blog/view/entry/edit.nag +0 -14
- data/examples/app/blog/view/entry/feed.atom.nag +0 -8
- data/examples/app/blog/view/entry/feed.rss.nag +0 -7
- data/examples/app/blog/view/entry/index.nag +0 -7
- data/examples/app/blog/view/entry/new.nag +0 -13
- data/examples/app/blog/view/entry/show.nag +0 -36
- data/examples/app/blog/view/feed.atom.nag +0 -18
- data/examples/app/blog/view/feed.rss.nag +0 -25
- data/examples/app/blog/view/index.nag +0 -6
- data/examples/app/blog/view/tag/index.nag +0 -5
- data/lib/proto/public/ramaze.png +0 -0
- data/lib/ramaze/rest.rb +0 -36
- data/spec/ramaze/rest.rb +0 -28
- data/tasks/rcov.rake +0 -22
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
##
|
|
2
|
+
# The User model is user for retrieving and authenticating users. This
|
|
3
|
+
# application uses bcrypt to hash the passwords. For more information on bcrypt
|
|
4
|
+
# see the following pages:
|
|
5
|
+
#
|
|
6
|
+
# * http://codahale.com/how-to-safely-store-a-password/
|
|
7
|
+
# * http://yorickpeterse.com/articles/use-bcrypt-fool/
|
|
8
|
+
# * https://github.com/codahale/bcrypt-ruby
|
|
9
|
+
#
|
|
10
|
+
# @author Yorick Peterse
|
|
11
|
+
# @since 26-09-2011
|
|
12
|
+
#
|
|
13
|
+
class User < Sequel::Model
|
|
14
|
+
# A user can have any number of posts and comments.
|
|
15
|
+
one_to_many :posts
|
|
16
|
+
one_to_many :comments
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# User.authenticate() is used to authenticate a user. Each request the User
|
|
20
|
+
# helper calls this method to see if the currently logged in user is a valid
|
|
21
|
+
# user. Once called this methods queries the database and returns a valid User
|
|
22
|
+
# object in case the specified details were correct or something that
|
|
23
|
+
# evaluates to false if this wasn't the case.
|
|
24
|
+
#
|
|
25
|
+
# @author Yorick Peterse
|
|
26
|
+
# @since 26-09-2011
|
|
27
|
+
# @param [Hash] creds A hash containing the username and password of the
|
|
28
|
+
# currently logged in user.
|
|
29
|
+
# @return [Users|FalseClass]
|
|
30
|
+
#
|
|
31
|
+
def self.authenticate(creds)
|
|
32
|
+
username, password = creds['username'], creds['password']
|
|
33
|
+
|
|
34
|
+
if creds['username'].nil? or creds['username'].empty?
|
|
35
|
+
return false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Let's see if there is a user for the given username.
|
|
39
|
+
user = self[:username => username]
|
|
40
|
+
|
|
41
|
+
# Validate the user. Note that while it may seem that the password is
|
|
42
|
+
# compared as plain text this is not the case. The bcrypt class
|
|
43
|
+
# automatically converts the given password to a bcrypt hash. If these
|
|
44
|
+
# hashes are the same the specified password is correct.
|
|
45
|
+
if !user.nil? or user.password == password
|
|
46
|
+
return user
|
|
47
|
+
else
|
|
48
|
+
return false
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# In order to properly use bcrypt we have to override the password=() and
|
|
54
|
+
# password() methods to return a correct bcrypt hash/object rather than
|
|
55
|
+
# whatever was stored in the database as a String instance.
|
|
56
|
+
#
|
|
57
|
+
# @author Yorick Peterse
|
|
58
|
+
# @since 26-09-2011
|
|
59
|
+
# @param [String] password The new password of a user.
|
|
60
|
+
#
|
|
61
|
+
def password=(password)
|
|
62
|
+
# Passing an empty password to the BCrypt class triggers errors.
|
|
63
|
+
if password.nil? or password.empty?
|
|
64
|
+
return
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Generates a new bcrypt password using a cost of 10. In my opinion a cost
|
|
68
|
+
# higher than 10 makes a web based application too slow.
|
|
69
|
+
password = BCrypt::Password.create(password, :cost => 10)
|
|
70
|
+
|
|
71
|
+
super(password)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
##
|
|
75
|
+
# Because the password=() is overwritten with a custom one we also have to
|
|
76
|
+
# define a matching getter. Without this you'd get an instance of String
|
|
77
|
+
# containing the bcrypt hash and thus wouldn't be able to properly compare it
|
|
78
|
+
# to other passwords.
|
|
79
|
+
#
|
|
80
|
+
# @author Yorick Peterse
|
|
81
|
+
# @since 26-09-2011
|
|
82
|
+
# @return [BCrypt::Password|NilClass]
|
|
83
|
+
#
|
|
84
|
+
def password
|
|
85
|
+
password = super
|
|
86
|
+
|
|
87
|
+
if !password.nil?
|
|
88
|
+
return BCrypt::Password.new(password)
|
|
89
|
+
else
|
|
90
|
+
return nil
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
##
|
|
95
|
+
# Validates an instance of this model. See Post#validate() for some extra
|
|
96
|
+
# details on how this works.
|
|
97
|
+
#
|
|
98
|
+
# @author Yorick Peterse
|
|
99
|
+
# @since 26-09-2011
|
|
100
|
+
#
|
|
101
|
+
def validate
|
|
102
|
+
validates_presence(:username)
|
|
103
|
+
validates_presence(:password) if new?
|
|
104
|
+
end
|
|
105
|
+
end # User
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# General Apache options
|
|
2
|
+
Options +FollowSymLinks +ExecCGI
|
|
3
|
+
AddHandler cgi-script cgi rb
|
|
4
|
+
<IfModule mod_fastcgi.c>
|
|
5
|
+
AddHandler fastcgi-script fcgi
|
|
6
|
+
</IfModule>
|
|
7
|
+
<IfModule mod_fcgid.c>
|
|
8
|
+
AddHandler fcgid-script fcgi
|
|
9
|
+
</IfModule>
|
|
10
|
+
|
|
11
|
+
# Redirect all requests not available on the filesystem to Ramaze.
|
|
12
|
+
|
|
13
|
+
RewriteEngine On
|
|
14
|
+
RewriteCond %{REQUEST_FILENAME} !-f
|
|
15
|
+
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
|
|
16
|
+
|
|
17
|
+
# In case Ramaze experiences terminal errors.
|
|
18
|
+
# Instead of displaying this message you can supply a
|
|
19
|
+
# file here which will be rendered instead.
|
|
20
|
+
#
|
|
21
|
+
# Example:
|
|
22
|
+
# ErrorDocument 500 /500.html
|
|
23
|
+
|
|
24
|
+
ErrorDocument 500 "<h2>Application error</h2>Ramaze failed to start properly"
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
@charset "UTF-8";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Modified version of the CSS grid (aka 1140 CSS) that can be found at http://cssgrid.net
|
|
5
|
+
*
|
|
6
|
+
* This modified version has some extra enhancements to make it a bit easier to work with
|
|
7
|
+
* the grid. Along with these minor fixes I also renamed all grid classes to the names
|
|
8
|
+
* used by the 960 grid system as I find "grid_6" easier to write than "sixcol".
|
|
9
|
+
*/
|
|
10
|
+
.container
|
|
11
|
+
{
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
padding-left: 1%;
|
|
14
|
+
padding-right: 1%;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.row
|
|
18
|
+
{
|
|
19
|
+
max-width: 96%;
|
|
20
|
+
margin: 0 auto;
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
width: 100%;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.grid_1, .grid_2, .grid_3, .grid_4, .grid_5, .grid_6, .grid_7, .grid_8, .grid_9,
|
|
26
|
+
.grid_10, .grid_11
|
|
27
|
+
{
|
|
28
|
+
float: left;
|
|
29
|
+
margin-right: 3.8%;
|
|
30
|
+
min-height: 1px;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.row .grid_1
|
|
34
|
+
{
|
|
35
|
+
width: 4.85%;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.row .grid_2
|
|
39
|
+
{
|
|
40
|
+
width: 13.45%;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.row .grid_3
|
|
44
|
+
{
|
|
45
|
+
width: 22.05%;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.row .grid_4
|
|
49
|
+
{
|
|
50
|
+
width: 30.75%;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.row .grid_5
|
|
54
|
+
{
|
|
55
|
+
width: 39.45%;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.row .grid_6
|
|
59
|
+
{
|
|
60
|
+
width: 48%;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.row .grid_7
|
|
64
|
+
{
|
|
65
|
+
width: 56.75%;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.row .grid_8
|
|
69
|
+
{
|
|
70
|
+
width: 65.4%;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.row .grid_9
|
|
74
|
+
{
|
|
75
|
+
width: 74.05%;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.row .grid_10
|
|
79
|
+
{
|
|
80
|
+
width: 82.7%;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.row .grid_11
|
|
84
|
+
{
|
|
85
|
+
width: 91.35%;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.row .grid_12
|
|
89
|
+
{
|
|
90
|
+
float: left;
|
|
91
|
+
width: 100%;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.last, .row > *:last-child
|
|
95
|
+
{
|
|
96
|
+
margin-right: 0px;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
img, object, embed
|
|
100
|
+
{
|
|
101
|
+
max-width: 100%;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
img
|
|
105
|
+
{
|
|
106
|
+
height: auto;
|
|
107
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stylesheet used for the layout of most elements.
|
|
3
|
+
*
|
|
4
|
+
* @author Yorick Peterse
|
|
5
|
+
* @link http://yorickpeterse.com/
|
|
6
|
+
*/
|
|
7
|
+
#container
|
|
8
|
+
{
|
|
9
|
+
margin: 20px auto;
|
|
10
|
+
width: 940px;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
#content
|
|
14
|
+
{
|
|
15
|
+
background: #fff;
|
|
16
|
+
border: 1px solid #ddd;
|
|
17
|
+
padding: 20px;
|
|
18
|
+
width: 898px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Top part of the website, contains the title and the navigation menu */
|
|
22
|
+
#top
|
|
23
|
+
{
|
|
24
|
+
background: #E33F1E;
|
|
25
|
+
height: 70px;
|
|
26
|
+
margin-bottom: 20px;
|
|
27
|
+
padding: 0px 10px;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#top header h1
|
|
31
|
+
{
|
|
32
|
+
color: #fff;
|
|
33
|
+
font-size: 38px;
|
|
34
|
+
margin: 10px 0px 0px 0px;
|
|
35
|
+
padding: 0px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
#top nav ul
|
|
39
|
+
{
|
|
40
|
+
float: right;
|
|
41
|
+
margin-right: 15px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#top nav ul li
|
|
45
|
+
{
|
|
46
|
+
float: left;
|
|
47
|
+
font-size: 16px;
|
|
48
|
+
list-style-type: none;
|
|
49
|
+
margin-right: 10px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#top nav ul li:last-child
|
|
53
|
+
{
|
|
54
|
+
margin-right: 0px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#top nav ul li a
|
|
58
|
+
{
|
|
59
|
+
color: #fff;
|
|
60
|
+
display: block;
|
|
61
|
+
height: 45px;
|
|
62
|
+
padding: 25px 10px 0px 10px;
|
|
63
|
+
text-decoration: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
#top nav ul li a:hover
|
|
67
|
+
{
|
|
68
|
+
background: #D43919;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Footer at the bottom of the page */
|
|
72
|
+
#footer
|
|
73
|
+
{
|
|
74
|
+
text-align: center;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#footer p
|
|
78
|
+
{
|
|
79
|
+
font-size: 13px;
|
|
80
|
+
margin-bottom: 10px;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
form label
|
|
84
|
+
{
|
|
85
|
+
display: block;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
form label span.error
|
|
89
|
+
{
|
|
90
|
+
color: #E33F1E;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
form input[type="text"], form textarea, form input[type="password"]
|
|
94
|
+
{
|
|
95
|
+
border: 1px solid #ccc;
|
|
96
|
+
font-size: 14px;
|
|
97
|
+
padding: 5px;
|
|
98
|
+
width: 300px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
form textarea
|
|
102
|
+
{
|
|
103
|
+
width: auto;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
form input[type="submit"]
|
|
107
|
+
{
|
|
108
|
+
background: #fff;
|
|
109
|
+
border: 1px solid #ccc;
|
|
110
|
+
font-size: 14px;
|
|
111
|
+
padding: 3px 5px;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
form input[type="submit"]:hover
|
|
115
|
+
{
|
|
116
|
+
background: #eee;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* Comments */
|
|
120
|
+
#comments > h1
|
|
121
|
+
{
|
|
122
|
+
margin-bottom: 10px;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
#comments article header h1
|
|
126
|
+
{
|
|
127
|
+
font-size: 16px;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
#comments article header .meta
|
|
131
|
+
{
|
|
132
|
+
margin-bottom: 10px;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Notifications */
|
|
136
|
+
.message
|
|
137
|
+
{
|
|
138
|
+
margin-bottom: 20px;
|
|
139
|
+
text-align: center;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.message p
|
|
143
|
+
{
|
|
144
|
+
margin-bottom: 0px;
|
|
145
|
+
padding: 5px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.message.success
|
|
149
|
+
{
|
|
150
|
+
background: #DAEDA6;
|
|
151
|
+
color: #000;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.message.error
|
|
155
|
+
{
|
|
156
|
+
background: #E33F1E;
|
|
157
|
+
color: #fff;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Pagination system */
|
|
161
|
+
.pager span
|
|
162
|
+
{
|
|
163
|
+
display: none;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.pager a
|
|
167
|
+
{
|
|
168
|
+
border: 1px solid #ccc;
|
|
169
|
+
display: inline-block;
|
|
170
|
+
margin-right: 8px;
|
|
171
|
+
min-width: 20px;
|
|
172
|
+
padding: 5px;
|
|
173
|
+
text-decoration: none;
|
|
174
|
+
text-align: center;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.pager a:hover, .pager a.current
|
|
178
|
+
{
|
|
179
|
+
background: #eee;
|
|
180
|
+
color: #000;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
table
|
|
184
|
+
{
|
|
185
|
+
margin-bottom: 10px;
|
|
186
|
+
text-align: left;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
table thead tr th
|
|
190
|
+
{
|
|
191
|
+
border-bottom: 2px solid #ccc!important;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
table thead tr th, table tbody tr td
|
|
195
|
+
{
|
|
196
|
+
border-bottom: 1px solid #ccc;
|
|
197
|
+
padding: 8px 3px;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
table tbody tr:last-child td
|
|
201
|
+
{
|
|
202
|
+
border-bottom: none;
|
|
203
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
@charset "UTF-8";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* http://meyerweb.com/eric/tools/css/reset/
|
|
5
|
+
* v2.0 | 20110126
|
|
6
|
+
* License: none (public domain)
|
|
7
|
+
*/
|
|
8
|
+
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
|
9
|
+
a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small,
|
|
10
|
+
strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset,
|
|
11
|
+
form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside,
|
|
12
|
+
canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output,
|
|
13
|
+
ruby, section, summary, time, mark, audio, video
|
|
14
|
+
{
|
|
15
|
+
border: 0;
|
|
16
|
+
font-size: 100%;
|
|
17
|
+
font: inherit;
|
|
18
|
+
margin: 0;
|
|
19
|
+
padding: 0;
|
|
20
|
+
vertical-align: baseline;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* HTML5 display-role reset for older browsers */
|
|
24
|
+
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section
|
|
25
|
+
{
|
|
26
|
+
display: block;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
body
|
|
30
|
+
{
|
|
31
|
+
line-height: 1.3;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
ol, ul, ol li, ul li
|
|
35
|
+
{
|
|
36
|
+
list-style-type: none;
|
|
37
|
+
margin: 0px;
|
|
38
|
+
padding: 0px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
blockquote, q
|
|
42
|
+
{
|
|
43
|
+
quotes: none;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
blockquote:before, blockquote:after, q:before, q:after
|
|
47
|
+
{
|
|
48
|
+
content: '';
|
|
49
|
+
content: none;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
table
|
|
53
|
+
{
|
|
54
|
+
/**
|
|
55
|
+
* Instead of "collapse" I'm using "separate" as that allows me to give table cells
|
|
56
|
+
* a border without having to go through a lot of trouble
|
|
57
|
+
*/
|
|
58
|
+
border-collapse: separate;
|
|
59
|
+
border-spacing: 0;
|
|
60
|
+
width: 100%;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
table th
|
|
64
|
+
{
|
|
65
|
+
font-weight: bold;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
pre, code
|
|
69
|
+
{
|
|
70
|
+
font-size: 13px;
|
|
71
|
+
font-family: monospace;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* These form elements usually don't trigger any special cursor and thus can confuse
|
|
76
|
+
* users when these elements have custom styles (e.g. a background image).
|
|
77
|
+
*/
|
|
78
|
+
input[type="submit"], input[type="button"], input[type="checkbox"], input[type="radio"],
|
|
79
|
+
button, select
|
|
80
|
+
{
|
|
81
|
+
cursor: pointer;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
*[disabled], *[disabled="disabled"]
|
|
85
|
+
{
|
|
86
|
+
cursor: not-allowed;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
textarea
|
|
90
|
+
{
|
|
91
|
+
overflow: auto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
acronym, abbr
|
|
95
|
+
{
|
|
96
|
+
cursor: help;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Some typography related styles */
|
|
100
|
+
body
|
|
101
|
+
{
|
|
102
|
+
font-size: 16px;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
h1, h2, h3, h4, h5, h6
|
|
106
|
+
{
|
|
107
|
+
font-weight: bold;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
a:hover, a:active
|
|
111
|
+
{
|
|
112
|
+
outline: none;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
strong
|
|
116
|
+
{
|
|
117
|
+
font-weight: bold;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
small
|
|
121
|
+
{
|
|
122
|
+
font-size: 11px;
|
|
123
|
+
}
|