shoelaces 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.ruby-version +1 -0
- data/.travis.yml +11 -0
- data/CONTRIBUTING.md +37 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +131 -0
- data/LICENSE +21 -0
- data/README.md +211 -0
- data/Rakefile +8 -0
- data/bin/rake +16 -0
- data/bin/rspec +16 -0
- data/bin/setup +13 -0
- data/bin/shoelaces +13 -0
- data/lib/shoelaces.rb +4 -0
- data/lib/shoelaces/actions.rb +29 -0
- data/lib/shoelaces/app_builder.rb +437 -0
- data/lib/shoelaces/generators/app_generator.rb +233 -0
- data/lib/shoelaces/version.rb +5 -0
- data/shoelaces.gemspec +53 -0
- data/spec/fakes/bin/heroku +5 -0
- data/spec/fakes/bin/hub +5 -0
- data/spec/features/github_spec.rb +10 -0
- data/spec/features/heroku_spec.rb +19 -0
- data/spec/features/new_project_spec.rb +77 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/support/fake_github.rb +21 -0
- data/spec/support/fake_heroku.rb +38 -0
- data/spec/support/shoelaces.rb +49 -0
- data/templates/Gemfile.erb +63 -0
- data/templates/Guardfile +33 -0
- data/templates/Procfile +2 -0
- data/templates/README.md.erb +34 -0
- data/templates/_analytics.html.erb +7 -0
- data/templates/_flashes.html.erb +7 -0
- data/templates/_javascript.html.erb +12 -0
- data/templates/_variables.scss +2 -0
- data/templates/about.html.erb.erb +67 -0
- data/templates/action_mailer.rb +5 -0
- data/templates/application.css.scss +18 -0
- data/templates/background_jobs_rspec.rb +19 -0
- data/templates/bin_setup.erb +34 -0
- data/templates/config_locales_en.yml +16 -0
- data/templates/contact.html.erb.erb +67 -0
- data/templates/database_cleaner_rspec.rb +21 -0
- data/templates/development_seeds.rb +12 -0
- data/templates/disable_xml_params.rb +3 -0
- data/templates/errors.rb +34 -0
- data/templates/factory_girl_rspec.rb +3 -0
- data/templates/high_voltage.rb +3 -0
- data/templates/home.html.erb.erb +16 -0
- data/templates/i18n.rb +3 -0
- data/templates/newrelic.yml.erb +34 -0
- data/templates/noise.png +0 -0
- data/templates/postgresql_database.yml.erb +12 -0
- data/templates/rack_timeout.rb +1 -0
- data/templates/sample.env +3 -0
- data/templates/secrets.yml +14 -0
- data/templates/shoelaces_gitignore +13 -0
- data/templates/shoelaces_layout.html.erb.erb +25 -0
- data/templates/shoelaces_layout_footer.html.erb.erb +11 -0
- data/templates/shoelaces_layout_header.html.erb.erb +33 -0
- data/templates/smtp.rb +9 -0
- data/templates/spec_helper.rb +30 -0
- data/templates/staging.rb +5 -0
- data/templates/travis.yml.erb +24 -0
- data/templates/unicorn.rb +30 -0
- metadata +232 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
class FakeHeroku
|
2
|
+
RECORDER = File.expand_path(File.join('..', '..', 'tmp', 'heroku_commands'), File.dirname(__FILE__))
|
3
|
+
|
4
|
+
def initialize(args)
|
5
|
+
@args = args
|
6
|
+
end
|
7
|
+
|
8
|
+
def run!
|
9
|
+
File.open(RECORDER, 'a') do |file|
|
10
|
+
file.puts @args.join(' ')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.clear!
|
15
|
+
FileUtils.rm_rf RECORDER
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.has_gem_included?(project_path, gem_name)
|
19
|
+
gemfile = File.open(File.join(project_path, 'Gemfile'), 'a')
|
20
|
+
|
21
|
+
File.foreach(gemfile).any? do |line|
|
22
|
+
line.match(/#{Regexp.quote(gem_name)}/)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.has_created_app_for?(remote_name)
|
27
|
+
app_name = "#{ShoelacesTestHelpers::APP_NAME}-#{remote_name}"
|
28
|
+
expected_line = "create #{app_name} --remote=#{remote_name}\n"
|
29
|
+
|
30
|
+
File.foreach(RECORDER).any? { |line| line == expected_line }
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.has_configured_vars?(remote_name, var)
|
34
|
+
File.foreach(RECORDER).any? do |line|
|
35
|
+
line =~ /^config:add #{var}=.+ --remote=#{remote_name}\n$/
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module ShoelacesTestHelpers
|
2
|
+
APP_NAME = 'dummy'
|
3
|
+
|
4
|
+
def remove_project_directory
|
5
|
+
FileUtils.rm_rf(project_path)
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_tmp_directory
|
9
|
+
FileUtils.mkdir_p(tmp_path)
|
10
|
+
end
|
11
|
+
|
12
|
+
def run_shoelaces(arguments = nil)
|
13
|
+
Dir.chdir(tmp_path) do
|
14
|
+
Bundler.with_clean_env do
|
15
|
+
ENV['TESTING'] = '1'
|
16
|
+
|
17
|
+
%x(#{shoelaces_bin} #{APP_NAME} #{arguments})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def drop_dummy_database
|
23
|
+
if File.exists?(project_path)
|
24
|
+
Dir.chdir(project_path) do
|
25
|
+
Bundler.with_clean_env do
|
26
|
+
`rake db:drop`
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def project_path
|
33
|
+
@project_path ||= Pathname.new("#{tmp_path}/#{APP_NAME}")
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def tmp_path
|
39
|
+
@tmp_path ||= Pathname.new("#{root_path}/tmp")
|
40
|
+
end
|
41
|
+
|
42
|
+
def shoelaces_bin
|
43
|
+
File.join(root_path, 'bin', 'shoelaces')
|
44
|
+
end
|
45
|
+
|
46
|
+
def root_path
|
47
|
+
File.expand_path('../../../', __FILE__)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
ruby "<%= Shoelaces::RUBY_VERSION %>"
|
4
|
+
|
5
|
+
gem "airbrake"
|
6
|
+
gem 'bootstrap-sass'
|
7
|
+
gem "coffee-rails"
|
8
|
+
gem "delayed_job_active_record"
|
9
|
+
gem "email_validator"
|
10
|
+
gem "high_voltage"
|
11
|
+
gem "jquery-rails"
|
12
|
+
gem 'paperclip', '~> 3.0'
|
13
|
+
gem "pg"
|
14
|
+
gem "rack-timeout"
|
15
|
+
gem "rails", "<%= Shoelaces::RAILS_VERSION %>"
|
16
|
+
gem "recipient_interceptor"
|
17
|
+
gem "sass-rails", "~> 4.0.3"
|
18
|
+
gem "simple_form"
|
19
|
+
gem "title"
|
20
|
+
gem "uglifier"
|
21
|
+
gem "unicorn"
|
22
|
+
|
23
|
+
# gem 'devise'
|
24
|
+
# gem 'omniauth-facebook'
|
25
|
+
# gem 'omniauth-twitter'
|
26
|
+
# gem 'twitter'
|
27
|
+
# gem 'fb_graph'
|
28
|
+
# gem 'cancan'
|
29
|
+
|
30
|
+
group :development do
|
31
|
+
gem "spring"
|
32
|
+
gem "spring-commands-rspec"
|
33
|
+
|
34
|
+
gem 'guard'
|
35
|
+
gem 'guard-rspec', require: false
|
36
|
+
gem 'guard-livereload', require: false
|
37
|
+
gem 'rack-livereload'
|
38
|
+
gem 'terminal-notifier-guard'
|
39
|
+
end
|
40
|
+
|
41
|
+
group :development, :test do
|
42
|
+
gem "awesome_print"
|
43
|
+
gem "byebug"
|
44
|
+
gem "dotenv-rails"
|
45
|
+
gem "factory_girl_rails"
|
46
|
+
gem "pry-rails"
|
47
|
+
gem "rspec-rails", "~> 3.0.0"
|
48
|
+
end
|
49
|
+
|
50
|
+
group :test do
|
51
|
+
gem "capybara-webkit", ">= 1.2.0"
|
52
|
+
gem "database_cleaner"
|
53
|
+
gem "formulaic"
|
54
|
+
gem "launchy"
|
55
|
+
gem "shoulda-matchers", require: false
|
56
|
+
gem "timecop"
|
57
|
+
gem "webmock"
|
58
|
+
end
|
59
|
+
|
60
|
+
group :staging, :production do
|
61
|
+
gem "newrelic_rpm", ">= 3.7.3"
|
62
|
+
# gem 'aws-sdk', '~> 1.5.7'
|
63
|
+
end
|
data/templates/Guardfile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'livereload' do
|
5
|
+
watch(%r{app/views/.+\.(erb|haml|slim)$})
|
6
|
+
watch(%r{app/helpers/.+\.rb})
|
7
|
+
watch(/public\/.+\.(css|js|html)/)
|
8
|
+
watch(%r{config/locales/.+\.yml})
|
9
|
+
|
10
|
+
# Rails Assets Pipeline
|
11
|
+
watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|js|html|png|jpg|erb))).*}) { |m| "/assets/#{m[3]}" }
|
12
|
+
end
|
13
|
+
|
14
|
+
guard :rspec do
|
15
|
+
watch(/^app\/(.+)\.rb$/) { |m| "spec/#{m[1]}_spec.rb" }
|
16
|
+
watch(/^app\/(.*)(\.erb|\.haml|\.slim)$/) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
17
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb" }
|
18
|
+
watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
|
19
|
+
watch('config/routes.rb') { 'spec/routing' }
|
20
|
+
watch('app/controllers/application_controller.rb') { 'spec/controllers' }
|
21
|
+
end
|
22
|
+
|
23
|
+
notification(
|
24
|
+
:tmux,
|
25
|
+
display_message: true,
|
26
|
+
timeout: 5,
|
27
|
+
# the first %s will show the title, the second the message
|
28
|
+
# Alternately you can also configure *success_message_format*,
|
29
|
+
# *pending_message_format*, *failed_message_format*
|
30
|
+
default_message_format: '%s >> %s',
|
31
|
+
line_separator: ' > ',
|
32
|
+
color_location: 'status-left-fg'
|
33
|
+
)
|
data/templates/Procfile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
<%= app_name.humanize %>
|
2
|
+
<%= '=' * app_name.humanize.length %>
|
3
|
+
|
4
|
+
Getting Started
|
5
|
+
---------------
|
6
|
+
|
7
|
+
This repository comes equipped with a self-setup script:
|
8
|
+
|
9
|
+
% ./bin/setup
|
10
|
+
|
11
|
+
It assumes you have a machine equipped with Ruby, Postgres, etc. If not, set up
|
12
|
+
your machine with [this script].
|
13
|
+
|
14
|
+
[this script]: https://github.com/jonr22/laptop
|
15
|
+
|
16
|
+
After setting up, you can run the application using [foreman]:
|
17
|
+
|
18
|
+
% foreman start
|
19
|
+
|
20
|
+
If you don't have `foreman`, see [Foreman's install instructions][foreman]. It
|
21
|
+
is [purposefully excluded from the project's `Gemfile`][exclude].
|
22
|
+
|
23
|
+
[foreman]: https://github.com/ddollar/foreman
|
24
|
+
[exclude]: https://github.com/ddollar/foreman/pull/437#issuecomment-41110407
|
25
|
+
|
26
|
+
Guidelines
|
27
|
+
----------
|
28
|
+
|
29
|
+
Use the following guides for getting things done, programming well, and
|
30
|
+
programming in style.
|
31
|
+
|
32
|
+
* [Protocol](http://github.com/thoughtbot/guides/blob/master/protocol)
|
33
|
+
* [Best Practices](http://github.com/thoughtbot/guides/blob/master/best-practices)
|
34
|
+
* [Style](http://github.com/thoughtbot/guides/blob/master/style)
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<% if ENV["SEGMENT_IO_KEY"] %>
|
2
|
+
<script type="text/javascript">
|
3
|
+
window.analytics=window.analytics||[],window.analytics.methods=["identify","group","track","page","pageview","alias","ready","on","once","off","trackLink","trackForm","trackClick","trackSubmit"],window.analytics.factory=function(t){return function(){var a=Array.prototype.slice.call(arguments);return a.unshift(t),window.analytics.push(a),window.analytics}};for(var i=0;i<window.analytics.methods.length;i++){var key=window.analytics.methods[i];window.analytics[key]=window.analytics.factory(key)}window.analytics.load=function(t){if(!document.getElementById("analytics-js")){var a=document.createElement("script");a.type="text/javascript",a.id="analytics-js",a.async=!0,a.src=("https:"===document.location.protocol?"https://":"http://")+"cdn.segment.io/analytics.js/v1/"+t+"/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n)}},window.analytics.SNIPPET_VERSION="2.0.9",
|
4
|
+
window.analytics.load("<%= ENV["SEGMENT_IO_KEY"] %>");
|
5
|
+
window.analytics.page();
|
6
|
+
</script>
|
7
|
+
<% end %>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<div class="container-fluid">
|
2
|
+
<div class="page-header">
|
3
|
+
<h1>About Us <small>Everything you ever wanted to know about <%=app_name%></small></h1>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="panel panel-default">
|
7
|
+
<div class="panel-body">
|
8
|
+
<p>
|
9
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
|
10
|
+
mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
|
11
|
+
vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
|
12
|
+
condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
|
13
|
+
fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
|
14
|
+
Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
|
15
|
+
consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
|
16
|
+
non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
|
17
|
+
tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
|
18
|
+
Maecenas id pretium est. Nam ultricies leo ac metus sagittis
|
19
|
+
consectetur. Quisque ut libero urna.
|
20
|
+
</p>
|
21
|
+
|
22
|
+
<p>
|
23
|
+
Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
|
24
|
+
lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
|
25
|
+
volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
|
26
|
+
elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
|
27
|
+
laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
|
28
|
+
aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
|
29
|
+
lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
|
30
|
+
a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
|
31
|
+
et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
|
32
|
+
lacus fermentum.
|
33
|
+
</p>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<div class="panel panel-default">
|
38
|
+
<div class="panel-body">
|
39
|
+
<p>
|
40
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
|
41
|
+
mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
|
42
|
+
vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
|
43
|
+
condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
|
44
|
+
fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
|
45
|
+
Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
|
46
|
+
consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
|
47
|
+
non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
|
48
|
+
tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
|
49
|
+
Maecenas id pretium est. Nam ultricies leo ac metus sagittis
|
50
|
+
consectetur. Quisque ut libero urna.
|
51
|
+
</p>
|
52
|
+
|
53
|
+
<p>
|
54
|
+
Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
|
55
|
+
lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
|
56
|
+
volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
|
57
|
+
elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
|
58
|
+
laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
|
59
|
+
aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
|
60
|
+
lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
|
61
|
+
a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
|
62
|
+
et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
|
63
|
+
lacus fermentum.
|
64
|
+
</p>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
@import "variables";
|
2
|
+
@import "bootstrap";
|
3
|
+
|
4
|
+
html {
|
5
|
+
background: $gray image-url('noise.png') top left;
|
6
|
+
}
|
7
|
+
|
8
|
+
footer {
|
9
|
+
color: $light-gray;
|
10
|
+
background: $gray image-url('noise.png') top left;
|
11
|
+
padding-top: 20px;
|
12
|
+
a {
|
13
|
+
color: $light-gray;
|
14
|
+
&:hover {
|
15
|
+
color: $light-gray;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module BackgroundJobs
|
2
|
+
def run_background_jobs_immediately
|
3
|
+
delay_jobs = Delayed::Worker.delay_jobs
|
4
|
+
Delayed::Worker.delay_jobs = false
|
5
|
+
yield
|
6
|
+
ensure
|
7
|
+
Delayed::Worker.delay_jobs = delay_jobs
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.around(:each, type: :feature) do |example|
|
13
|
+
run_background_jobs_immediately do
|
14
|
+
example.run
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
config.include BackgroundJobs
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env sh
|
2
|
+
|
3
|
+
# Set up Rails app. Run this script immediately after cloning the codebase.
|
4
|
+
# https://github.com/thoughtbot/guides/tree/master/protocol
|
5
|
+
|
6
|
+
# Exit if any subcommand fails
|
7
|
+
set -e
|
8
|
+
|
9
|
+
# Set up Ruby dependencies via Bundler
|
10
|
+
bundle install
|
11
|
+
|
12
|
+
# Set up configurable environment variables
|
13
|
+
if [ ! -f .env ]; then
|
14
|
+
cp .sample.env .env
|
15
|
+
fi
|
16
|
+
|
17
|
+
# Set up database and add any development seed data
|
18
|
+
bundle exec rake dev:prime
|
19
|
+
|
20
|
+
# Add binstubs to PATH via export PATH=".git/safe/../../bin:$PATH" in ~/.zshenv
|
21
|
+
mkdir -p .git/safe
|
22
|
+
|
23
|
+
# Pick a port for Foreman
|
24
|
+
echo "port: <%= config[:port_number] %>" > .foreman
|
25
|
+
|
26
|
+
# Print warning if Foreman is not installed
|
27
|
+
if ! command -v foreman &>/dev/null; then
|
28
|
+
echo "foreman is not installed."
|
29
|
+
echo "See https://github.com/ddollar/foreman for install instructions."
|
30
|
+
fi
|
31
|
+
|
32
|
+
if [ -d ~/.pow ]; then
|
33
|
+
echo <%= config[:port_number] %> > ~/.pow/<%=app_name%>
|
34
|
+
fi
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<div class="container-fluid">
|
2
|
+
<div class="page-header">
|
3
|
+
<h1>Contact Us <small>How to reach <%=app_name%></small></h1>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="panel panel-default">
|
7
|
+
<div class="panel-body">
|
8
|
+
<p>
|
9
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
|
10
|
+
mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
|
11
|
+
vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
|
12
|
+
condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
|
13
|
+
fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
|
14
|
+
Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
|
15
|
+
consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
|
16
|
+
non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
|
17
|
+
tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
|
18
|
+
Maecenas id pretium est. Nam ultricies leo ac metus sagittis
|
19
|
+
consectetur. Quisque ut libero urna.
|
20
|
+
</p>
|
21
|
+
|
22
|
+
<p>
|
23
|
+
Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
|
24
|
+
lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
|
25
|
+
volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
|
26
|
+
elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
|
27
|
+
laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
|
28
|
+
aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
|
29
|
+
lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
|
30
|
+
a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
|
31
|
+
et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
|
32
|
+
lacus fermentum.
|
33
|
+
</p>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<div class="panel panel-default">
|
38
|
+
<div class="panel-body">
|
39
|
+
<p>
|
40
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
|
41
|
+
mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
|
42
|
+
vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
|
43
|
+
condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
|
44
|
+
fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
|
45
|
+
Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
|
46
|
+
consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
|
47
|
+
non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
|
48
|
+
tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
|
49
|
+
Maecenas id pretium est. Nam ultricies leo ac metus sagittis
|
50
|
+
consectetur. Quisque ut libero urna.
|
51
|
+
</p>
|
52
|
+
|
53
|
+
<p>
|
54
|
+
Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
|
55
|
+
lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
|
56
|
+
volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
|
57
|
+
elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
|
58
|
+
laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
|
59
|
+
aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
|
60
|
+
lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
|
61
|
+
a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
|
62
|
+
et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
|
63
|
+
lacus fermentum.
|
64
|
+
</p>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
</div>
|