typus 3.1.2 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/CHANGELOG +23 -0
  2. data/Gemfile +5 -5
  3. data/README.md +8 -8
  4. data/app/assets/javascripts/typus/application.js +1 -1
  5. data/app/assets/javascripts/typus/jquery.application.js +25 -28
  6. data/app/controllers/admin/resources_controller.rb +1 -1
  7. data/app/helpers/admin/resources/data_types/belongs_to_helper.rb +3 -1
  8. data/app/helpers/admin/resources/data_types/dragonfly_helper.rb +1 -1
  9. data/app/helpers/admin/resources/data_types/has_and_belongs_to_many_helper.rb +3 -3
  10. data/app/helpers/admin/resources/data_types/has_many_helper.rb +2 -2
  11. data/app/helpers/admin/resources/data_types/has_one_helper.rb +1 -1
  12. data/app/helpers/admin/resources/data_types/paperclip_helper.rb +2 -2
  13. data/app/helpers/admin/resources/form_helper.rb +1 -1
  14. data/app/helpers/admin/resources/table_helper.rb +2 -2
  15. data/app/views/admin/dashboard/styles.html.erb +94 -90
  16. data/app/views/admin/dashboard/widgets/_applications.html.erb +1 -1
  17. data/app/views/admin/dashboard/widgets/_models.html.erb +1 -1
  18. data/app/views/admin/dashboard/widgets/_models_extended.html.erb +1 -1
  19. data/app/views/admin/resources/_form.html.erb +1 -1
  20. data/app/views/admin/resources/edit.html.erb +7 -5
  21. data/app/views/admin/templates/_belongs_to.html.erb +8 -2
  22. data/app/views/admin/templates/_date.html.erb +0 -5
  23. data/app/views/admin/templates/_datetime.html.erb +0 -5
  24. data/app/views/admin/templates/_has_and_belongs_to_many.html.erb +14 -12
  25. data/app/views/admin/templates/_text_with_ckeditor_and_assets.html.erb +1 -1
  26. data/config/routes.rb +2 -2
  27. data/lib/generators/typus/config_generator.rb +14 -9
  28. data/lib/support/string.rb +1 -1
  29. data/lib/typus.rb +3 -2
  30. data/lib/typus/configuration.rb +3 -3
  31. data/lib/typus/controller/autocomplete.rb +13 -0
  32. data/lib/typus/controller/format.rb +1 -1
  33. data/lib/typus/controller/headless.rb +3 -1
  34. data/lib/typus/i18n.rb +3 -4
  35. data/lib/typus/orm/active_record/class_methods.rb +4 -4
  36. data/lib/typus/orm/base.rb +2 -2
  37. data/lib/typus/resources.rb +1 -1
  38. data/lib/typus/version.rb +1 -1
  39. data/typus.gemspec +3 -2
  40. data/vendor/assets/chosen/LICENSE.md +24 -0
  41. data/vendor/assets/chosen/chosen.css +58 -24
  42. data/vendor/assets/chosen/chosen.jquery.js +888 -0
  43. data/vendor/assets/chosen/typus/chosen-sprite.png +0 -0
  44. metadata +27 -14
  45. data/vendor/assets/chosen/chosen-sprite.png +0 -0
  46. data/vendor/assets/chosen/chosen.jquery.min.js +0 -10
data/CHANGELOG CHANGED
@@ -1,5 +1,28 @@
1
1
  = 3.2.0 (unreleased)
2
2
 
3
+ = 3.1.3 (unreleased)
4
+
5
+ * [CHANGED] Added `Typus.chosen` so we can disable "Chosen". This will
6
+ be in Typus until "Chosen" supports remote data calls.
7
+
8
+ * [NEW] This is not really new ... I've taken back the autocomplete
9
+ feature which will be used eventually by "Chosen" once they support
10
+ remote calls.
11
+
12
+ * [CHANGED] Typus::Resources.minute_step is now nil by default.
13
+
14
+ * [CHANGED] Date and DateTime selectors should not set current date by default.
15
+
16
+ * [CHANGED] Generator now stores model configuration in a file with the
17
+ name of the model, not the plural.
18
+
19
+ * [CHANGED] Generators can be run without setting up a database.
20
+
21
+ * [CHANGED] We do not longer hide search boxes on Chosen. Apparently
22
+ it has been fixed: https://github.com/harvesthq/chosen/commit/d4c7005b5c
23
+
24
+ * [FIXED] Detaching a Paperclip was not working.
25
+
3
26
  = 3.1.2
