shixian-redactor-rails 0.5.0

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 (100) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/Gemfile +25 -0
  4. data/MIT-LICENSE +22 -0
  5. data/README.md +234 -0
  6. data/Rakefile +3 -0
  7. data/app/controller/redactor_rails/documents_controller.rb +34 -0
  8. data/app/controller/redactor_rails/pictures_controller.rb +39 -0
  9. data/config/routes.rb +4 -0
  10. data/lib/generators/redactor/config_generator.rb +18 -0
  11. data/lib/generators/redactor/install_generator.rb +75 -0
  12. data/lib/generators/redactor/templates/active_record/carrierwave/devise_migration.rb +30 -0
  13. data/lib/generators/redactor/templates/active_record/carrierwave/migration.rb +28 -0
  14. data/lib/generators/redactor/templates/active_record/carrierwave/redactor/asset.rb +5 -0
  15. data/lib/generators/redactor/templates/active_record/carrierwave/redactor/document.rb +11 -0
  16. data/lib/generators/redactor/templates/active_record/carrierwave/redactor/picture.rb +7 -0
  17. data/lib/generators/redactor/templates/base/carrierwave/uploaders/redactor_rails_document_uploader.rb +15 -0
  18. data/lib/generators/redactor/templates/base/carrierwave/uploaders/redactor_rails_picture_uploader.rb +53 -0
  19. data/lib/generators/redactor/templates/config.js +22 -0
  20. data/lib/generators/redactor/templates/mongoid/carrierwave/redactor/asset.rb +9 -0
  21. data/lib/generators/redactor/templates/mongoid/carrierwave/redactor/document.rb +14 -0
  22. data/lib/generators/redactor/templates/mongoid/carrierwave/redactor/picture.rb +7 -0
  23. data/lib/redactor-rails/backend/carrierwave.rb +64 -0
  24. data/lib/redactor-rails/devise.rb +11 -0
  25. data/lib/redactor-rails/engine.rb +14 -0
  26. data/lib/redactor-rails/helper.rb +5 -0
  27. data/lib/redactor-rails/http.rb +89 -0
  28. data/lib/redactor-rails/orm/active_record.rb +31 -0
  29. data/lib/redactor-rails/orm/base.rb +38 -0
  30. data/lib/redactor-rails/orm/mongoid.rb +37 -0
  31. data/lib/redactor-rails/version.rb +3 -0
  32. data/lib/redactor-rails.rb +41 -0
  33. data/redactor-rails.gemspec +21 -0
  34. data/vendor/assets/javascripts/redactor-rails/config.js +16 -0
  35. data/vendor/assets/javascripts/redactor-rails/css/docstyle.css +139 -0
  36. data/vendor/assets/javascripts/redactor-rails/css/style.css +26 -0
  37. data/vendor/assets/javascripts/redactor-rails/css/wym.css +151 -0
  38. data/vendor/assets/javascripts/redactor-rails/index.js +2 -0
  39. data/vendor/assets/javascripts/redactor-rails/langs/ar.js +73 -0
  40. data/vendor/assets/javascripts/redactor-rails/langs/az.js +72 -0
  41. data/vendor/assets/javascripts/redactor-rails/langs/ba.js +76 -0
  42. data/vendor/assets/javascripts/redactor-rails/langs/bg.js +74 -0
  43. data/vendor/assets/javascripts/redactor-rails/langs/by.js +72 -0
  44. data/vendor/assets/javascripts/redactor-rails/langs/ca.js +72 -0
  45. data/vendor/assets/javascripts/redactor-rails/langs/cs.js +84 -0
  46. data/vendor/assets/javascripts/redactor-rails/langs/da.js +73 -0
  47. data/vendor/assets/javascripts/redactor-rails/langs/de.js +77 -0
  48. data/vendor/assets/javascripts/redactor-rails/langs/el.js +72 -0
  49. data/vendor/assets/javascripts/redactor-rails/langs/en.js +72 -0
  50. data/vendor/assets/javascripts/redactor-rails/langs/eo.js +73 -0
  51. data/vendor/assets/javascripts/redactor-rails/langs/es.js +73 -0
  52. data/vendor/assets/javascripts/redactor-rails/langs/es_ar.js +73 -0
  53. data/vendor/assets/javascripts/redactor-rails/langs/fa.js +73 -0
  54. data/vendor/assets/javascripts/redactor-rails/langs/fi.js +72 -0
  55. data/vendor/assets/javascripts/redactor-rails/langs/fr.js +72 -0
  56. data/vendor/assets/javascripts/redactor-rails/langs/he.js +72 -0
  57. data/vendor/assets/javascripts/redactor-rails/langs/hr.js +71 -0
  58. data/vendor/assets/javascripts/redactor-rails/langs/hu.js +74 -0
  59. data/vendor/assets/javascripts/redactor-rails/langs/id.js +73 -0
  60. data/vendor/assets/javascripts/redactor-rails/langs/it.js +75 -0
  61. data/vendor/assets/javascripts/redactor-rails/langs/ja.js +73 -0
  62. data/vendor/assets/javascripts/redactor-rails/langs/ko.js +73 -0
  63. data/vendor/assets/javascripts/redactor-rails/langs/lt.js +72 -0
  64. data/vendor/assets/javascripts/redactor-rails/langs/lv.js +72 -0
  65. data/vendor/assets/javascripts/redactor-rails/langs/mk.js +72 -0
  66. data/vendor/assets/javascripts/redactor-rails/langs/nl.js +76 -0
  67. data/vendor/assets/javascripts/redactor-rails/langs/no_NB.js +72 -0
  68. data/vendor/assets/javascripts/redactor-rails/langs/pl.js +73 -0
  69. data/vendor/assets/javascripts/redactor-rails/langs/pt_br.js +79 -0
  70. data/vendor/assets/javascripts/redactor-rails/langs/pt_pt.js +72 -0
  71. data/vendor/assets/javascripts/redactor-rails/langs/ro.js +73 -0
  72. data/vendor/assets/javascripts/redactor-rails/langs/ru.js +73 -0
  73. data/vendor/assets/javascripts/redactor-rails/langs/sk.js +73 -0
  74. data/vendor/assets/javascripts/redactor-rails/langs/sl.js +76 -0
  75. data/vendor/assets/javascripts/redactor-rails/langs/sq.js +76 -0
  76. data/vendor/assets/javascripts/redactor-rails/langs/sr-cir.js +76 -0
  77. data/vendor/assets/javascripts/redactor-rails/langs/sr-lat.js +76 -0
  78. data/vendor/assets/javascripts/redactor-rails/langs/sv.js +73 -0
  79. data/vendor/assets/javascripts/redactor-rails/langs/th.js +72 -0
  80. data/vendor/assets/javascripts/redactor-rails/langs/tr.js +73 -0
  81. data/vendor/assets/javascripts/redactor-rails/langs/ua.js +74 -0
  82. data/vendor/assets/javascripts/redactor-rails/langs/vi.js +72 -0
  83. data/vendor/assets/javascripts/redactor-rails/langs/zh_cn.js +74 -0
  84. data/vendor/assets/javascripts/redactor-rails/langs/zh_tw.js +73 -0
  85. data/vendor/assets/javascripts/redactor-rails/plugins/clips.js +61 -0
  86. data/vendor/assets/javascripts/redactor-rails/plugins/fontcolor.js +76 -0
  87. data/vendor/assets/javascripts/redactor-rails/plugins/fontfamily.js +35 -0
  88. data/vendor/assets/javascripts/redactor-rails/plugins/fontsize.js +34 -0
  89. data/vendor/assets/javascripts/redactor-rails/plugins/fullscreen.js +123 -0
  90. data/vendor/assets/javascripts/redactor-rails/plugins/textdirection.js +31 -0
  91. data/vendor/assets/javascripts/redactor-rails/plugins.js +6 -0
  92. data/vendor/assets/javascripts/redactor-rails/redactor.js +8053 -0
  93. data/vendor/assets/javascripts/redactor-rails/redactor.min.js +12 -0
  94. data/vendor/assets/stylesheets/redactor-rails/css/redactor-iframe.css +202 -0
  95. data/vendor/assets/stylesheets/redactor-rails/css/redactor.css +930 -0
  96. data/vendor/assets/stylesheets/redactor-rails/css/style.css +26 -0
  97. data/vendor/assets/stylesheets/redactor-rails/index.css +1 -0
  98. data/vendor/assets/stylesheets/redactor-rails/plugins/clips.css +6 -0
  99. data/vendor/assets/stylesheets/redactor-rails/plugins.css +3 -0
  100. metadata +183 -0
