diff --git a/.gitignore b/.gitignore index 120a613c..12af0acd 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ doc/ tests/coverage config.yml .DS_Store +public/assets/css/.sass-cache/ diff --git a/Gemfile b/Gemfile index 2573bed1..5c6e9008 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,7 @@ gem 'ago' gem 'mail' gem 'google-api-client', require: 'google/api_client' gem 'tilt' +gem 'erubis' platform :mri do gem 'magic' # sudo apt-get install file, For OSX: brew install libmagic diff --git a/Gemfile.lock b/Gemfile.lock index 0e367264..032b5a15 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -36,6 +36,7 @@ GEM debugger-linecache (1.2.0) debugger-ruby_core_source (1.3.2) docile (1.1.3) + erubis (2.7.0) extlib (0.9.16) fabrication (2.11.0) faker (1.3.0) @@ -191,6 +192,7 @@ DEPENDENCIES bcrypt capybara capybara_minitest_spec + erubis fabrication faker google-api-client diff --git a/app.rb b/app.rb index 93a321d7..90d5a6bc 100644 --- a/app.rb +++ b/app.rb @@ -396,11 +396,11 @@ post '/site_files/save/:filename' do |filename| end get '/terms' do - slim :'terms' + erb :'terms' end get '/privacy' do - slim :'privacy' + erb :'privacy' end get '/admin' do @@ -557,7 +557,7 @@ post '/custom_domain' do end get '/contact' do - slim :'contact' + erb :'contact' end post '/contact' do @@ -720,6 +720,13 @@ def current_site @site ||= Site[id: session[:id]] end +def title + out = "NeoCities" + return out if request.path == '/' + return "#{out} - #{@title}" if @title + "#{out} - #{request.path.gsub('/', '').capitalize}" +end + def encoding_fix(file) begin Rack::Utils.escape_html file diff --git a/environment.rb b/environment.rb index a4bcefe9..3eae5f9c 100644 --- a/environment.rb +++ b/environment.rb @@ -35,6 +35,8 @@ if defined?(Pry) Pry.commands.alias_command 'f', 'finish' end +Sidekiq::Logging.logger = nil unless ENV['RACK_ENV'] == 'production' + Sidekiq.configure_server do |config| config.redis = { namespace: 'neocitiesworker' } end @@ -59,10 +61,11 @@ Sequel::Migrator.apply DB, './migrations' Dir.glob('models/*.rb').each {|m| require File.join(DIR_ROOT, "#{m}") } DB.loggers << Logger.new(STDOUT) if ENV['RACK_ENV'] == 'development' -# If new, throw up a random Server for development. - -if ENV['RACK_ENV'] == 'development' && Server.count == 0 - Server.create ip: '127.0.0.1', slots_available: 999999 +if ENV['RACK_ENV'] == 'development' + # If new, throw up a random Server for development. + if Server.count == 0 + Server.create ip: '127.0.0.1', slots_available: 999999 + end end Mail.defaults do @@ -78,6 +81,8 @@ Mail.defaults do delivery_method :sendmail, options end +Sinatra::Application.set :erb, escape_html: true + class Sinatra::Base alias_method :render_original, :render def render(engine, data, options = {}, locals = {}, &block) diff --git a/models/site.rb b/models/site.rb index b3a934a1..b1f76d88 100644 --- a/models/site.rb +++ b/models/site.rb @@ -121,8 +121,10 @@ class Site < Sequel::Model FileUtils.mkdir_p files_path %w{index not_found}.each do |name| - File.write file_path("#{name}.html"), render_template("#{name}.slim") + File.write file_path("#{name}.html"), render_template("#{name}.erb") end + + FileUtils.cp template_file_path('cat.png'), file_path('cat.png') end def get_file(filename) @@ -205,7 +207,7 @@ class Site < Sequel::Model end def install_new_html_file(name) - File.write file_path(name), render_template('index.slim') + File.write file_path(name), render_template('index.erb') end def file_exists?(filename) @@ -273,7 +275,11 @@ class Site < Sequel::Model end def render_template(name) - Tilt.new(File.join(TEMPLATE_ROOT, name), pretty: true).render self + Tilt.new(template_file_path(name), pretty: true).render self + end + + def template_file_path(name) + File.join TEMPLATE_ROOT, name end def files_path(name=nil) diff --git a/public/assets/img/cat-larger.png b/public/assets/img/cat-larger.png index 919371ed..21973263 100644 Binary files a/public/assets/img/cat-larger.png and b/public/assets/img/cat-larger.png differ diff --git a/public/css/styles.css b/public/css/styles.css index 07cd18bf..b3205ac4 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -34,3 +34,17 @@ line-height:inherit; height:auto!important} max-height:400px; overflow:auto; } + +textarea { + margin-bottom: 10px +} + +input[type=submit] { + margin-top: 10px; +} + +.recaptcha { + background: #fff; + width: 440px; + overflow: auto; +} \ No newline at end of file diff --git a/public/humans.txt b/public/humans.txt index 4308d94e..1071bd87 100644 --- a/public/humans.txt +++ b/public/humans.txt @@ -7,50 +7,20 @@ * **************************************************************************** */ -Kyle Drake: +Kyle Drake: Creator, Lead Developer Website: http://kyledrake.net/ Twitter: @kyledrake Location: Portland, OR - -Scott O'Hara: +Scott O'Hara: Front-End Developer, Design, Ground Floor Website: http://scottohara.me/ Twitter: @scottohara Location: Boston, MA - -Victoria Wang: -Design, Tutorial Lead +Victoria Wang: +UX, Design Website: http://www.violasong.com/ Twitter: @violasong -Location: Chicago,IL - - - -/* **************************************************************************** -* -* Website Info: -* -**************************************************************************** */ - -Last update: 2013/12/13 - -SCSS -http://sass-lang.com/ - -jQuery -http://jquery.com/ - -Ground Floor -https://github.com/scottaohara/Ground-Floor - - - - - - - - - +Location: Chicago, IL diff --git a/tests/environment.rb b/tests/environment.rb index e888352c..0ad4794a 100644 --- a/tests/environment.rb +++ b/tests/environment.rb @@ -18,7 +18,8 @@ Bundler.require :test #require 'minitest/pride' require 'minitest/autorun' -require 'sidekiq/testing/inline' + +require 'sidekiq/testing' Site.bcrypt_cost = BCrypt::Engine::MIN_COST diff --git a/views/_footer.erb b/views/_footer.erb index a791f2d1..0b67007f 100644 --- a/views/_footer.erb +++ b/views/_footer.erb @@ -3,7 +3,7 @@

