ramaze 2011.07.25 → 2011.10.23
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|