@@ -0,0 +1,14 @@
1
+ class RedactorRails::Document < RedactorRails::Asset
2
+ mount_uploader :data, RedactorRailsDocumentUploader, :mount_on => :data_file_name
3
+
4
+ def url_content
5
+ url(:content)
6
+ end
7
+
8
+ def thumb
9
+ # Could theoretically provide an icon set here
10
+ # to match against the extensions
11
+ # but for now it's nil to address the bug
12
+ nil
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ class RedactorRails::Picture < RedactorRails::Asset
2
+ mount_uploader :data, RedactorRailsPictureUploader, :mount_on => :data_file_name
3
+
4
+ def url_content
5
+ url(:content)
6
+ end
7
+ end
@@ -0,0 +1,64 @@
1
+ require 'mime/types'
2
+ require 'mini_magick'
3
+
4
+ module RedactorRails
5
+ module Backend
6
+ module CarrierWave
7
+ def self.included(base)
8
+ base.send(:include, InstanceMethods)
9
+ base.send(:extend, ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def self.extended(base)
14
+ base.class_eval do
15
+ process :extract_content_type
16
+ process :set_size
17
+ end
18
+ end
19
+ end
20
+
21
+ module InstanceMethods
22
+ # process :strip
23
+ def strip
24
+ manipulate! do |img|
25
+ img.strip
26
+ img = yield(img) if block_given?
27
+ img
28
+ end
29
+ end
30
+
31
+ # process :quality => 85
32
+ def quality(percentage)
33
+ manipulate! do |img|
34
+ img.quality(percentage)
35
+ img = yield(img) if block_given?
36
+ img
37
+ end
38
+ end
39
+
40
+ def extract_content_type
41
+ if file.content_type == 'application/octet-stream' || file.content_type.blank?
42
+ content_type = MIME::Types.type_for(original_filename).first
43
+ else
44
+ content_type = file.content_type
45
+ end
46
+
47
+ model.data_content_type = content_type.to_s
48
+ end
49
+
50
+ def set_size
51
+ model.data_file_size = file.size
52
+ end
53
+
54
+ def read_dimensions
55
+ if model.image? && model.has_dimensions?
56
+ magick = ::MiniMagick::Image.new(current_path)
57
+ model.width, model.height = magick[:width], magick[:height]
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,11 @@
1
+ module RedactorRails
2
+ module Devise
3
+ def redactor_authenticate_user!
4
+ authenticate_user!
5
+ end
6
+
7
+ def redactor_current_user
8
+ current_user
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module RedactorRails
2
+ class Engine < Rails::Engine
3
+ isolate_namespace RedactorRails
4
+ initializer "helper" do |app|
5
+ ActiveSupport.on_load(:action_view) do
6
+ include RedactorRails::Helpers
7
+ end
8
+ end
9
+
10
+ initializer "redactor_devise" do |app|
11
+ ActionController::Base.send :include, RedactorRails::Devise
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module RedactorRails
2
+ module Helpers
3
+
4
+ end
5
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ require 'digest/sha1'
3
+ require 'mime/types'
4
+
5
+ module RedactorRails
6
+ module Http
7
+ # Create tempfile from hash
8
+ class UploadedFile
9
+ attr_accessor :original_filename, :content_type, :tempfile, :headers
10
+
11
+ def initialize(hash)
12
+ @original_filename = hash[:filename]
13
+ @content_type = hash[:type]
14
+ @headers = hash[:head]
15
+ @tempfile = hash[:tempfile]
16
+ raise(ArgumentError, ':tempfile is required') unless @tempfile
17
+ end
18
+
19
+ def open
20
+ @tempfile.open
21
+ end
22
+
23
+ def path
24
+ @tempfile.path
25
+ end
26
+
27
+ def read(*args)
28
+ @tempfile.read(*args)
29
+ end
30
+
31
+ def rewind
32
+ @tempfile.rewind
33
+ end
34
+
35
+ def size
36
+ @tempfile.size
37
+ end
38
+ end
39
+
40
+ # Usage (paperclip example)
41
+ # @asset.data = QqFile.new(params[:qqfile], request)
42
+ class QqFile < ::Tempfile
43
+
44
+ def initialize(filename, request, tmpdir = Dir::tmpdir)
45
+ @original_filename = filename
46
+ @request = request
47
+
48
+ super Digest::SHA1.hexdigest(filename), tmpdir
49
+ fetch
50
+ end
51
+
52
+ def fetch
53
+ self.write(body)
54
+ self.rewind
55
+ self
56
+ end
57
+
58
+ def original_filename
59
+ @original_filename
60
+ end
61
+
62
+ def content_type
63
+ types = MIME::Types.type_for(original_filename)
64
+ types.empty? ? @request.content_type : types.first.to_s
65
+ end
66
+
67
+ def body
68
+ if @request.raw_post.respond_to?(:force_encoding)
69
+ @request.raw_post.force_encoding("UTF-8")
70
+ else
71
+ @request.raw_post
72
+ end
73
+ end
74
+ end
75
+
76
+ # Convert nested Hash to HashWithIndifferentAccess and replace
77
+ # file upload hash with UploadedFile objects
78
+ def self.normalize_param(*args)
79
+ value = args.first
80
+ if Hash === value && value.has_key?(:tempfile)
81
+ UploadedFile.new(value)
82
+ elsif value.is_a?(String)
83
+ QqFile.new(*args)
84
+ else
85
+ value
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,31 @@
1
+ require 'redactor-rails/orm/base'
2
+
3
+ module RedactorRails
4
+ module Orm
5
+ module ActiveRecord
6
+ module AssetBase
7
+ def self.included(base)
8
+ base.send(:include, Base::AssetBase::InstanceMethods)
9
+ base.send(:extend, ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def self.extended(base)
14
+ base.class_eval do
15
+ self.table_name = "redactor_assets"
16
+
17
+ belongs_to :assetable, :polymorphic => true
18
+ belongs_to RedactorRails.devise_user, :foreign_key => RedactorRails.devise_user_key
19
+
20
+ if defined?(ActiveModel::ForbiddenAttributesProtection) && base.ancestors.include?(ActiveModel::ForbiddenAttributesProtection)
21
+ # Ok
22
+ elsif defined?(ActiveModel::MassAssignmentSecurity) && base.ancestors.include?(ActiveModel::MassAssignmentSecurity)
23
+ attr_accessible :data, :assetable_type, :assetable_id, :assetable
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ module RedactorRails
2
+ module Orm
3
+ module Base
4
+ module AssetBase
5
+ module InstanceMethods
6
+ def has_dimensions?
7
+ respond_to?(:width) && respond_to?(:height)
8
+ end
9
+
10
+ def image?
11
+ RedactorRails::IMAGE_TYPES.include?(data_content_type)
12
+ end
13
+
14
+ def image
15
+ url
16
+ end
17
+
18
+ def thumb
19
+ url(:thumb)
20
+ end
21
+
22
+ def as_json_methods
23
+ [:image, :thumb]
24
+ end
25
+
26
+ def as_json(options = nil)
27
+ options = {
28
+ :methods => as_json_methods,
29
+ :root => false
30
+ }
31
+
32
+ super options
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ require 'redactor-rails/orm/base'
2
+
3
+ module RedactorRails
4
+ module Orm
5
+ module Mongoid
6
+ module AssetBase
7
+ def self.included(base)
8
+ base.send(:include, Base::AssetBase::InstanceMethods)
9
+ base.send(:extend, ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def self.extended(base)
14
+ base.class_eval do
15
+ store_in :collection => 'redactor_assets'
16
+
17
+ belongs_to :assetable, :polymorphic => true
18
+
19
+ field :data_file_name, :type => String
20
+ field :data_content_type, :type => String
21
+ field :data_file_size, :type => Integer
22
+
23
+ field :type, :type => String
24
+
25
+ field :width, :type => Integer
26
+ field :height, :type => Integer
27
+
28
+ index( :assetable => 1, :type => 1 )
29
+ index( :assetable => 1 )
30
+
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module RedactorRails
2
+ VERSION = "0.5.0"
3
+ end
@@ -0,0 +1,41 @@
1
+ require "orm_adapter"
2
+ require "redactor-rails/version"
3
+
4
+ module RedactorRails
5
+ IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/pjpeg', 'image/tiff', 'image/x-png']
6
+
7
+ FILE_TYPES = ['application/msword', 'application/pdf', 'text/plain', 'text/rtf', 'application/vnd.ms-excel']
8
+
9
+ autoload :Http, 'redactor-rails/http'
10
+ autoload :Devise, 'redactor-rails/devise'
11
+
12
+ module Backend
13
+ autoload :CarrierWave, 'redactor-rails/backend/carrierwave'
14
+ end
15
+ require 'redactor-rails/orm/base'
16
+ require 'redactor-rails/orm/active_record'
17
+ require 'redactor-rails/orm/mongoid'
18
+ require 'redactor-rails/engine'
19
+ require 'redactor-rails/helper'
20
+
21
+ mattr_accessor :image_file_types, :document_file_types
22
+ @@image_file_types = ["jpg", "jpeg", "png", "gif", "tiff"]
23
+ @@document_file_types = ["pdf", "doc", "docx", "xls", "xlsx", "rtf", "txt"]
24
+
25
+
26
+ def self.picture_model
27
+ RedactorRails::Picture
28
+ end
29
+
30
+ def self.document_model
31
+ RedactorRails::Document
32
+ end
33
+
34
+ def self.devise_user
35
+ %s(user)
36
+ end
37
+
38
+ def self.devise_user_key
39
+ "#{self.devise_user.to_s}_id".to_sym
40
+ end
41
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/redactor-rails/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Sammy"]
6
+ gem.email = ["sammylintw@gmail.com"]
7
+ gem.description = "The redactor-rails gem integrates the Redactor editor"
8
+ gem.summary = ""
9
+ gem.homepage = "https://github.com/shixiancom/redactor-rails"
10
+ gem.license = 'MIT'
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "shixian-redactor-rails"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = RedactorRails::VERSION
17
+
18
+ gem.add_dependency("mime-types")
19
+ gem.add_dependency("orm_adapter")
20
+ gem.add_dependency("devise")
21
+ end
@@ -0,0 +1,16 @@
1
+ window.init_redactor = function(){
2
+ var csrf_token = $('meta[name=csrf-token]').attr('content');
3
+ var csrf_param = $('meta[name=csrf-param]').attr('content');
4
+ var params;
5
+ if (csrf_param !== undefined && csrf_token !== undefined) {
6
+ params = csrf_param + "=" + encodeURIComponent(csrf_token);
7
+ }
8
+ $('.redactor').redactor(
9
+ { "imageUpload":"/redactor_rails/pictures?" + params,
10
+ "imageGetJson":"/redactor_rails/pictures",
11
+ "path":"/assets/redactor-rails",
12
+ "css":"style.css"}
13
+ );
14
+ }
15
+
16
+ $(document).on( 'ready page:load', window.init_redactor );
@@ -0,0 +1,139 @@
1
+ html {
2
+ padding: 0;
3
+ margin: 0;
4
+ }
5
+ body {
6
+ font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif;
7
+ font-size: 15px;
8
+ margin: 0;
9
+ padding: 0;
10
+ overflow-x: hidden;
11
+ background: #f4f4f4;
12
+ }
13
+ #page {
14
+ max-width: 900px;
15
+ width: 74%;
16
+ margin: 20px auto;
17
+ padding: 15px 50px;
18
+ background: #fff;
19
+ border: 1px solid #ddd;
20
+ }
21
+ #page:focus {
22
+ outline: none;
23
+ }
24
+
25
+ a {
26
+ color: #15c;
27
+ }
28
+
29
+ object,
30
+ embed,
31
+ video,
32
+ iframe {
33
+ width: auto;
34
+ max-width: 100%;
35
+ }
36
+ video,
37
+ iframe {
38
+ height: auto;
39
+ }
40
+
41
+ ::selection {
42
+ background-color: #333;
43
+ color: #fff;
44
+ text-shadow: none;
45
+ }
46
+
47
+ div,
48
+ p,
49
+ ul,
50
+ ol,
51
+ table,
52
+ dl,
53
+ blockquote,
54
+ pre,
55
+ iframe,
56
+ object,
57
+ hr {
58
+ margin-bottom: 15px;
59
+ line-height: 1.5em;
60
+ }
61
+ blockquote {
62
+ margin-left: 3em;
63
+ font-style: italic;
64
+ color: #777;
65
+ }
66
+ ul, ol {
67
+ padding-left: 2em;
68
+ }
69
+ ul ul,
70
+ ol ol,
71
+ ul ol,
72
+ ol ul {
73
+ border: none;
74
+ margin: 2px !important;
75
+ padding: 0;
76
+ padding-left: 2em;
77
+ }
78
+ dl dt { font-weight: bold; }
79
+ dd { margin-left: 1em;}
80
+
81
+ table {
82
+ border-collapse: collapse;
83
+ font-size: 1em;
84
+ }
85
+ table td {
86
+ border: 1px solid #ddd;
87
+ padding: 5px;
88
+ }
89
+ table thead td {
90
+ border-bottom: 2px solid #000 !important;
91
+ font-weight: bold;
92
+ }
93
+ code, pre {
94
+ font-family: monospace sans-serif;
95
+ }
96
+ code {
97
+ background-color: #d8d7d7;
98
+ }
99
+ pre {
100
+ padding: 1em;
101
+ border: 1px dashed #ccc;
102
+ background: #f5f5f5;
103
+ overflow: auto;
104
+ }
105
+ hr {
106
+ display: block;
107
+ height: 1px;
108
+ border: 0;
109
+ border-top: 1px solid #ccc;
110
+ }
111
+
112
+ h1, h2, h3, h4,h5 {
113
+ font-weight: bold;
114
+ }
115
+
116
+ h1 {
117
+ font-size: 36px;
118
+ line-height: 40px;
119
+ margin-bottom: 10px;
120
+ }
121
+ h2 {
122
+ font-size: 30px;
123
+ line-height: 36px;
124
+ margin-bottom: 15px;
125
+ }
126
+ h3 {
127
+ font-size: 24px;
128
+ line-height: 30px;
129
+ margin-bottom: 10px;
130
+ }
131
+ h4 {
132
+ font-size: 18px;
133
+ line-height: 24px;
134
+ margin-bottom: 10px;
135
+ }
136
+ h4 {
137
+ font-size: 1em;
138
+ margin-bottom: 10px;
139
+ }
@@ -0,0 +1,26 @@
1
+ html, body {
2
+ margin: 0;
3
+ padding: 0;
4
+ }
5
+
6
+
7
+ /* =Typography
8
+ -----------------------------------------------------------------------------*/
9
+ body {
10
+ font-family: Helvetica, Arial, sans-serif;
11
+ font-size: 14px;
12
+ }
13
+
14
+
15
+ /* =Layout
16
+ -----------------------------------------------------------------------------*/
17
+ #page {
18
+ width: 940px;
19
+ margin: 50px auto;
20
+ }
21
+
22
+ /* =Misc
23
+ -----------------------------------------------------------------------------*/
24
+ .list li {
25
+ margin: 10px 0;
26
+ }