- Neocities.org is a completely open source startup. Follow us on twitter. + Neocities.org is a completely open source startup. Follow us on twitter.

- <%= erb :'_footer', layout: false%> + <%== erb :'_footer', layout: false%> diff --git a/views/layout.erb b/views/layout.erb index 5cb23d27..e6f9baa1 100644 --- a/views/layout.erb +++ b/views/layout.erb @@ -1,77 +1,53 @@ - - - - - + + + + <%= title %> + + + + + + + + + + - Neocities - <%= request.path.gsub('/', '').capitalize %> - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
- <%= erb :'_header', layout: false %> - - <%= yield %> -
+ <%= erb :'_header', layout: false %> + <%= yield %> + - - + - - - - + diff --git a/views/privacy.erb b/views/privacy.erb new file mode 100644 index 00000000..a7894f7e --- /dev/null +++ b/views/privacy.erb @@ -0,0 +1,46 @@ +
+

Privacy

+
+

Our Privacy Policy was last updated and posted on June 3, 2013. It governs the privacy terms of our Website, located at http://neocities.org. Any capitalized terms not defined in our Privacy Policy, have the meaning as specified in our Terms of Service.

+ +

Your Privacy
Neocities follows all legal requirements to protect your privacy. Our Privacy Policy is a legal statement that explains how we may collect information from you, how we may share your information, and how you can limit our sharing of your information. You will see terms in our Privacy Policy that are capitalized. These terms have meanings as described in the Definitions section below.

+ +

Definitions
"Non Personal Information" is information that is not personally identifiable to you and that we automatically collect when you access our Website with a web browser. It may also include publicly available information that is shared between you and others.

+

"Personally Identifiable Information" is non-public information that is personally identifiable to you and obtained in order for us to provide you within our Website. Personally Identifiable Information may include information such as your name, email address, and other related information that you provide to us or that we obtain about you.

+ +

Information We Collect
Generally, you control the amount and type of information you provide to us when using our Website.

+

As a Visitor, you can browse our website to find out more about our Website. You are not required to provide us with any Personally Identifiable Information as a Visitor.