4
27
 
5
28
  * [CHANGED] Images, links and belongs_to associations do not have links
data/Gemfile CHANGED
@@ -42,18 +42,18 @@ gem "jquery-rails"
42
42
  gem "ckeditor-rails", "0.0.2"
43
43
 
44
44
  # Alternative authentication
45
- gem "devise", "~> 1.4.3"
45
+ gem "devise", "~> 1.4.7"
46
46
 
47
47
  # Asset Management with Dragonfly
48
- gem "dragonfly", "~> 0.9"
48
+ gem "dragonfly", "~> 0.9.8"
49
49
  gem "rack-cache", :require => "rack/cache"
50
50
 
51
51
  # Asset Management with Paperclip
52
- gem "paperclip", "~> 2.3.16"
52
+ gem "paperclip", "~> 2.4.2"
53
53
 
54
54
  # MongoDB
55
- gem "mongoid", "~> 2.1"
56
- gem "bson_ext", "~> 1.3"
55
+ gem "mongoid", "~> 2.3.0"
56
+ gem "bson_ext", "~> 1.4.0"
57
57
 
58
58
  group :test do
59
59
  gem "shoulda-context", "~> 1.0.0.beta1"
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # Typus: Admin Panel for Ruby on Rails applications
2
2
 
3
- **Typus** is a control panel for [Ruby on Rails][rails] applications to allow
4
- trusted users edit structured content.
3
+ [![Build Status](https://secure.travis-ci.org/typus/typus.png)](http://travis-ci.org/typus/typus)
4
+
5
+ **Typus** is a control panel for [Ruby on Rails][rails] applications to
6
+ allow trusted users edit structured content.
5
7
 
6
8
  It’s not a CMS with a full working system but it provides a part of the
7
9
  system: authentication, permissions and basic look and feel for your
@@ -42,7 +44,7 @@ and go to <http://0.0.0.0:3000/admin>.
42
44
 
43
45
  ## Testing
44
46
 
45
- To test clone the git repo and run the following commands:
47
+ To test, clone the repo and run the following commands:
46
48
 
47
49
  $ git clone git://github.com/typus/typus.git
48
50
  $ bundle install --path vendor/bundle
@@ -56,15 +58,13 @@ user to be able to run tests.
56
58
  ## Links
57
59
 
58
60
  - [Documentation](http://docs.typuscmf.com/)
59
- - [Issues](https://github.com/typus/typus/issues)
60
- - [Source Code][typus] and [RubyGems][typus_gem]
61
+ - [RubyGems][typus_gem]
61
62
  - [Mailing List](http://groups.google.com/group/typus)
62
63
  - [Contributors List](http://github.com/typus/typus/contributors)
63
- - [Travis Builds](http://travis-ci.org/#!/typus/typus)
64
64
 
65
65
  ## License
66
66
 
67
- Typus is released under the MIT license.
67
+ **Typus** is released under the MIT license.
68
68
 
69
69
  [typus]: http://github.com/typus/typus
70
70
  [typus_demo]: http://demo.typuscmf.com/
@@ -72,4 +72,4 @@ Typus is released under the MIT license.
72
72
  [typus_gem]: http://rubygems.org/gems/typus
73
73
  [paperclip]: http://rubygems.org/gems/paperclip
74
74
  [dragonfly]: http://rubygems.org/gems/dragonfly
75
- [rails]: http://rubyonrails.org/
75
+ [rails]: http://rubyonrails.org/
@@ -5,4 +5,4 @@
5
5
  //= require js/jquery.formalize.min
6
6
  //= require typus/jquery.application
7
7
  //= require typus/custom
8
- //= require chosen.jquery.min
8
+ //= require chosen.jquery
@@ -2,7 +2,7 @@ $(document).ready(function() {
2
2
 
3
3
  $("#quicksearch").searchField();
4
4
 
5
- $(".resource :input", document.myForm).bind("change", function() { setConfirmUnload(true); });
5
+ $(".resource :input", document.myForm).bind("change", function() { Typus.setConfirmUnload(true); });
6
6
 
7
7
  $("a.fancybox").fancybox({
8
8
  'titlePosition': 'over',
@@ -11,27 +11,11 @@ $(document).ready(function() {
11
11
  'scrolling': false,
12
12
  });
13
13
 
14
- $(".iframe").fancybox({
15
- 'width': 720,
16
- 'height': '90%',
17
- 'autoScale': false,
18
- 'transitionIn': 'none',
19
- 'transitionOut': 'none',
20
- 'type': 'iframe',
21
- 'centerOnScroll': true,
22
- 'scrolling': false,
23
- onClosed: function() {
24
- if (Typus.parent_location_reload) {
25
- parent.location.reload(true);
26
- } else {
27
- var attribute = Typus.resource_attribute;
28
- var text = Typus.resource_to_label;
29
- var value = Typus.resource_id;
30
- $(attribute).append(new Option(text, value, true, true));
31
- $(".chzn-select").trigger("liszt:updated");
32
- }
33
- },
34
- });
14
+ $(".iframe").fancybox(Typus.fancyboxDefaults);
15
+
16
+ $(".iframe_with_page_reload").fancybox(
17
+ $.extend(Typus.fancyboxDefaults, { onClosed: Typus.reloadParent })
18
+ );
35
19
 
36
20
  // This method is used by Typus::Controller::Bulk
37
21
  $(".action-toggle").click(function() {
@@ -40,16 +24,29 @@ $(document).ready(function() {
40
24
  $('.action-toggle').each(function() { this.checked = status; });
41
25
  });
42
26
 
43
- $(".chzn-select").chosen();
44
-
45
27
  });
46
28
 
47
- Typus = {}
29
+ var Typus = {};
30
+
31
+ Typus.fancyboxDefaults = {
32
+ 'width': 720,
33
+ 'height': '90%',
34
+ 'autoScale': false,
35
+ 'transitionIn': 'none',
36
+ 'transitionOut': 'none',
37
+ 'type': 'iframe',
38
+ 'centerOnScroll': true,
39
+ 'scrolling': false,
40
+ };
41
+
42
+ Typus.setConfirmUnload = function(on) {
43
+ window.onbeforeunload = (on) ? Typus.unloadMessage : null;
44
+ }
48
45
 
49
- function setConfirmUnload(on) {
50
- window.onbeforeunload = (on) ? unloadMessage : null;
46
+ Typus.reloadParent = function() {
47
+ if (Typus.parent_location_reload) parent.location.reload(true);
51
48
  }
52
49
 
53
- function unloadMessage() {
50
+ Typus.unloadMessage = function () {
54
51
  return "You have entered new data on this page. If you navigate away from this page without first saving your data, the changes will be lost.";
55
52
  }
@@ -190,7 +190,7 @@ class Admin::ResourcesController < Admin::BaseController
190
190
  end
191
191
 
192
192
  def set_eager_loading
193
- if (eager_loading = @resource.reflect_on_all_associations(:belongs_to).reject { |i| i.options[:polymorphic] }.map { |i| i.name }).any?
193
+ if (eager_loading = @resource.reflect_on_all_associations(:belongs_to).reject { |i| i.options[:polymorphic] }.map(&:name)).any?
194
194
  @resource = @resource.includes(eager_loading)
195
195
  end
196
196
  end
@@ -25,9 +25,11 @@ module Admin::Resources::DataTypes::BelongsToHelper
25
25
  related.order(related.typus_order_by).map { |p| [p.to_label, p.id] }
26
26
  end
27
27
 
28
+ attribute_id = "#{@resource.name.underscore}_#{attribute}_id"
29
+
28
30
  render "admin/templates/belongs_to",
29
31
  :attribute => attribute,
30
- :attribute_id => "#{@resource.table_name}_#{attribute}",
32
+ :attribute_id => attribute_id,
31
33
  :form => form,
32
34
  :related_fk => related_fk,
33
35
  :related => related,
@@ -5,7 +5,7 @@ module Admin::Resources::DataTypes::DragonflyHelper
5
5
  end
6
6
 
7
7
  def link_to_detach_attribute_for_dragonfly(attribute)
8
- validators = @item.class.validators.delete_if { |i| i.class != ActiveModel::Validations::PresenceValidator }.map { |i| i.attributes }.flatten.map { |i| i.to_s }
8
+ validators = @item.class.validators.delete_if { |i| i.class != ActiveModel::Validations::PresenceValidator }.map(&:attributes).flatten.map(&:to_s)
9
9
  attachment = @item.send(attribute)
10
10
 
11
11
  if attachment.present? && !validators.include?(attribute) && attachment
@@ -1,7 +1,7 @@
1
1
  module Admin::Resources::DataTypes::HasAndBelongsToManyHelper
2
2
 
3
3
  def table_has_and_belongs_to_many_field(attribute, item)
4
- item.send(attribute).map { |i| i.to_label }.join(", ")
4
+ item.send(attribute).map(&:to_label).join(", ")
5
5
  end
6
6
 
7
7
  alias_method :table_has_many_field, :table_has_and_belongs_to_many_field
@@ -22,9 +22,9 @@ module Admin::Resources::DataTypes::HasAndBelongsToManyHelper
22
22
  locals = { :attribute => attribute,
23
23
  :attribute_id => "#{model}_#{attribute}",
24
24
  :related_klass => klass,
25
- :related_items => klass.all,
25
+ :related_items => @item.send(attribute),
26
26
  :related_ids => "#{model}[#{resource_ids}][]",
27
- :values => @item.send(attribute),
27
+ :values => klass,
28
28
  :form => form,
29
29
  :label_text => label_text.html_safe,
30
30
  :html_options => html_options }
@@ -37,12 +37,12 @@ module Admin::Resources::DataTypes::HasManyHelper
37
37
  :action => "new",
38
38
  :_popup => true }
39
39
 
40
- link_to Typus::I18n.t("Add New"), default_options.merge(options), { :class => "iframe" }
40
+ link_to Typus::I18n.t("Add New"), default_options.merge(options), { :class => "iframe_with_page_reload" }
41
41
  end
42
42
  end
43
43
 
44
44
  def set_has_many_resource_actions
45
- @resource_actions = [["Edit", { :action => "edit", :_popup => true }, { :class => 'iframe' }],
45
+ @resource_actions = [["Edit", { :action => "edit", :_popup => true }, { :class => 'iframe_with_page_reload' }],
46
46
  ["Trash", { :action => "destroy" }, { :confirm => "Trash?" } ]]
47
47
  end
48
48
 
@@ -24,7 +24,7 @@ module Admin::Resources::DataTypes::HasOneHelper
24
24
  :action => "new",
25
25
  :_popup => true }
26
26
 
27
- link_to Typus::I18n.t("Add New"), default_options.merge(options), { :class => "iframe" }
27
+ link_to Typus::I18n.t("Add New"), default_options.merge(options), { :class => "iframe_with_page_reload" }
28
28
  end
29
29
  end
30
30
 
@@ -6,14 +6,14 @@ module Admin::Resources::DataTypes::PaperclipHelper
6
6
  end
7
7
 
8
8
  def link_to_detach_attribute_for_paperclip(attribute)
9
- validators = @item.class.validators.delete_if { |i| i.class != ActiveModel::Validations::PresenceValidator }.map { |i| i.attributes }.flatten.map { |i| i.to_s }
9
+ validators = @item.class.validators.delete_if { |i| i.class != ActiveModel::Validations::PresenceValidator }.map(&:attributes).flatten.map(&:to_s)
10
10
  attachment = @item.send(attribute)
11
11
 
12
12
  if attachment.exists? && !validators.include?("#{attribute}_file_name") && attachment
13
13
  attribute_i18n = @item.class.human_attribute_name(attribute)
14
14
  label_text = <<-HTML
15
15
  #{attribute_i18n}
16
- <small>#{link_to Typus::I18n.t("Remove"), { :action => 'update', :id => @item.id, :attribute => attribute, :_continue => true }, :confirm => Typus::I18n.t("Are you sure?")}</small>
16
+ <small>#{link_to Typus::I18n.t("Remove"), { :action => 'update', :id => @item.id, :_nullify => attribute, :_continue => true }, :confirm => Typus::I18n.t("Are you sure?")}</small>
17
17
  HTML
18
18
  label_text.html_safe
19
19
  end
@@ -66,7 +66,7 @@ module Admin::Resources::FormHelper
66
66
 
67
67
  def save_options_for_headless_mode
68
68
  return unless headless_mode?
69
- { "_continue" => "Save and continue editing" }
69
+ { "_continue" => "Save" }
70
70
  end
71
71
 
72
72
  def save_options_for_user_class
@@ -21,7 +21,7 @@ module Admin::Resources::TableHelper
21
21
  association = model.reflect_on_association(key.to_sym)
22
22
  order_by = association ? association.foreign_key : key
23
23
 
24
- if (model.model_fields.map(&:first).map { |i| i.to_s }.include?(key) || model.reflect_on_all_associations(:belongs_to).map(&:name).include?(key.to_sym))
24
+ if (model.model_fields.map(&:first).map(&:to_s).include?(key) || model.reflect_on_all_associations(:belongs_to).map(&:name).include?(key.to_sym))
25
25
  sort_order = case params[:sort_order]
26
26
  when 'asc' then ['desc', '&darr;']
27
27
  when 'desc' then ['asc', '&uarr;']
@@ -50,7 +50,7 @@ module Admin::Resources::TableHelper
50
50
  resource_actions.map do |body, url, options, proc|
51
51
  next if proc && proc.respond_to?(:call) && proc.call(item) == false
52
52
  { :message => Typus::I18n.t(body),
53
- :url => { :controller => "/admin/#{model.to_resource}", :id => item.id }.merge(params.dup.cleanup.merge(url)),
53
+ :url => params.dup.cleanup.merge({ :controller => "/admin/#{model.to_resource}", :id => item.id }).merge(url),
54
54
  :options => options }
55
55
  end
56
56
  end
@@ -1,4 +1,4 @@
1
- <% content_for :sidebar do %>
1
+ <div class="grid_2">
2
2
 
3
3
  <h2>Header (h2) <small>Small <a href="#">link</a></small></h2>
4
4
 
@@ -26,124 +26,128 @@
26
26
  <li>Lorem incididunt</li>
27
27
  </ul>
28
28
 
29
- <% end %>
29
+ </div>
30
30
 
31
- <h2>Header (h2) <small>Small <a href="#">link</a></small></h2>
31
+ <div class="grid_10">
32
32
 
33
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
34
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
35
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
36
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
37
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
38
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
33
+ <h2>Header (h2) <small>Small <a href="#">link</a></small></h2>
39
34
 
40
- <blockquote>
41
35
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
42
36
  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
43
37
  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
44
- consequat.</p>
45
-
46
- <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
47
- dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
48
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
49
- </blockquote>
50
-
51
- <pre>
52
- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
53
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
54
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
55
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
56
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
57
- non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
58
- </pre>
59
-
60
- <p>
61
- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
62
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
63
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
64
- consequat.
65
- </p>
66
-
67
- <p><a href="#">Link to self</a></p>
68
-
69
- <h3>Header (h3)</h3>
70
-
71
- <p>
72
- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
73
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
74
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
75
- consequat.
76
- </p>
77
-
78
- <h2>Boxes</h2>
79
-
80
- <div class="box">
38
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
39
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
40
+ non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
41
+
42
+ <blockquote>
43
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
44
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
45
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
46
+ consequat.</p>
47
+
48
+ <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
49
+ dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
50
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
51
+ </blockquote>
52
+
53
+ <pre>
54
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
55
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
56
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
57
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
58
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
59
+ non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
60
+ </pre>
61
+
81
62
  <p>
82
63
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
83
64
  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
84
65
  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
85
66
  consequat.
86
67
  </p>
87
- </div>
88
68
 
89
- <div class="box">
90
- <h3>Header (h3)</h3>
91
- <ul>
92
- <li>Lorem ipsum dolor sit amet</li>
93
- <li>Duis aute irure dolor in reprehenderit in voluptate</li>
94
- <li>Laboris nisi ut aliquip ex ea commodo</li>
95
- </ul>
96
- </div>
69
+ <p><a href="#">Link to self</a></p>
97
70
 
98
- <div class="box">
99
71
  <h3>Header (h3)</h3>
72
+
100
73
  <p>
101
74
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
102
75
  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
103
76
  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
104
77
  consequat.
105
78
  </p>
106
- <ul>
107
- <li>Lorem ipsum dolor sit amet</li>
108
- <li>Duis aute irure dolor in reprehenderit in voluptate</li>
109
- <li>Laboris nisi ut aliquip ex ea commodo</li>
110
- </ul>
111
- </div>
112
79
 
113
- <p>
114
- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
115
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
116
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
117
- consequat.
118
- </p>
80
+ <h2>Boxes</h2>
81
+
82
+ <div class="box">
83
+ <p>
84
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
85
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
86
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
87
+ consequat.
88
+ </p>
89
+ </div>
90
+
91
+ <div class="box">
92
+ <h3>Header (h3)</h3>
93
+ <ul>
94
+ <li>Lorem ipsum dolor sit amet</li>
95
+ <li>Duis aute irure dolor in reprehenderit in voluptate</li>
96
+ <li>Laboris nisi ut aliquip ex ea commodo</li>
97
+ </ul>
98
+ </div>
99
+
100
+ <div class="box">
101
+ <h3>Header (h3)</h3>
102
+ <p>
103
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
104
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
105
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
106
+ consequat.
107
+ </p>
108
+ <ul>
109
+ <li>Lorem ipsum dolor sit amet</li>
110
+ <li>Duis aute irure dolor in reprehenderit in voluptate</li>
111
+ <li>Laboris nisi ut aliquip ex ea commodo</li>
112
+ </ul>
113
+ </div>
119
114
 
120
- <h2>Error Messages (h2)</h2>
115
+ <p>
116
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
117
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
118
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
119
+ consequat.
120
+ </p>
121
121
 
122
- <div id="flash" class="notice">
123
- <strong>Hey!</strong> Sample ui-state-highlight style.
124
- </div>
122
+ <h2>Error Messages (h2)</h2>
125
123
 
126
- <div id="flash" class="alert">
127
- <strong>Alert:</strong> Sample ui-state-error style.
128
- </div>
124
+ <div id="flash" class="notice">
125
+ <strong>Hey!</strong> Sample ui-state-highlight style.
126
+ </div>
129
127
 
130
- <h2>Filters (h2)</h2>
128
+ <div id="flash" class="alert">
129
+ <strong>Alert:</strong> Sample ui-state-error style.
130
+ </div>
131
131
 
132
- <h3>Filters with a list inside (h3)</h3>
132
+ <h2>Filters (h2)</h2>
133
133
 
134
- <div class="filters">
135
- <ul>
136
- <li>Filter</li>
137
- <li>Filter</li>
138
- </ul>
139
- </div>
134
+ <h3>Filters with a list inside (h3)</h3>
140
135
 
141
- <h3>Filters with a paragraph inside (h3)</h3>
136
+ <div class="filters">
137
+ <ul>
138
+ <li>Filter</li>
139
+ <li>Filter</li>
140
+ </ul>
141
+ </div>
142
142
 
143
- <div class="filters">
144
- <p>This is a paragraph.</p>
145
- </div>
143
+ <h3>Filters with a paragraph inside (h3)</h3>
146
144
 
147
- <h2>Forms (h2)</h2>
145
+ <div class="filters">
146
+ <p>This is a paragraph.</p>
147
+ </div>
148
148
 
149
- <p>This is how a form looks like.</p>
149
+ <h2>Forms (h2)</h2>
150
+
151
+ <p>This is how a form looks like.</p>
152
+
153
+ </div>