+ +

Computer Information Collected
When you use our Website, we automatically collect certain computer information by the interaction of your mobile phone or web browser with our Website. Such information is typically considered Non Personal Information. We also collect the following:

+ + +

How We Use Your Information
We use the information we receive from you as follows:

+ + +

Links to Other Websites
Our Website may contain links to other websites that are not under our direct control. These websites may have their own policies regarding privacy. We have no control of or responsibility for linked websites and provide these links solely for the convenience and information of our visitors. You access such linked Websites at your own risk. These websites are not subject to this Privacy Policy. You should check the privacy policies, if any, of those individual websites to see how the operators of those third-party websites will utilize your personal information. In addition, these websites may contain a link to Websites of our affiliates. The websites of our affiliates are not subject to this Privacy Policy, and you should check their individual privacy policies to see how the operators of such websites will utilize your personal information.

+ +

Privacy Policy Updates
We reserve the right to modify this Privacy Policy at any time. You should review this Privacy Policy frequently. If we make material changes to this policy, we may notify you on our Website, by a blog post, by email, or by any method we determine. The method we chose is at our sole discretion. We will also change the "Last Updated" date at the beginning of this Privacy Policy. Any changes we make to our Privacy Policy are effective as of this Last Updated date and replace any prior Privacy Policies.

+ +

Questions About Our Privacy Practices or This Privacy Policy
If you have any questions about our Privacy Practices or this Policy, please contact us.

+
+
\ No newline at end of file diff --git a/views/privacy.slim b/views/privacy.slim deleted file mode 100644 index 50770ab3..00000000 --- a/views/privacy.slim +++ /dev/null @@ -1,43 +0,0 @@ -

Our Privacy Policy was last updated and posted on June 3, 2013. It governs the privacy terms of our Website, located at http://neocities.org. Any capitalized terms not defined in our Privacy Policy, have the meaning as specified in our Terms of Service.

- -

Your Privacy
Neocities follows all legal requirements to protect your privacy. Our Privacy Policy is a legal statement that explains how we may collect information from you, how we may share your information, and how you can limit our sharing of your information. You will see terms in our Privacy Policy that are capitalized. These terms have meanings as described in the Definitions section below.

- -

Definitions
"Non Personal Information" is information that is not personally identifiable to you and that we automatically collect when you access our Website with a web browser. It may also include publicly available information that is shared between you and others.

-

"Personally Identifiable Information" is non-public information that is personally identifiable to you and obtained in order for us to provide you within our Website. Personally Identifiable Information may include information such as your name, email address, and other related information that you provide to us or that we obtain about you.

- -

Information We Collect
Generally, you control the amount and type of information you provide to us when using our Website.

-

As a Visitor, you can browse our website to find out more about our Website. You are not required to provide us with any Personally Identifiable Information as a Visitor.

- -

Computer Information Collected
When you use our Website, we automatically collect certain computer information by the interaction of your mobile phone or web browser with our Website. Such information is typically considered Non Personal Information. We also collect the following:

- - -

How We Use Your Information
We use the information we receive from you as follows:

- - -

Links to Other Websites
Our Website may contain links to other websites that are not under our direct control. These websites may have their own policies regarding privacy. We have no control of or responsibility for linked websites and provide these links solely for the convenience and information of our visitors. You access such linked Websites at your own risk. These websites are not subject to this Privacy Policy. You should check the privacy policies, if any, of those individual websites to see how the operators of those third-party websites will utilize your personal information. In addition, these websites may contain a link to Websites of our affiliates. The websites of our affiliates are not subject to this Privacy Policy, and you should check their individual privacy policies to see how the operators of such websites will utilize your personal information.

- -

Privacy Policy Updates
We reserve the right to modify this Privacy Policy at any time. You should review this Privacy Policy frequently. If we make material changes to this policy, we may notify you on our Website, by a blog post, by email, or by any method we determine. The method we chose is at our sole discretion. We will also change the "Last Updated" date at the beginning of this Privacy Policy. Any changes we make to our Privacy Policy are effective as of this Last Updated date and replace any prior Privacy Policies.

- -

Questions About Our Privacy Practices or This Privacy Policy
If you have any questions about our Privacy Practices or this Policy, please contact us.

- -

Privacy Policy by TermsFeed.com

\ No newline at end of file diff --git a/views/settings.slim b/views/settings.slim index c257088f..c37dadcd 100644 --- a/views/settings.slim +++ b/views/settings.slim @@ -63,4 +63,4 @@ .content h2.eps.txt-Center Custom Domain p.txt-Center: strong (advanced) - p You can configure a custom domain for your NeoCities site. Click Here for more information. + p You can configure a custom domain for your Neocities site. Click Here for more information. diff --git a/views/site_files/upload.slim b/views/site_files/upload.slim index d986c444..5c18d54c 100644 --- a/views/site_files/upload.slim +++ b/views/site_files/upload.slim @@ -43,7 +43,7 @@ javascript: .row .span5.text-center - h5 NeoCities uses a "drag and drop" file upload. Simply take files and drop them from your computer on the white box (or click it) and they are uploaded. + h5 Neocities uses a "drag and drop" file upload. Simply take files and drop them from your computer on the white box (or click it) and they are uploaded. div style="background-color: #FFFFFF;" form action="/site_files/upload" class="dropzone" id="uploads" input name="csrf_token" type="hidden" value="#{csrf_token}" diff --git a/views/templates/cat.png b/views/templates/cat.png new file mode 100644 index 00000000..d4be8f21 Binary files /dev/null and b/views/templates/cat.png differ diff --git a/views/templates/domain.erb b/views/templates/domain.erb index a0222906..67e8ed61 100644 --- a/views/templates/domain.erb +++ b/views/templates/domain.erb @@ -1,8 +1,8 @@ server { listen 80; - server_name <%= domain %> *.<%= domain %>; + server_name <%== domain %> *.<%== domain %>; access_log /var/log/nginx/neocities-domains.log neocitiesdomain; - root /home/web/neocities-web/public/sites/<%= username %>; + root /home/web/neocities-web/public/sites/<%== username %>; index /index.html; error_page 404 = @notfound; diff --git a/views/templates/index.erb b/views/templates/index.erb new file mode 100644 index 00000000..baa9dcbd --- /dev/null +++ b/views/templates/index.erb @@ -0,0 +1,38 @@ + + + + + The web site of <%= username %> + + + +

Welcome to my Website!

+ +

This is a paragraph! Here's how you make a link: NeoCities.

+ +

Here's how you can make bold and italic text.

+ +

Here's how you can add an image:

+ + +

Here's how to make a list:

+ + + +

To learn more HTML/CSS, check out these tutorials!

+ + \ No newline at end of file diff --git a/views/templates/index.slim b/views/templates/index.slim deleted file mode 100644 index ec629b3e..00000000 --- a/views/templates/index.slim +++ /dev/null @@ -1,31 +0,0 @@ -doctype html -html - head - meta charset="UTF-8" - - title #{username} - - meta name="description" content="" - meta name="keywords" content="" - - link href="//groundfloor.neocities.org/default.css" rel="stylesheet" media="all" - - - - body - - header - h1 Welcome to my Website! - nav - ul - li - Home - - main - p This is a new page! Coming soon. - p This page uses Ground Floor to style the page, click here to see some code examples. You can opt-out of this style and make your own design by removing the "default.css" link in the HTML. - - footer - p Copyright 2014 diff --git a/views/templates/not_found.erb b/views/templates/not_found.erb new file mode 100644 index 00000000..dc6a06c8 --- /dev/null +++ b/views/templates/not_found.erb @@ -0,0 +1,16 @@ + + + + + Not Found + + + +

Page Not Found

+

The requested page was not found.

+ + \ No newline at end of file diff --git a/views/templates/not_found.slim b/views/templates/not_found.slim deleted file mode 100644 index 4250d9f7..00000000 --- a/views/templates/not_found.slim +++ /dev/null @@ -1,17 +0,0 @@ -doctype html -html - head - meta http-equiv="Content-Type" content="text/html; charset=UTF-8" - - title #{username} - Page Not Found - - link href="//groundfloor.neocities.org/default.css" rel="stylesheet" type="text/css" media="all" - - - - body - .txt-Center - h1 Page Not Found - p The requested page was not found on this web site. diff --git a/views/templates/untitled.txt b/views/templates/untitled.txt new file mode 100644 index 00000000..e69de29b diff --git a/views/terms.erb b/views/terms.erb new file mode 100644 index 00000000..1f561686 --- /dev/null +++ b/views/terms.erb @@ -0,0 +1,24 @@ +
+

Terms of Service

+
+

This web page represents a legal document that serves as our Terms of Service and it governs the legal terms of our website, http://neocities.org, sub-domains, and any associated web-based and mobile applications (collectively, "Website"), as owned and operated by Neocities.

+

Capitalized terms, unless otherwise defined, have the meaning specified within the Definitions section below. This Terms of Service, along with our Privacy Policy, any mobile license agreement, and other posted guidelines within our Website, collectively "Legal Terms", constitute the entire and only agreement between you and Neocities, and supersede all other agreements, representations, warranties and understandings with respect to our Website and the subject matter contained herein. We may amend our Legal Terms at any time without specific notice to you. The latest copies of our Legal Terms will be posted on our Website, and you should review all Legal Terms prior to using our Website. After any revisions to our Legal Terms are posted, you agree to be bound to any such changes to them. Therefore, it is important for you to periodically review our Legal Terms to make sure you still agree to them.

+

By using our Website, you agree to fully comply with and be bound by our Legal Terms. Please review them carefully. If you do not accept our Legal Terms, do not access and use our Website. If you have already accessed our Website and do not accept our Legal Terms, you should immediately discontinue use of our Website.

+

The last update to our Terms of Service was posted on June 3, 2013.

+ +

Definitions
The terms "us" or "we" or "our" refers to Neocities, the owner of the Website.

+

A "Visitor" is someone who merely browses our Website, but has not registered as Member.

+

A "Member" is an individual that has registered with us to use our Service.

+

Our "Service" represents the collective functionality and features as offered through our Website to our Members.

+

A "User" is a collective identifier that refers to either a Visitor or a Member.

+

All text, information, graphics, audio, video, and data offered through our Website are collectively known as our "Content".

+ +

Legal Compliance
You agree to comply with all applicable domestic and international laws, statutes, ordinances, and regulations regarding your use of our Website. Neocities reserves the right to investigate complaints or reported violations of our Legal Terms and to take any action we deem appropriate, including but not limited to canceling your Member account, reporting any suspected unlawful activity to law enforcement officials, regulators, or other third parties and disclosing any information necessary or appropriate to such persons or entities relating to your profile, email addresses, usage history, posted materials, IP addresses and traffic information, as allowed under our Privacy Policy.

+ +

Intellectual Property
Our Website may contain our service marks or trademarks as well as those of our hosted sites, affiliates or other companies, in the form of words, graphics, and logos. Your use of our Website does not constitute any right or license for you to use such service marks/trademarks, without the prior written permission of the corresponding service mark/trademark owner.

+ +

Links to Other Websites
Our Website may contain links to third party websites. These links are provided solely as a convenience to you. By linking to these websites, we do not create or have an affiliation with, or sponsor such third party websites. The inclusion of links within our Website does not constitute any endorsement, guarantee, warranty, or recommendation of such third party websites. Neocities has no control over the legal documents and privacy practices of third party websites; as such, you access any such third party websites at your own risk.

+ +

General Terms
Our Legal Terms shall be treated as though it were executed and performed in Oregon, United States, and shall be governed by and construed in accordance with the laws of Oregon, United States, without regard to conflict of law principles. In addition, you agree to submit to the personal jurisdiction and venue of such courts. Any cause of action by you with respect to our Website, must be instituted within one (1) year after the cause of action arose or be forever waived and barred. Should any part of our Legal Terms be held invalid or unenforceable, that portion shall be construed consistent with applicable law and the remaining portions shall remain in full force and effect. To the extent that any Content in our Website conflicts or is inconsistent with our Legal Terms, our Legal Terms shall take precedence. Our failure to enforce any provision of our Legal Terms shall not be deemed a waiver of such provision nor of the right to enforce such provision. The rights of Neocities under our Legal Terms shall survive the termination of our Legal Terms.

+
+
\ No newline at end of file diff --git a/views/terms.slim b/views/terms.slim deleted file mode 100644 index 5a7d9380..00000000 --- a/views/terms.slim +++ /dev/null @@ -1,21 +0,0 @@ -

This web page represents a legal document that serves as our Terms of Service and it governs the legal terms of our website, http://neocities.org, sub-domains, and any associated web-based and mobile applications (collectively, "Website"), as owned and operated by Neocities.

-

Capitalized terms, unless otherwise defined, have the meaning specified within the Definitions section below. This Terms of Service, along with our Privacy Policy, any mobile license agreement, and other posted guidelines within our Website, collectively "Legal Terms", constitute the entire and only agreement between you and Neocities, and supersede all other agreements, representations, warranties and understandings with respect to our Website and the subject matter contained herein. We may amend our Legal Terms at any time without specific notice to you. The latest copies of our Legal Terms will be posted on our Website, and you should review all Legal Terms prior to using our Website. After any revisions to our Legal Terms are posted, you agree to be bound to any such changes to them. Therefore, it is important for you to periodically review our Legal Terms to make sure you still agree to them.

-

By using our Website, you agree to fully comply with and be bound by our Legal Terms. Please review them carefully. If you do not accept our Legal Terms, do not access and use our Website. If you have already accessed our Website and do not accept our Legal Terms, you should immediately discontinue use of our Website.

-

The last update to our Terms of Service was posted on June 3, 2013.

- -

Definitions
The terms "us" or "we" or "our" refers to Neocities, the owner of the Website.

-

A "Visitor" is someone who merely browses our Website, but has not registered as Member.

-

A "Member" is an individual that has registered with us to use our Service.

-

Our "Service" represents the collective functionality and features as offered through our Website to our Members.

-

A "User" is a collective identifier that refers to either a Visitor or a Member.

-

All text, information, graphics, audio, video, and data offered through our Website are collectively known as our "Content".

- -

Legal Compliance
You agree to comply with all applicable domestic and international laws, statutes, ordinances, and regulations regarding your use of our Website. Neocities reserves the right to investigate complaints or reported violations of our Legal Terms and to take any action we deem appropriate, including but not limited to canceling your Member account, reporting any suspected unlawful activity to law enforcement officials, regulators, or other third parties and disclosing any information necessary or appropriate to such persons or entities relating to your profile, email addresses, usage history, posted materials, IP addresses and traffic information, as allowed under our Privacy Policy.

- -

Intellectual Property
Our Website may contain our service marks or trademarks as well as those of our hosted sites, affiliates or other companies, in the form of words, graphics, and logos. Your use of our Website does not constitute any right or license for you to use such service marks/trademarks, without the prior written permission of the corresponding service mark/trademark owner.

- -

Links to Other Websites
Our Website may contain links to third party websites. These links are provided solely as a convenience to you. By linking to these websites, we do not create or have an affiliation with, or sponsor such third party websites. The inclusion of links within our Website does not constitute any endorsement, guarantee, warranty, or recommendation of such third party websites. Neocities has no control over the legal documents and privacy practices of third party websites; as such, you access any such third party websites at your own risk.

- -

General Terms
Our Legal Terms shall be treated as though it were executed and performed in Oregon, United States, and shall be governed by and construed in accordance with the laws of Oregon, United States, without regard to conflict of law principles. In addition, you agree to submit to the personal jurisdiction and venue of such courts. Any cause of action by you with respect to our Website, must be instituted within one (1) year after the cause of action arose or be forever waived and barred. Should any part of our Legal Terms be held invalid or unenforceable, that portion shall be construed consistent with applicable law and the remaining portions shall remain in full force and effect. To the extent that any Content in our Website conflicts or is inconsistent with our Legal Terms, our Legal Terms shall take precedence. Our failure to enforce any provision of our Legal Terms shall not be deemed a waiver of such provision nor of the right to enforce such provision. The rights of Neocities under our Legal Terms shall survive the termination of our Legal Terms.

- -

Terms of Service by TermsFeed.com

\ No newline at end of file diff --git a/views/tutorials.erb b/views/tutorials.erb index 3e3bf0e7..d1326a3a 100644 --- a/views/tutorials.erb +++ b/views/tutorials.erb @@ -43,7 +43,7 @@

CSS Frameworks

-

CSS frameworks are pre-built CSS styles that make it easy to quickly build a nice looking web page, without having to "roll your own" set of styles. NeoCities itself uses one as the basis for our design (Brass Tacks). They are very useful, and definitely worth checking out once you have an understanding of how CSS works.

+

CSS frameworks are pre-built CSS styles that make it easy to quickly build a nice looking web page, without having to "roll your own" set of styles. Neocities itself uses one as the basis for our design (Brass Tacks). They are very useful, and definitely worth checking out once you have an understanding of how CSS works.