fix for site tags referencing followed counts

This commit is contained in:
Kyle Drake 2015-07-18 15:23:01 -07:00
commit d264672b51
114 changed files with 4538 additions and 1052 deletions

View file

@ -10,9 +10,11 @@
<ul class="tiny h-Nav">
<li><a href="/about">About</a></li>
<li><a href="/donate">Donate</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/api">API</a></li>
<li><a href="/press">Press</a></li>
<% unless is_education? %>
<li><a href="/blog">Blog</a></li>
<li><a href="/api">API</a></li>
<li><a href="/press">Press</a></li>
<% end %>
<li><a href="/terms" rel="nofollow">Terms</a></li>
<li><a href="/privacy" rel="nofollow">Privacy</a></li>
<li><a href="/contact" rel="nofollow">Contact</a></li>

View file

@ -30,17 +30,19 @@
</span>
</a>
<ul class="dropdown-menu">
<li><a href="/site/<%= current_site.username %>">Profile</a></li>
<li>
<a href="/?activity=mine"><span class="float-Left">Activity</span>
<% if current_site.unseen_notifications_count > 0 %>
<span class="notification-value"><%= current_site.unseen_notifications_count %></span>
<% end %>
</a>
</li>
<li class="divider"></li>
<% unless is_education? %>
<li><a href="/site/<%= current_site.username %>">Profile</a></li>
<li>
<a href="/?activity=mine"><span class="float-Left">Activity</span>
<% if current_site.unseen_notifications_count > 0 %>
<span class="notification-value"><%= current_site.unseen_notifications_count %></span>
<% end %>
</a>
</li>
<li class="divider"></li>
<% end %>
<li><a href="/dashboard">Edit Site</a></li>
<li><a href="//<%= current_site.host %>" target="_blank">View Site</a></li>
<li><a href="<%= current_site.uri %>" target="_blank">View Site</a></li>
<li class="divider"></li>
<li><a href="/settings">Settings</a></li>

View file

@ -1,4 +1,4 @@
<% if request.path == '/' && !signed_in? %>
<% if (request.path == '/' && !signed_in?) || request.path == '/education' %>
<li>
<a href="/">Neocities</a>
</li>
@ -6,12 +6,16 @@
<li>
<a href="/browse">Websites</a>
</li>
<% unless is_education? %>
<li>
<a href="/activity">Activity</a>
</li>
<% end %>
<li>
<a href="/tutorials">Learn</a>
</li>
<% unless is_education? %>
<li>
<a href="/plan">Support Us<i class="fa fa-heart"><i class="fa fa-heart"></i></i></a>
<a href="https://www.kickstarter.com/projects/1262953102/neocities-30-an-interactive-html-css-course-for-ev">Support Our Kickstarter<i class="fa fa-heart"><i class="fa fa-heart"></i></i></a>
</li>
<% end %>

View file

@ -0,0 +1,41 @@
<script src="/js/app.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script>
$('#createSiteForm').on('submit', function(obj) {
$.post('/create_validate_all', $(obj.target).serialize(), function(errors) {
if(errors.length == 0) {
$.post('/create', $('#createSiteForm').serialize(), function(res) {
if($('input[name=is_education]').val() == 'true') {
window.location.href = '/dashboard'
} else {
window.location.href = '/welcome'
}
})
} else {
for(var i=0; i<errors.length;i++) {
if(errors[i][0] == 'captcha') {
var captchaDiv = $('#captcha-input')
captchaDiv.attr('data-original-title', errors[i][1])
captchaDiv.tooltip('show')
} else {
var ele = $('input[name='+errors[i][0]+']')
ele.attr('data-original-title', errors[i][1])
ele.tooltip('show')
}
}
}
})
})
$('input[type=text],input[type=password]').on('change focusout', function(obj) {
$.post('/create_validate', {field: obj.target.name, value: obj.target.value, is_education: $('input[name=is_education]')[0].value, csrf_token: '<%= csrf_token %>'}, function(res) {
if(res.result == 'ok') {
return $(obj.target).tooltip('hide')
}
$(obj.target).attr('data-original-title', res.error)
$(obj.target).tooltip('show')
})
})
</script>

View file

@ -1,5 +1,5 @@
<div id="comment-template" style="display: none">
<form onsubmit="Comment.create({{ eventId }}, '<%= csrf_token %>', this); location.reload(); return false">
<form onsubmit="Comment.create({{ eventId }}, '<%= csrf_token %>', this); return false">
<input name="comment" type="text" autocomplete="off" maxlength="<%= Site::MAX_COMMENT_SIZE %>" style="width: 100%" placeholder="Comment on this...">
<button class="btn-Action">Post</button>
</form>

View file

@ -7,6 +7,12 @@
<div class="content misc-page single-Col txt-Center" style="padding-top: 20px;">
<div class="row">
<div class="col col-100">
<a href="/admin/reports">Site Reports</a>
</div>
</div>
<% if flash.keys.length > 0 %>
<div class="alert alert-error alert-block">
<% flash.keys.each do |key| %>

49
views/admin/email.erb Normal file
View file

@ -0,0 +1,49 @@
<div class="header-Outro">
<div class="row content single-Col">
<h1>Email Mass Send</h1>
<h2 class="subtitle">Use wisely.</h2>
</div>
</div>
<div class="content misc-page single-Col txt-Center" style="padding-top: 20px;">
<% if flash.keys.length > 0 %>
<div class="alert alert-error alert-block">
<% flash.keys.each do |key| %>
<%== flash[key] %>
<% end %>
</div>
<% end %>
<div class="row">
<div class="col col-100">
<p>
This sends to all emails on Neocities that have not opted out. It trickles it out, 4000/day to prevent spam report issues.
</p>
<form method="POST" action="/admin/email">
<%== csrf_token_input_html %>
<p>
Subject:
</p>
<p>
<input name="subject" type="text" style="width: 600px">
</p>
<p>
Body:
</p>
<p>
<textarea name="body" style="width: 600px" rows="10"></textarea>
</p>
<p>
<input type="submit" value="Send" class="btn">
</p>
</form>
</div>
</div>
</div>

45
views/admin/reports.erb Normal file
View file

@ -0,0 +1,45 @@
<div class="header-Outro">
<div class="row content single-Col">
<h1>Site Reports</h1>
</div>
</div>
<div class="content" style="background: white">
<form method="POST" action="/admin/report">
<table class="table">
<tr>
<th>Site</th>
<th>Type</th>
<th>Comments</th>
<th>Actions</th>
</tr>
<% @reports.each do |report| %>
<tr>
<td>
<a href="<%= report.site.uri %>"><%= report.site.title %></a>
<br>
<img src="<%= report.site.screenshot_url('/index.html', '540x405') %>">
<br>
Reported <%= report.created_at.ago %>
<% if report.reporting_site %>
by <a href="<%= report.reporting_site.uri %>"><%= report.reporting_site.username %></a>
<% end %>
</td>
<td><%= report.type %></td>
<td><%= report.comments[0...100] %></td>
<td>
<select name="sites[<%= report.site_id %>]">
<option value="">No Action</option>
<option value="ban">Ban Site</option>
<option value="nsfw">Mark NSFW</option>
</select>
</td>
</tr>
<% end %>
</table>
<input type="submit" value="Perform Actions" class="btn">
</form>
</div>

View file

@ -12,40 +12,48 @@
<div class="row content">
<div class="col col-100">
<% if params[:tag] %>
<h1>Sites tagged <%= params[:tag] %></h1>
<h1><a href="/browse">Websites</a> > <%= params[:tag] %></h1>
<% else %>
<h1>Sites on Neocities</h1>
<h1>Websites on Neocities</h1>
<% end %>
</div>
<form id="search_criteria" action="/browse" method="GET">
<div class="col col-50 filter">
<fieldset class="grouping">
<label class="text-Label" for="sort_by">Sort by:</label>
<div class="select-Container">
<select name="sort_by" id="sort_by" class="input-Select">
<option value="last_updated" <%= params[:sort_by] == 'last_updated' ? 'selected' : '' %>>Last Updated</option>
<option value="views" <%= params[:sort_by] == 'views' ? 'selected' : '' %>>Most Views</option>
<option value="hits" <%= params[:sort_by] == 'hits' ? 'selected' : '' %>>Most Hits</option>
<option value="newest" <%= params[:sort_by] == 'newest' ? 'selected' : '' %>>Newest</option>
<option value="oldest" <%= params[:sort_by] == 'oldest' ? 'selected' : '' %>>Oldest</option>
<option value="random" <%= params[:sort_by] == 'random' ? 'selected' : '' %>>Random</option>
</select>
</div>
<!--
<div>
<input name="is_nsfw" type="checkbox" value="true" <%= params[:is_nsfw].to_s == 'true' ? 'checked' : '' %>> Show 18+ content
</div>
-->
<% unless is_education? %>
<label class="text-Label" for="sort_by">Sort by:</label>
<div class="select-Container">
<select name="sort_by" id="sort_by" class="input-Select">
<option value="followers" <%= params[:sort_by] == 'followers' ? 'selected' : '' %>>Most Followed</option>
<option value="last_updated" <%= params[:sort_by] == 'last_updated' ? 'selected' : '' %>>Last Updated</option>
<option value="supporters" <%= params[:sort_by] == 'supporters' ? 'selected' : '' %>>Neocities Supporters</option>
<option value="featured" <%= params[:sort_by] == 'featured' ? 'selected' : '' %>>Featured</option>
<option value="views" <%= params[:sort_by] == 'views' ? 'selected' : '' %>>Most Views</option>
<option value="hits" <%= params[:sort_by] == 'hits' ? 'selected' : '' %>>Most Hits</option>
<option value="newest" <%= params[:sort_by] == 'newest' ? 'selected' : '' %>>Newest</option>
<option value="oldest" <%= params[:sort_by] == 'oldest' ? 'selected' : '' %>>Oldest</option>
<option value="random" <%= params[:sort_by] == 'random' ? 'selected' : '' %>>Random</option>
</select>
</div>
<!--
<div>
<input name="is_nsfw" type="checkbox" value="true" <%= params[:is_nsfw].to_s == 'true' ? 'checked' : '' %>> Show 18+ content
</div>
-->
<input class="btn-Action" type="submit" value="Update">
<% end %>
</fieldset>
</div>
<div class="col col-50 filter">
<form method="GET" action="browse">
<fieldset class="grouping">
<label class="text-Label" for="tag"><span class="hide-on-mobile">Search by </span>Tag:</label>
<input class="input-Area typeahead" id="tag" name="tag" type="text" placeholder="pokemon" value="<%= params[:tag] %>" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" dir="auto">
<input style="vertical-align: -4px;margin-left: 4px;" type="submit" class="btn-Action" value="Search">
<% unless is_education? || params[:sort_by] == 'followers' %>
<label class="text-Label" for="tag"><span class="hide-on-mobile">Filter by </span>Tag:</label>
<input class="input-Area typeahead" id="tag" name="tag" type="text" placeholder="pokemon" value="<%= params[:tag] %>" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" dir="auto">
<input style="vertical-align: -4px;margin-left: 4px;" type="submit" class="btn-Action" value="Filter">
<% end %>
</fieldset>
</div>
</div>
@ -141,12 +149,35 @@
<% end %>
<% end %>
<div class="row website-Gallery content int-Gall tags">
<h3>Popular Tags</h3>
<p>
<% Tag.popular_names(100).each do |tag| %>
<a href="/browse?tag=<%= Rack::Utils.escape tag[:name] %>"><%= tag[:name] %></a>&nbsp;&nbsp;
<% end %>
</p>
<% unless is_education? %>
<div class="row content misc">
<h3>Popular Tags</h3>
<p>
<% Tag.popular_names(100).each do |tag| %>
<a href="/browse?tag=<%= Rack::Utils.escape tag[:name] %>"><%= tag[:name] %></a>&nbsp;&nbsp;
<% end %>
</p>
</div>
<div class="row content misc">
<h3>Text Search</h3>
<form id="searchForm" method="GET" action="https://duckduckgo.com" class="content" onsubmit="return addSiteToSearch()">
<input name="csrf_token" type="hidden" value="<%= csrf_token %>">
<fieldset>
<input id="searchQuery" name="q" type="text" placeholder="keywords" class="input-Area" autocapitalize="off" autocorrect="off" value="<%= flash[:username] %>" style="width: 50%">
<input class="btn btn-Action" type="submit" value="Search">
</fieldset>
</form>
<p>Search powered by <a href="https://duckduckgo.com/">Duck Duck Go</a></p>
</div>
<% end %>
</div>
<script>
function addSiteToSearch() {
var searchQuery = $('#searchQuery')
var finalSearchQuery = searchQuery.val() + ' site:neocities.org'
window.location = 'https://duckduckgo.com/?q='+encodeURI(finalSearchQuery)
return false
}
</script>

View file

@ -22,7 +22,7 @@
<h2>Contact</h2>
<p>
Please note that we can only respond to messages sent in the English language.
Please note that we can only respond to english inquiries.
</p>
<p>

View file

@ -18,7 +18,6 @@
<div class="header-Outro with-site-image dashboard">
<div class="row content wide">
<div class="col col-50 signup-Area">
<div class="signup-Form">
<fieldset class="content">
@ -30,7 +29,7 @@
<div class="col col-50">
<h2 class="eps"><%= current_site.title %></h2>
<p class="site-url">
<a href="//<%= current_site.host %>" target="_blank"><%= current_site.host %></a>
<a href="<%= current_site.uri %>" target="_blank"><%= current_site.host %></a>
<a href="#" id="shareButton" class="btn-Action" data-container="body" data-toggle="popover" data-placement="bottom" data-content='<%== erb :'_share', layout: false, locals: {site: current_site} %>'><i class="fa fa-share-alt"></i> <span>Share</span></a>
</p>
<ul>
@ -39,7 +38,7 @@
<% end %>
<li>Using <strong><%= current_site.space_percentage_used %>% (<%= current_site.total_space_used.to_space_pretty %>) of your <%= current_site.maximum_space.to_space_pretty %></strong>.
<br>
<% if !current_site.supporter? %>Need more space? <a href="/plan">Become a Supporter!</a><% end %></li>
<% unless current_site.is_education || current_site.supporter? %>Need more space? <a href="/plan">Become a Supporter!</a><% end %></li>
<li><strong><%= current_site.views.format_large_number %></strong> views</li>
</ul>
</div>
@ -51,7 +50,7 @@
<div class="content wide">
<% unless current_site.changed_count > 5 %>
<% unless current_site.changed_count >= 1 %>
<div class="welcome">
<!-- <div class="close-button"></div> -->
<h4>Hello! Welcome to your new site.</h4>
@ -75,7 +74,11 @@
</div>
<% end %>
<div class="files">
<div id="filesDisplay" class="files">
<script>
if(localStorage && localStorage.getItem('viewType') == 'list')
$('#filesDisplay').addClass('list-view')
</script>
<div id="uploadingOverlay" class="uploading-overlay" style="display: none">
<div class="uploading">
<p>Uploading, please wait...</p>
@ -83,6 +86,10 @@
</div>
</div>
<div class="header">
<div class="btn-group" role="group" aria-label="...">
<button type="button" class="btn btn-default iconview-button" title="Icon View" onclick="iconView()"><i class="fa fa-th"></i></button>
<button type="button" class="btn btn-default listview-button" title="List View" onclick="listView()"><i class="fa fa-list"></i></button>
</div>
<div class="breadcrumbs">
<% if params[:dir].nil? || params[:dir].empty? || params[:dir] == '/' %>
Home
@ -102,7 +109,7 @@
<% end %>
</div>
<div class="actions">
<a href="/site_files/new_page?dir=<%= Rack::Utils.escape @dir %>" class="btn-Action"><i class="fa fa-file"></i> New Page</a>
<a href="#createFile" class="btn-Action" data-toggle="modal"><i class="fa fa-file"></i> New File</a>
<a href="#createDir" class="btn-Action" data-toggle="modal"><i class="fa fa-folder"></i> New Folder</a>
<a href="#" class="btn-Action" onclick="clickUploadFiles(); return false"><i class="fa fa-arrow-circle-up"></i> Upload</a>
</div>
@ -115,6 +122,7 @@
<div class="upload-Boundary <%= @file_list.length <= 5 ? 'with-instruction' : '' %>">
<% @file_list.each do |file| %>
<div class="file filehover">
<!-- <input type="checkbox" name="" value="" /> -->
<% if file[:is_html] && current_site.screenshot_exists?(file[:path], '210x158') %>
<div class="html-thumbnail html fileimagehover">
<img src="<%= current_site.screenshot_url(file[:path], '210x158') %>" alt="">
@ -138,12 +146,19 @@
<% end %>
<a class="title">
<% if file[:name].length > 19 %>
<%= file[:name].slice(0..18) %>&hellip;
<% else %>
<%= file[:name] %>
<% end %>
<%= file[:name] %>
</a>
<div class="column size">
<% if file[:size] %>
<%= file[:size].to_bytes_pretty %>
<% end %>
</div>
<div class="column updated">
<% if file[:updated_at] %>
<%= file[:updated_at].ago %>
<% end %>
</div>
<div class="overlay">
<% if file[:is_editable] %>
<a href="/site_files/text_editor<%= file[:path] %>"><i class="fa fa-edit" title="Edit"></i> Edit</a>
@ -189,8 +204,10 @@
<% if !current_site.plan_feature(:no_file_restrictions) %>
<a href="/site_files/allowed_types">Allowed file types</a> |
<% end %>
<a href="/site_files/<%= current_site.username %>.zip">Download entire site</a> |
<a href="/site_files/mount_info">Mount your site as a drive on your computer!</a>
<a href="/site_files/<%= current_site.username %>.zip">Download entire site</a>
<% unless is_education? %>
| <a href="/site_files/mount_info">Mount your site as a drive on your computer!</a>
<% end %>
</div>
</div>
@ -203,6 +220,44 @@
<input id="uploadFiles" type="file" name="files[]" multiple onchange="$('#uploadFilesButtonForm').submit()">
</form>
<div class="modal hide fade" id="createDir" tabindex="-1" role="dialog" aria-labelledby="createDirLabel" aria-hidden="true">
<form method="post" action="/site/create_directory">
<input type="hidden" value="<%= csrf_token %>" name="csrf_token">
<input type="hidden" value="<%= @dir %>" name="dir">
<div class="modal-header">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i></button>
<h3 id="createDirLabel">Create Folder</h3>
</div>
<div class="modal-body">
<input id="newDirInput" name="name" type="text" placeholder="folder_name">
</div>
<div class="modal-footer">
<button type="button" class="btn cancel" data-dismiss="modal" aria-hidden="true">Cancel</button>
<button type="submit" class="btn-Action">Create</button>
</div>
</form>
</div>
<div class="modal hide fade" id="createFile" tabindex="-1" role="dialog" aria-labelledby="createFileLabel" aria-hidden="true">
<form method="post" action="/site_files/create">
<input type="hidden" value="<%= csrf_token %>" name="csrf_token">
<input type="hidden" value="<%= @dir %>" name="dir">
<div class="modal-header">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i></button>
<h3 id="createFileLabel">Create New File</h3>
</div>
<div class="modal-body">
<input id="newFileInput" name="filename" type="text" placeholder="newfile.html">
<p>Note: We will automatically scrub any characters not matching: a-z A-Z 0-9 _ - .</p>
</div>
<div class="modal-footer">
<button type="button" class="btn cancel" data-dismiss="modal" aria-hidden="true">Cancel</button>
<button type="submit" class="btn-Action">Create</button>
</div>
</form>
</div>
<script src="/js/dropzone.min.js"></script>
<script>
@ -246,8 +301,12 @@
this.on("error", function(file, errorMessage) {
hideUploadProgress()
location.href = '/dashboard<%= @dir ? "?dir=#{@dir}" : "" %>'
// alert('Failed: '+errorMessage)
// Guess a directory upload error
if(file.status == 'error' && file.name.match(/.+\..+/) == null && errorMessage == 'Server responded with 0 code.') {
alert('Recursive directory upload is only supported by the Chrome web browser.')
} else {
location.href = '/dashboard<%= @dir ? "?dir=#{@dir}" : "" %>'
}
})
this.on("totaluploadprogress", function(progress, totalBytes, totalBytesSent) {
@ -258,24 +317,32 @@
$('#progressBar').css('display', 'block')
$('#uploadingProgress').css('width', progress+'%')
})
this.on("sending", function(file) {
$('#uploads').append('<input type="hidden" name="file_paths[]" value="'+file.fullPath+'">')
})
}
}
</script>
<div class="modal hide fade" id="createDir" tabindex="-1" role="dialog" aria-labelledby="createDirLabel" aria-hidden="true">
<form method="post" action="/site/create_directory">
<input type="hidden" value="<%= csrf_token %>" name="csrf_token">
<input type="hidden" value="<%= @dir %>" name="dir">
<div class="modal-header">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i></button>
<h3 id="createDirLabel">Create Folder</h3>
</div>
<div class="modal-body">
<input name="name" type="text" placeholder="folder_name">
</div>
<div class="modal-footer">
<button type="button" class="btn cancel" data-dismiss="modal" aria-hidden="true">Cancel</button>
<button type="submit" class="btn-Action">Create</button>
</div>
</form>
</div>
$('#createDir').on('shown', function () {
$('#newDirInput').focus();
})
$('#createFile').on('shown', function () {
$('#newFileInput').focus();
})
function listView() {
if(localStorage)
localStorage.setItem('viewType', 'list')
$('#filesDisplay').addClass('list-view')
}
function iconView() {
if(localStorage)
localStorage.removeItem('viewType')
$('#filesDisplay').removeClass('list-view')
}
</script>

240
views/education.erb Normal file
View file

@ -0,0 +1,240 @@
<body class="hp education">
<a id="new"></a>
<div class="page">
<header class="header-Base" role="banner">
<nav class="header-Nav clearfix" role="navigation">
<a href="#!" title="show small screen nav" class="small-Nav">
<img src="/img/nav-Icon.png" alt="navigation icon" />
</a>
<ul class="h-Nav constant-Nav" role="presentation">
<%== erb :'_header_links', layout: false %>
</ul>
<ul class="status-Nav">
<% if !signed_in? %>
<li>
<a href="/signin" class="sign-In">Sign In</a>
</li>
<% else %>
<li>
<a href="/dashboard" class="sign-In">Dashboard</a>
</li>
<li>
<a href="/settings" class="sign-In">Settings</a>
</li>
<li>
<a href="/signout" class="sign-In">Sign Out</a>
</li>
<% end %>
</ul>
</nav>
<% if flash.keys.length > 0 %>
<div class="alert alert-block txt-Center">
<% flash.keys.each do |key| %>
<%== flash[key] %>
<% end %>
</div>
<% end %>
<div class="int-Logo hp-Logo">
<a href="/" title="back to home">
<span class="hidden">Neocities.org</span>
<img src="/img/cat.png" alt="Neocities.org" />
</a>
</div>
<section class="header-Intro">
<h1 class="logo header-Content content">
<span class="hidden">Neocities for Education</span>
<img src="/img/neocities-logo-education.png" alt="Neocities.org" />
</h1>
</section>
<div class="header-Outro">
<div class="row header-Content content">
<div class="col intro">
<h3 class="delta">A great place to learn how to build websites</h2>
<img src="/img/heartcat.png" class="float-Right">
<p class="intro-text">Completely free and continuously under development, we're building Neocities into a simple and intuitive web hosting service for students learning HTML and CSS for the first time. Give us a try and <a href="/contact">let us know</a> what you think!</p>
<h3 class="delta">Tools for creation and review</h2>
<img src="/img/about-neocities.png" class="float-Left">
<p class="intro-text">Neocities has a great built-in HTML editor and drag-and-drop upload. Instructors can easily review all class websites using our class tag feature. By signing up using this education page, students will get an experience tailored for them, and they'll only see sites from their class in the gallery.</p>
</div>
<div class="col signup-Area">
<% if signed_in? %>
<div class="signup-Form">
<div class="content">
<h3 class="gamma txt-Center">Build your Website!</h3>
</div>
<p class="txt-Center">
Go to your dashboard to<br> start editing your website!
</p>
<br />
<div class="txt-Center">
<a href="/dashboard" class="btn-Action">Get Started</a>
</div>
</div>
<% else %>
<form id="createSiteForm" class="signup-Form" onsubmit="return false">
<input type="hidden" name="csrf_token" value="<%= csrf_token %>">
<input type="hidden" name="is_education" value="true">
<fieldset class="content">
<h2 class="gamma">Class Sign Up</h2>
<hr />
<div class="siteCreateInputs">
<label for="create-Input">User Name</label>
<input type="text" name="prevent_autofill_username" id="prevent_autofill_username" value="" style="position:absolute; top:-2000px; left:-2000px;" />
<input type="password" name="prevent_autofill_password" id="prevent_autofill_password" value="" style="position:absolute; top:-2000px; left:-2000px;" />
<input type="text" class="input-Area" id="create-Input" name="username" placeholder="my-site-name" data-placement="left" data-trigger="manual" autocapitalize="off" autocorrect="off" autocomplete="off" />
<label for="create-Input" id="domain-name">.neocities.org</label>
<label for="tags-input">Class Tag</label>
<input type="text" class="input-Area" id="tags-input" name="new_tags_string" placeholder="E.g. SmithSummer2015" data-placement="left" data-trigger="manual" autocapitalize="off" autocorrect="off" autocomplete="off" />
<div class="col col-50" style="padding-left:0;">
<label for="password-input">
Password
</label>
<input type="password" class="input-Area" id="password-input"
name="password" placeholder="password"
data-placement="left" data-trigger="manual"
autocapitalize="off" autocorrect="off" autocomplete="off" />
</div>
<div class="col col-50">
<label for="email-input">
Email
</label>
<input type="email" class="input-Area"
id="email-input" name="email"
placeholder="me@example.com" data-placement="left"
data-trigger="manual" autocapitalize="off"
autocorrect="off" autocomplete="off" />
</div>
<div class="col col-50" style="padding-left:0;">
<label>
Confirm you are human
</label>
<div id="captcha-input" class="g-recaptcha"
data-sitekey="<%= $config['recaptcha_public_key'] %>"
data-theme="dark" data-placement="left" data-trigger="manual">
</div>
</div>
<div class="col col-50">
<div style="margin-top: 15px">
<input type="submit" value="Create My Site" class="btn-Action float-Right" />
</div>
</div>
</div>
</fieldset>
</form>
<% end %>
</div> <!-- end .col-50 -->
</div> <!-- end .row -->
</div> <!-- end .header-Outro -->
</header>
<main class="content-Base">
<div class="section instructor-quotes">
<h2 class="delta">What Instructors Say</h2>
<div class="row content">
<div class="col col-33">
<div class="image" style="width:130px;height:130px;background:#aaa"></div>
<h3>Instructor Name<br>
Location<br>
Class name</h3>
<p>"Neocities was an excellent resource for my students - it made everything very easy.
The Neocities team did a great job responding to any questions I had."</p>
</div>
<div class="col col-33">
<div class="image" style="width:130px;height:130px;background:#aaa"></div>
<h3>Instructor Name<br>
Location<br>
Class name</h3>
<p>"Neocities was an excellent resource for my students - it made everything very easy.
The Neocities team did a great job responding to any questions I had."</p>
</div>
<div class="col col-33">
<div class="image" style="width:130px;height:130px;background:#aaa"></div>
<h3>Instructor Name<br>
Location<br>
Class name</h3>
<p>"Neocities was an excellent resource for my students - it made everything very easy.
The Neocities team did a great job responding to any questions I had."</p>
</div>
</div>
</div>
<div class="section support">
<h2>Support Us</h2>
<div class="row quote">
<div class="col" style="">
<p>Neocities is funded directly by our community through supporter plans and donations. We will never sell users' personal data or embed advertising on member sites. Your support allows us to pay for server costs and continue working on Neocities full-time. You can support us by making a <a href="/donate">one-time donation</a> or by <a href="/plan">subscribing for $5/month</a>.</p>
</div>
</div>
</div>
</main>
<footer class="footer-Base" role="contentinfo">
<div class="footer-Intro">
<div class="footer-Content">
<div class="row">
<div class="col col-33">
<div class="f-Col f-Col-1 clearfix">
<span class="footer-icon"></span>
<h2 class="delta">Support Us</h2>
<p class="tiny">
Neocities is funded by <a href="/plan">supporters</a> and <a href="/donate">donations</a>. If youd like to contribute, you can help us pay our server costs using credit card, Bitcoin, or PayPal.
</p>
<a href="/donate" title="Donate to Neocities" class="action-Link">Donate Today</a>
</div>
</div>
<div class="col col-33">
<div class="f-Col f-Col-2 clearfix">
<span class="footer-icon"></span>
<h2 class="delta">About Us</h2>
<p class="tiny">
Neocities is here to bring back the creativity and
free expression to the world wide web that made it great.
</p>
<a href="/about" title="More about Neocities" class="action-Link">More About Us</a>
</div>
</div>
<div class="col col-33">
<div class="f-Col f-Col-3 clearfix">
<span class="footer-icon"></span>
<h2 class="delta">Latest News</h2>
<p class="tiny">
The latest news on Neocities can be found on our blog.
</p>
<a href="/blog" title="Read about Neocities news and updates" class="action-Link">Read More</a>
</div>
</div>
</div>
</div>
</div>
<%== erb :'_footer', layout: false %>
</footer>
</div>
<%== erb :'_index_signup_script', layout: false %>
</body>

View file

@ -21,7 +21,18 @@
<div class="content misc-page columns right-col">
<div class="col-left">
<div class="col col-66">
<% if site.followings_dataset.count == 0 %>
<div class="welcome kickstarter">
<h4><a href="https://www.kickstarter.com/projects/1262953102/neocities-30-an-interactive-html-css-course-for-ev">The Neocities Kickstarter: An HTML/CSS course for everyone</a></h4>
<p><strong><%= kickstarter_days_remaining %> days left</strong> to get Neocities rewards and support our education goals! <a href="https://www.kickstarter.com/projects/1262953102/neocities-30-an-interactive-html-css-course-for-ev">Learn More&nbsp;>></a></p>
</div>
<% if site.site_changed == false || site.changed_count == 0 %>
<div class="welcome">
<h4>Thanks for joining the Neocities community!</h4>
<p>Now start <a href="/dashboard">building your website</a>!</a>
</p>
</div>
<% elsif site.followings_dataset.count == 0 %>
<div class="welcome">
<h4>Welcome to your Neocities news feed!</h4>
<p>
@ -32,14 +43,6 @@
</div>
<% end %>
<% if !site.site_changed && site.followings_dataset.count > 0 %>
<div class="welcome">
<h4>Thanks for joining the Neocities community!</h4>
<p>Now start <a href="/dashboard">building your website</a>!</a>
</p>
</div>
<% end %>
<% if !@events.empty? %>
<%== erb :'_news', layout: false, locals: {site: current_site, events: @events} %>
<% end %>
@ -87,7 +90,7 @@
<div class="col col-33">
<div class="news-site-info">
<p class="site-url"><a href="//<%= current_site.host %>" target="_blank"><%= site.title %></a></p>
<p class="site-url"><a href="<%= current_site.uri %>" target="_blank"><%= site.title %></a></p>
<div class="stats">
<div class="col col-50">
<% if site.updated_at %>
@ -104,7 +107,7 @@
</div>
</div>
<a href="//<%= site.host %>" class="large-portrait" style="background-image:url(<%= site.screenshot_url('index.html', '540x405') %>);"></a>
<a href="<%= site.uri %>" class="large-portrait" style="background-image:url(<%= site.screenshot_url('index.html', '540x405') %>);"></a>
<div class="news-profile-button">
<a href="/site/<%= site.username %>" class="btn-Action"><i class="fa fa-user"></i> Profile</a>

View file

@ -1,203 +1,175 @@
<!doctype html>
<!--[if IE 8 ]><html lang="en" class="ieAll ie8"><![endif]-->
<!--[if IE 9 ]><html lang="en" class="ieAll ie9"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html lang="en"><!--<![endif]-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<body class="hp">
<a id="new"></a>
<title>Neocities: Create your free website now!</title>
<meta itemprop="name" content="Neocities.org" />
<meta itemprop="description" content="Create your own free home page, and do whatever you want with it." />
<meta name="description" content="Neocities is the new Geocities. Create your own free home page, and do whatever you want with it." />
<meta name="keywords" content="free website, html, css, learn to code, free hosting, build a website, create a web page" />
<div class="page">
<link rel="canonical" href="//neocities.org" />
<header class="header-Base" role="banner">
<nav class="header-Nav clearfix" role="navigation">
<a href="#!" title="show small screen nav" class="small-Nav">
<img src="/img/nav-Icon.png" alt="navigation icon" />
</a>
<ul class="h-Nav constant-Nav" role="presentation">
<%== erb :'_header_links', layout: false %>
</ul>
<meta property="og:title" content="Neocities"/>
<meta property="og:site_name" content="Neocities | neocities.org"/>
<meta property="og:type" content="website"/>
<meta property="og:image" content=""/>
<meta property="og:url" content="//www.neocities.org"/>
<meta property="og:description" content="Neocities is the new Geocities. Create your own free home page, and do whatever you want with it."/>
<ul class="status-Nav">
<link rel="shortcut icon" type="image/ico" href="/favicon.ico?v=4" />
<link rel="apple-touch-icon-precomposed" href="#apple-icon-144.png" />
<link rel="apple-touch-startup-image" href="#startup.png" />
<% if !signed_in? %>
<li>
<a href="/signin" class="sign-In">Sign In</a>
</li>
<% else %>
<li>
<a href="/dashboard" class="sign-In">Dashboard</a>
</li>
<li>
<a href="/settings" class="sign-In">Settings</a>
</li>
<li>
<a href="/signout" class="sign-In">Sign Out</a>
</li>
<% end %>
</ul>
</nav>
<!-- Mobile Meta -->
<meta name="HandheldFriendly" content="True" />
<meta name="MobileOptimized" content="320" />
<meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1" />
<link href="/css/neo.css" rel="stylesheet" type="text/css" media="all"/>
<!--[if lt IE 9]>
<script type="text/javascript" src="/js/html5.min.js"></script>
<![endif]-->
<script src="/js/jquery-1.11.0.min.js"></script>
<script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<body class="hp">
<a id="new"></a>
<div class="page">
<header class="header-Base" role="banner">
<nav class="header-Nav clearfix" role="navigation">
<a href="#!" title="show small screen nav" class="small-Nav">
<img src="/img/nav-Icon.png" alt="navigation icon" />
</a>
<ul class="h-Nav constant-Nav" role="presentation">
<%== erb :'_header_links', layout: false %>
</ul>
<ul class="status-Nav">
<% if !signed_in? %>
<li>
<a href="/signin" class="sign-In">Sign In</a>
</li>
<% else %>
<li>
<a href="/dashboard" class="sign-In">Dashboard</a>
</li>
<li>
<a href="/settings" class="sign-In">Settings</a>
</li>
<li>
<a href="/signout" class="sign-In">Sign Out</a>
</li>
<% end %>
</ul>
</nav>
<% if flash.keys.length > 0 %>
<div class="alert txt-Center">
<p style="padding:5px">
<% flash.keys.each do |key| %>
<%== flash[key] %>
<% end %>
</p>
</div>
<% end %>
<% if flash.keys.length > 0 %>
<div class="alert alert-block txt-Center">
<% flash.keys.each do |key| %>
<%== flash[key] %>
<% end %>
</div>
<% end %>
<div class="int-Logo hp-Logo">
<a href="/" title="back to home">
<span class="hidden">Neocities.org</span>
<img src="/img/cat.png" alt="Neocities.org" />
</a>
<a href="/" title="back to home">
<span class="hidden">Neocities.org</span>
<img src="/img/cat.png" alt="Neocities.org" />
</a>
</div>
<section class="header-Intro">
<h1 class="logo header-Content content">
<span class="hidden">Neocities.org</span>
<img src="/img/neocities-Logo.png" alt="Neocities.org" />
</h1>
<h1 class="logo header-Content content">
<span class="hidden">Neocities.org</span>
<img src="/img/neocities-Logo.png" alt="Neocities.org" />
</h1>
</section>
<div class="header-Outro">
<div class="row header-Content content">
<div class="col intro">
<h2 class="section-header">Create your own free web site, and discover new ones.</h2>
<p class="intro-text">
Neocities is a community of <a href="/browse"><%= @sites_count.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse %> sites</a> that are bringing back the lost individual creativity of the web. We provide free hosting and tools that allow anyone to make a web site. Only your imagination is required. Join us!
</p>
<ul class="intro-List">
<li class="intro-Social">
<span class="intro-Icon"></span>
<h3 class="delta">Share your web creation with the world</h3>
<p class="base">
Follow your favorite Neocities sites to keep up with all their latest updates. Discover new websites related to your interests using tags, comment on them, and share them. Unlimited creativity, zero ads.
</p>
</li>
<li class="intro-Tools">
<span class="intro-Icon"></span>
<h3 class="delta">Powerful new features to help you build</h3>
<p class="base">
Weve made it easier to build your website and explore other sites. Neocities features an in-browser HTML editor, custom domain support, faster site loading, easy file uploading, RSS feeds, folder support, and much more.
</li>
</ul>
</div>
<div class="col signup-Area">
<% if signed_in? %>
<div class="signup-Form">
<div class="content">
<h3 class="gamma txt-Center">Build your Website!</h3>
</div>
<p class="txt-Center">
Go to your dashboard to<br> start editing your website!
</p>
<br />
<div class="txt-Center">
<a href="/dashboard" class="btn-Action">Get Started</a>
</div>
<div class="row header-Content content">
<div class="col intro">
<h2 class="section-header">Create your own free web site. Unlimited creativity, zero ads.</h2>
<p class="intro-text">
Neocities is a community of <a href="/browse"><%= @sites_count.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse %> sites</a> that are bringing back the lost individual creativity of the web. We provide free hosting and tools that allow anyone to make a web site. Only your imagination is required. Join us!
</p>
<div class="intro-List kickstarter">
<div class="col col-40">
<a href="https://www.kickstarter.com/projects/1262953102/neocities-30-an-interactive-html-css-course-for-ev"><img src="/img/kickstarterthumbnail.jpg" style="width: 100%; float: left; margin-right: 20px; border: 3px solid white;margin-bottom: 1em"></a>
</div>
<div class="col col-60">
<div class="title">
<a href="https://www.kickstarter.com/projects/1262953102/neocities-30-an-interactive-html-css-course-for-ev">
SUPPORT OUR
<img src="/img/kickstarterlogo.png" style="width: 280px; display:block; margin: 11px 0px;">
<%= kickstarter_days_remaining %> DAYS LEFT
</a>
</div>
<% else %>
<form id="createSiteForm" class="signup-Form" onsubmit="return false">
<input type="hidden" name="csrf_token" value="<%= csrf_token %>">
<fieldset class="content">
<h2 class="gamma">Sign up for free</h2>
<hr />
<div class="siteCreateInputs">
<label for="create-Input">User Name</label>
<input type="text" name="prevent_autofill_username" id="prevent_autofill_username" value="" style="position:absolute; top:-2000px; left:-2000px;" />
<input type="password" name="prevent_autofill_password" id="prevent_autofill_password" value="" style="position:absolute; top:-2000px; left:-2000px;" />
<input type="text" class="input-Area" id="create-Input" name="username" placeholder="my-site-name" data-placement="left" data-trigger="manual" autocapitalize="off" autocorrect="off" autocomplete="off" />
<label for="create-Input" id="domain-name">.neocities.org</label>
<p>We need your help to build an amazing HTML/CSS course into Neocities! <a href="https://www.kickstarter.com/projects/1262953102/neocities-30-an-interactive-html-css-course-for-ev">Learn More&nbsp;>></a></p>
</div>
</div>
<!--<ul class="intro-List">
<li class="intro-Social">
<span class="intro-Icon"></span>
<h3 class="delta">Share your web creation with the world</h3>
<p class="base">
Follow your favorite Neocities sites to keep up with all their latest updates. Discover new websites related to your interests using tags, comment on them, and share them.
</p>
</li>
<li class="intro-Tools">
<span class="intro-Icon"></span>
<h3 class="delta">Powerful new features to help you build</h3>
<p class="base">
Weve made it easier to build your website and explore other sites. Neocities features an in-browser HTML editor, custom domain support, faster site loading, easy file uploading, RSS feeds, folder support, and much more.
</li>
</ul>-->
</div>
<label for="tags-input">Tags (your interests, site topics)</label>
<input type="text" class="input-Area" id="tags-input" name="new_tags_string" placeholder="art, videogames, food, music, programming, gardening, cats" data-placement="left" data-trigger="manual" autocapitalize="off" autocorrect="off" autocomplete="off" />
<div class="col signup-Area">
<% if signed_in? %>
<div class="col col-50" style="padding-left:0;">
<label for="password-input">
Password
</label>
<input type="password" class="input-Area" id="password-input"
name="password" placeholder="password"
data-placement="left" data-trigger="manual"
autocapitalize="off" autocorrect="off" autocomplete="off" />
</div>
<div class="signup-Form">
<div class="content">
<h3 class="gamma txt-Center">Build your Website!</h3>
</div>
<p class="txt-Center">
Go to your dashboard to<br> start editing your website!
</p>
<br />
<div class="txt-Center">
<a href="/dashboard" class="btn-Action">Get Started</a>
</div>
</div>
<% else %>
<form id="createSiteForm" class="signup-Form" onsubmit="return false">
<input type="hidden" name="csrf_token" value="<%= csrf_token %>">
<input type="hidden" name="is_education" value="false">
<fieldset class="content">
<h2 class="gamma">Sign up for free</h2>
<hr />
<div class="siteCreateInputs">
<label for="create-Input">User Name</label>
<input type="text" name="prevent_autofill_username" id="prevent_autofill_username" value="" style="position:absolute; top:-2000px; left:-2000px;" />
<input type="password" name="prevent_autofill_password" id="prevent_autofill_password" value="" style="position:absolute; top:-2000px; left:-2000px;" />
<input type="text" class="input-Area" id="create-Input" name="username" placeholder="my-site-name" data-placement="left" data-trigger="manual" autocapitalize="off" autocorrect="off" autocomplete="off" />
<label for="create-Input" id="domain-name">.neocities.org</label>
<div class="col col-50">
<label for="email-input">
Email
</label>
<input type="email" class="input-Area"
id="email-input" name="email"
placeholder="me@example.com" data-placement="left"
data-trigger="manual" autocapitalize="off"
autocorrect="off" autocomplete="off" />
</div>
<label for="tags-input">Tags (your interests, site topics)</label>
<input type="text" class="input-Area" id="tags-input" name="new_tags_string" placeholder="art, videogames, food, music, programming, gardening, cats" data-placement="left" data-trigger="manual" autocapitalize="off" autocorrect="off" autocomplete="off" />
<div class="col col-50" style="padding-left:0;">
<label>
Confirm you are human
</label>
<div id="captcha-input" class="g-recaptcha"
data-sitekey="<%= $config['recaptcha_public_key'] %>"
data-theme="dark" data-placement="left" data-trigger="manual">
</div>
</div>
<div class="col col-50" style="padding-left:0;">
<label for="password-input">
Password
</label>
<input type="password" class="input-Area" id="password-input"
name="password" placeholder="password"
data-placement="left" data-trigger="manual"
autocapitalize="off" autocorrect="off" autocomplete="off" />
</div>
<div class="col col-50">
<div style="margin-top: 15px">
<input type="submit" value="Create My Site" class="btn-Action float-Right" />
</div>
<div class="col col-50">
<label for="email-input">
Email
</label>
<input type="email" class="input-Area"
id="email-input" name="email"
placeholder="me@example.com" data-placement="left"
data-trigger="manual" autocapitalize="off"
autocorrect="off" autocomplete="off" />
</div>
<div class="col col-50" style="padding-left:0;">
<label>
Confirm you are human
</label>
<div id="captcha-input" class="g-recaptcha"
data-sitekey="<%= $config['recaptcha_public_key'] %>"
data-theme="dark" data-placement="left" data-trigger="manual">
</div>
</div>
</fieldset>
</form>
<% end %>
<div class="col col-50">
<div style="margin-top: 15px">
<input type="submit" value="Create My Site" class="btn-Action float-Right" />
</div>
</div>
</div>
</fieldset>
</form>
</div> <!-- end .col-50 -->
<% end %>
</div> <!-- end .row -->
</div> <!-- end .col-50 -->
</div> <!-- end .row -->
</div> <!-- end .header-Outro -->
@ -206,118 +178,118 @@
<main class="content-Base">
<div class="section featured-Websites">
<h2 class="delta">Featured Sites</h2>
<!--
<div class="nav prev"></div>
-->
<ul class="website-Gallery hp-Gallery">
<% Site.featured.each do |site| %>
<li>
<a href="<%= site.uri %>" title="<%= site.title %>" target="_blank">
<img src="<%= site.screenshot_url 'index.html', '210x158' %>" class="neo-SS" alt="<%= site.title %>" />
</a>
</li>
<% end %>
</ul>
<!--
<div class="nav next"></div>
-->
<a href="/browse" class="btn-Action float-Right">Browse all sites</a>
<h2 class="delta">Featured Sites</h2>
<!--
<div class="nav prev"></div>
-->
<ul class="website-Gallery hp-Gallery">
<% Site.featured.each do |site| %>
<li>
<a href="<%= site.uri %>" title="<%= site.title %>" target="_blank">
<img src="<%= site.screenshot_url 'index.html', '210x158' %>" class="neo-SS" alt="<%= site.title %>" />
</a>
</li>
<% end %>
</ul>
<!--
<div class="nav next"></div>
-->
<a href="/browse" class="btn-Action float-Right">Browse all sites</a>
</div>
<div class="section previews">
<h2 class="delta">Our mission: To make the web fun again by giving you back control of how you express yourself online.</h2>
<h2 class="delta">Our mission: To make the web fun again by giving you back control of how you express yourself online.</h2>
<div class="row content">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-editor-screenshot.png)"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-edit"></i> HTML editor, right in your browser</h3>
<p>No tools needed! With our easy-to-use HTML editor, you're ready to start building your awesome web site right now.</p>
<p>If you'd rather use your favorite desktop editor, no problem! Uploading files is as easy as drag-and-drop. We also support WebDAV uploading for <a href="/plan">supporter accounts</a>.</p>
</div>
</div>
<div class="row content right">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-browse-screenshot.png);"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-globe"></i> It's time to bring back web surfing!</h3>
<p>We collect all Neocities sites in our <a href="/browse">website gallery</a>. We make it easy to browse sites with our optional surf bar.</p>
<p>Using tags, our version of web rings, you can easily discover new sites related to your interests.</p>
</div>
</div>
<div class="row content">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-follow-screenshot.png);"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-user-plus"></i> Follow your favorite Neocities sites</h3>
<p>Once you find some interesting sites in our website gallery, you can keep track of all new updates by following them. Any changes to the sites show up in your news feed. You'll also see what sites are followed by your favorite site builders.</p>
</div>
</div>
<div class="row content right">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-comment-screenshot.png);"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-comments-o"></i> Web creativity plus community</h3>
<p>Interact with your favorite web builders by posting comments, liking updates, and sharing their sites on your social network of choice!</p>
</div>
<div class="row content">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-editor-screenshot.png)"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-edit"></i> HTML editor, right in your browser</h3>
<p>No tools needed. With our easy-to-use HTML editor, you're ready to start building your awesome web site right now.</p>
<p>If you'd rather use your favorite desktop editor, no problem. Uploading files is as easy as drag-n-drop.</p>
</div>
</div>
<section class="section features">
<div class="row">
<div class="col col-50">
<div class="row content right">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-browse-screenshot.png);"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-globe"></i> It's time to bring back web surfing.</h3>
<p>All Neocities sites are viewable in our <a href="/browse">website gallery</a>. And it's easy to browse sites with our optional surf bar.</p>
<p>Using tags (our version of Web Rings) you can easily discover new sites related to your interests.</p>
</div>
</div>
<div class="row content">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-follow-screenshot.png);"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-user-plus"></i> Follow your favorite Neocities sites</h3>
<p>Keep track of all your favorite sites by following them. Any changes to the sites automatically show up in your news feed. You'll also see what sites they follow.</p>
</div>
</div>
<div class="row content right">
<div class="col col-50"><div class="screenshot" style="background-image:url(/img/front-comment-screenshot.png);"></div></div>
<div class="col col-50 text">
<h3><i class="fa fa-comments-o"></i> Web creativity plus community</h3>
<p>Interact with your favorite web builders by posting comments, and sharing their sites on your social network of choice.</p>
</div>
</div>
</div>
<section class="section features">
<div class="row">
<div class="col col-50">
<h3>
<i class="fa fa-eye-slash"></i>Zero advertising
</h3>
<p>
Neocities will never sell your personal data or embed advertising on your site. Instead, we are funded directly by our community through <a href="/plan">supporter plans</a> and <a href="/donate">donations</a>. This allows us to base all our decisions on making the best possible web building experience for you, rather than on appeasing ad companies.
</p>
</div>
<div class="col col-50">
<h3><i class="fa fa-tachometer"></i>More space, speed, and security</h3>
<p>Neocities now uses distributed, globally-cached web servers in datacenters all over the world to serve your site. Whether its your personal home page or a busy professional site, your site loads fast. And if you need more space, <a href="/plan">we've got you covered</a>. We also provide Snowden-grade SSL cryptography on all sites, preventing snoops from seeing what you browse.</p>
</div>
</div>
<div class="row">
<div class="col col-50">
<h3><i class="fa fa-wrench"></i>Developer tools</h3>
<p>We have an in-browser HTML editor, easy file uploading, WebDAV publishing, support for custom domains, RSS feeds for every site, powerful APIs for building developer applications, and much more!</p>
</div>
<div class="col col-50">
<h3><i class="fa fa-university"></i>Open Company</h3>
<p>Neocities is a member of the <a href="http://www.opencompany.org/" target="_blank">Open Company Initative</a>, working to help improve trustability in tech companies. We <a href="https://github.com/neocities" target="_blank">publish</a> the code that powers the site for inspection, and strive for openness in our company's operations. We want to win your trust—not lock you in.</p>
</div>
</div>
<div class="col col-100">
<div class="row press">
<a href="http://www.wired.com/2013/07/neocities/" class="logo wired"></a>
<a href="http://www.fastcodesign.com/3037028/why-the-internet-is-time-traveling-back-to-1994" class="logo fastco"></a>
<a href="http://motherboard.vice.com/blog/neocities-is-recreating-the-garish-web-10-creativity-of-geocities" class="logo vice"></a>
<a href="http://arstechnica.com/tech-policy/2014/05/web-host-gives-fcc-a-28-8kbps-slow-lane-in-net-neutrality-protest/" class="logo ars"></a>
<!--<a href="/press" class="more">See all press »</a>-->
</div>
<div class="row quote">
<h3>
<i class="fa fa-eye-slash"></i>Zero advertising
"Designed as a 21st century reincarnation of GeoCities, Neocities lets you make your own site for free. <strong>And it just might spark a renaissance of creativity online.</strong>"
<br />
<cite>— Matthew Guay, <a href="http://web.appstorm.net/reviews/web-dev/neocities-the-free-place-to-code-your-own-site-from-scratch" target="_blank">AppStorm</a>. <a href="/press">View All Press »</a></cite>
</h3>
<p>
Neocities will never sell your personal data or embed advertising on your site. Instead, we are funded directly by our community through <a href="/plan">supporter plans</a> and <a href="/donate">donations</a>. This allows us to base all our decisions on making the best possible web building experience for you, rather than on appeasing ad companies.
</p>
</div>
<div class="col col-50">
<h3><i class="fa fa-tachometer"></i>More space, speed, and security</h3>
<p>Neocities now uses distributed, globally-cached web servers in datacenters all over the world to serve your site. Whether its your personal home page or a busy professional site, your site loads fast. And if you need more space, <a href="/plan">we've got you covered</a>. We also provide Snowden-grade SSL cryptography on all sites, preventing snoops from seeing what you browse.</p>
</div>
</div>
</div>
</section>
<div class="row">
<div class="col col-50">
<h3><i class="fa fa-wrench"></i>Developer tools</h3>
<p>We have an in-browser HTML editor, easy file uploading, WebDAV publishing, support for custom domains, RSS feeds for every site, powerful APIs for building developer applications, and much more!</p>
</div>
<% # erb :'plan/_pricing' %>
<div class="col col-50">
<h3><i class="fa fa-university"></i>Open Company</h3>
<p>Neocities is a member of the <a href="http://www.opencompany.org/" target="_blank">Open Company Initative</a>, working to help improve trustability in tech companies. We <a href="https://github.com/neocities" target="_blank">publish</a> the code that powers the site for inspection, and strive for openness in our company's operations. We want to win your trust—not lock you in.</p>
</div>
</div>
<div class="col col-100">
<div class="row press">
<a href="http://www.wired.com/2013/07/neocities/" class="logo wired"></a>
<a href="http://www.fastcodesign.com/3037028/why-the-internet-is-time-traveling-back-to-1994" class="logo fastco"></a>
<a href="http://motherboard.vice.com/blog/neocities-is-recreating-the-garish-web-10-creativity-of-geocities" class="logo vice"></a>
<a href="http://arstechnica.com/tech-policy/2014/05/web-host-gives-fcc-a-28-8kbps-slow-lane-in-net-neutrality-protest/" class="logo ars"></a>
<!--<a href="/press" class="more">See all press »</a>-->
</div>
<div class="row quote">
<h3>
"Designed as a 21st century reincarnation of GeoCities, Neocities lets you make your own site for free. <strong>And it just might spark a renaissance of creativity online.</strong>"
<br />
<cite>— Matthew Guay, <a href="http://web.appstorm.net/reviews/web-dev/neocities-the-free-place-to-code-your-own-site-from-scratch" target="_blank">AppStorm</a>. <a href="/press">View All Press »</a></cite>
</h3>
</div>
</div>
</section>
<% # erb :'plan/_pricing' %>
<section class="section bottom-signup">
<h2>What are you waiting for? <a href="#new">Start building your web site now!</a></h2>
</section>
<section class="section bottom-signup">
<h2>What are you waiting for? <a href="#new">Start building your web site now!</a></h2>
</section>
</main>
<footer class="footer-Base" role="contentinfo">
@ -358,47 +330,8 @@
</div>
</div>
</div>
<%== erb :'_footer', layout: false %>
</footer>
</div>
<script src="/js/app.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script>
$('#createSiteForm').on('submit', function(obj) {
$.post('/create_validate_all', $(obj.target).serialize(), function(errors) {
if(errors.length == 0) {
$.post('/create', $('#createSiteForm').serialize(), function(res) {
window.location.href = '/welcome'
})
} else {
for(var i=0; i<errors.length;i++) {
if(errors[i][0] == 'captcha') {
var captchaDiv = $('#captcha-input')
captchaDiv.attr('data-original-title', errors[i][1])
captchaDiv.tooltip('show')
} else {
var ele = $('input[name='+errors[i][0]+']')
ele.attr('data-original-title', errors[i][1])
ele.tooltip('show')
}
}
}
})
})
$('input[type=text],input[type=password]').on('change focusout', function(obj) {
$.post('/create_validate', {field: obj.target.name, value: obj.target.value, csrf_token: '<%= csrf_token %>'}, function(res) {
if(res.result == 'ok') {
return $(obj.target).tooltip('hide')
}
$(obj.target).attr('data-original-title', res.error)
$(obj.target).tooltip('show')
})
})
</script>
</body>
</html>
</div>
<%== erb :'_index_signup_script', layout: false %>
</body>

44
views/index_layout.erb Normal file
View file

@ -0,0 +1,44 @@
<!doctype html>
<!--[if IE 8 ]><html lang="en" class="ieAll ie8"><![endif]-->
<!--[if IE 9 ]><html lang="en" class="ieAll ie9"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html lang="en"><!--<![endif]-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Neocities: Create your free website now!</title>
<meta itemprop="name" content="Neocities" />
<meta itemprop="description" content="Create your own free web site, and do whatever you want with it." />
<meta name="description" content="Create your own free web site, and do whatever you want with it." />
<meta name="keywords" content="free website, html, css, learn to code, free hosting, build a website, create a web page" />
<link rel="canonical" href="//neocities.org" />
<meta property="og:title" content="Neocities"/>
<meta property="og:site_name" content="Neocities | neocities.org"/>
<meta property="og:type" content="website"/>
<meta property="og:image" content=""/>
<meta property="og:url" content="//www.neocities.org"/>
<meta property="og:description" content="Create your own free web site, and do whatever you want with it."/>
<link rel="shortcut icon" type="image/ico" href="/favicon.ico?v=4" />
<link rel="apple-touch-icon-precomposed" href="#apple-icon-144.png" />
<link rel="apple-touch-startup-image" href="#startup.png" />
<!-- Mobile Meta -->
<meta name="HandheldFriendly" content="True" />
<meta name="MobileOptimized" content="320" />
<meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1" />
<link href="/css/neo.css" rel="stylesheet" type="text/css" media="all"/>
<!--[if lt IE 9]>
<script type="text/javascript" src="/js/html5.min.js"></script>
<![endif]-->
<script src="/js/jquery-1.11.0.min.js"></script>
<script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<%== yield %>
</html>

35
views/permanent_web.erb Normal file
View file

@ -0,0 +1,35 @@
<div class="header-Outro">
<div class="row content single-Col">
<h1>Neocities and the Permanent Web</h1>
<h2 class="subtitle">Working to build a faster, better, more permanent web.</h2>
</div>
</div>
<div class="content single-Col misc-page">
<img src="/img/neocities-ipfs.jpg" style="margin-bottom: 20px">
<article role="article">
<p>
Neocities has launched an experimental implementation of <a href="http://ipfs.io">IPFS</a>. IPFS is short for the "Inter-Planetary File System", and is the foundation for a new way to distribute web content that is being called The Permanent Web. The idea behind the Permanent Web is simple: Instead of serving web sites from central servers, we believe that web serving should be decentralized, and that IPFS is an eventual replacement to the aging HTTP protocol.
</p>
<p>
This is still very early stage technology, so if you don't understand what this stuff is, don't worry about it for now. But if you'd like to read more about why we're interested in this new technology, please see our <a href="#">blog post</a> on the topic.
</p>
<p>
IPFS archiving and downloading is now supported by <strong>all web sites</strong> on Neocities. You'll see an IPFS hash link on the site profile, and an archive link that allows you to see past versions of your site (note: this is still a preview, so past site archives may still disappear, but we're working on making it better).
</p>
<p>
If you want to play around with this new technology, you can get IPFS for your computer and use it to retreive content from our IPFS node servers. All you need to do is <a href="http://ipfs.io/docs/install/">download the IPFS daemon</a> (OSX/Linux only for now), and run the following command in your terminal:
</p>
<p>
<code>$ ipfs pin add -r THE_IPFS_HASH_FOR_YOUR_SITE</code>
</p>
<p>
We have a lot of very interesting projects we're working on with IPFS that will make Neocities even better. Stay tuned for some interesting new technology over the next year!
</p>
</article>
</div>

152
views/plan/_compare.erb Normal file
View file

@ -0,0 +1,152 @@
<h2 style="margin-top: 2em">What You Get</h2>
<table class="plan-chart">
<tr>
<th class="feature-column"></th>
<th>
<h3>Free</h3>
<% if request.path != '/welcome' %>
<p>$<%= Site::PLAN_FEATURES[:free][:price] %>/mo</p>
<%== plan_pricing_button :free %>
<% end %>
</th>
<th class="professional">
<h3>Supporter</h3>
<% if request.path != '/welcome' %>
<% if parent_site && parent_site.legacy_supporter? %>
<p>$<%= Site::LEGACY_SUPPORTER_PRICES[parent_site.values[:plan_type].to_sym] %>/mo</p>
<div class="current-plan">Current Plan</div>
<% else %>
<p>$<%= Site::PLAN_FEATURES[:supporter][:price] %>/mo</p>
<%== plan_pricing_button :supporter %>
<% end %>
<% end %>
</th>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="How much disk space you can use for your site. More space means you can upload more files.">Storage</span>
</td>
<td><%= Site::PLAN_FEATURES[:free][:space].to_bytes_pretty %></td>
<td><%= (Site::PLAN_FEATURES[:supporter][:space] / (10**6)).to_comma_separated %> MB</td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="How much content you can serve in one month. Dont worry—these are soft limits. Temporary surges are fine, we won't take your site down automatically, and we're very flexible.">Bandwidth</span>
</td>
<td><%= Site::PLAN_FEATURES[:free][:bandwidth].to_bytes_pretty %></td>
<td><%= Site::PLAN_FEATURES[:supporter][:bandwidth].to_bytes_pretty %></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="We will never put ads on your site, or give your data to marketers. In fact, were prohibited from doing it in our own Terms of Service.">No advertising, ever</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Our worldwide network of CDN servers cache your web site regionally, making your site load fast—no matter where your users are. 頑張る, 日本!">Global CDN Site Cache</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Each site comes with a free Neocities address (yoursitename.neocities.org).">Free Site Subdomain</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Downloading your neocities site is as easy as clicking a button.">One-Click Backups</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Site tags make it easy to find sites youre interested in, and join communities of sites. Its like a web ring, but even better.">Site Tags</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Each site has its own RSS feed that make it easy to let people know when your site changes.">RSS Feed</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Like a site on Neocities? Now you can follow it, and see when they update!">Follow Your Favorite Sites</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Each site now has its own profile page, allowing users to see when your site updates, follow your site, and leave feedback.">Site Profile</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Our HTML5 site editor makes it easy to make quick changes to your site, even if youre on the run.">Neocities Site Editor</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<!--
<tr>
<td class="feature-column">Site Tipping (Coming Soon)</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
-->
<tr>
<td class="feature-column">
<span data-original-title="You can mount your Neocities site to your computer as a hard drive, making it easy to update with your favorite HTML editor.">WebDAV Uploading</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Add your domain name (yoursite.com) to your site!">Custom Domains</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Make as many sites as you want with one account, and easily switch between them.">Unlimited Site Creation</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Upload your SSL certificate for your custom domain name, preventing snoops from seeing your users traffic.">Custom SSL Certs (soon)</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="No whitelists—you can upload anything you want (no copyrighted content, trojans, or w4r3z, please).">No File Upload Type Restrictions</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
</table>
<script>
$(function() {
$('.feature-column span').tooltip({
placement: 'right'
})
})
</script>

View file

@ -1,31 +1,5 @@
<%
def plan_pricing_button(plan_type)
plan_type = plan_type.to_s
if !parent_site
%{<a href="/#new" class="btn-Action">Sign Up</a>}
elsif parent_site && parent_site.plan_type == plan_type
if request.path.match /\/welcome/
%{<a href="/" class="btn-Action">Get Started</a>}
else
%{<div class="current-plan">Current Plan</div>}
end
else
#if plan_type == 'supporter'
# plan_price = "$#{Site::PLAN_FEATURES[plan_type.to_sym][:price]*12}, once per year"
#else
plan_price = "$#{Site::PLAN_FEATURES[plan_type.to_sym][:price]}, monthly"
#end
if request.path.match /\/welcome/
button_title = 'Get Started'
else
button_title = parent_site.plan_type == 'free' ? 'Upgrade' : 'Change'
end
%{<a data-plan_name="#{Site::PLAN_FEATURES[plan_type.to_sym][:name]}" data-plan_type="#{plan_type}" data-plan_price="#{plan_price}" onclick="card = new Skeuocard($('#skeuocard')); return false" class="btn-Action planPricingButton">#{button_title}</a>}
end
end
%>
<section class="section plans">
@ -125,147 +99,7 @@
</div>
</div>
<!-- <h2><a href="">Compare Plans <i class="fa fa-caret-down"></i></a></h2> -->
<h2 style="margin-top: 2em">Compare</h2>
<table class="plan-chart">
<tr>
<th class="feature-column"></th>
<th>
<h3>Free</h3>
<p>$<%= Site::PLAN_FEATURES[:free][:price] %>/mo</p>
<%== plan_pricing_button :free %>
</th>
<th class="professional">
<h3>Supporter</h3>
<% if parent_site && parent_site.legacy_supporter? %>
<p>$<%= Site::LEGACY_SUPPORTER_PRICES[parent_site.values[:plan_type].to_sym] %>/mo</p>
<div class="current-plan">Current Plan</div>
<% else %>
<p>$<%= Site::PLAN_FEATURES[:supporter][:price] %>/mo</p>
<%== plan_pricing_button :supporter %>
<% end %>
</th>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="How much disk space you can use for your site. More space means you can upload more files.">Storage</span>
</td>
<td><%= Site::PLAN_FEATURES[:free][:space].to_bytes_pretty %></td>
<td><%= Site::PLAN_FEATURES[:supporter][:space].to_bytes_pretty %></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="How much content you can serve in one month. Dont worry—these are soft limits. Temporary surges are fine, we won't take your site down automatically, and we're very flexible.">Bandwidth</span>
</td>
<td><%= Site::PLAN_FEATURES[:free][:bandwidth].to_bytes_pretty %></td>
<td>1000 GB</td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="We will never put ads on your site, or give your data to marketers. In fact, were prohibited from doing it in our own Terms of Service.">No advertising, ever</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Our worldwide network of CDN servers cache your web site regionally, making your site load fast—no matter where your users are. 頑張る, 日本!">Global CDN Site Cache</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Each site comes with a free Neocities address (yoursitename.neocities.org).">Free Site Subdomain</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Downloading your neocities site is as easy as clicking a button.">One-Click Backups</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Site tags make it easy to find sites youre interested in, and join communities of sites. Its like a web ring, but even better.">Site Tags</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Each site has its own RSS feed that make it easy to let people know when your site changes.">RSS Feed</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Like a site on Neocities? Now you can follow it, and see when they update!">Follow Your Favorite Sites</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Each site now has its own profile page, allowing users to see when your site updates, follow your site, and leave feedback.">Site Profile</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Our HTML5 site editor makes it easy to make quick changes to your site, even if youre on the run.">Neocities Site Editor</span>
</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
<!--
<tr>
<td class="feature-column">Site Tipping (Coming Soon)</td>
<td><i class="fa fa-check"></i></td>
<td><i class="fa fa-check"></i></td>
</tr>
-->
<tr>
<td class="feature-column">
<span data-original-title="You can mount your Neocities site to your computer as a hard drive, making it easy to update with your favorite HTML editor.">WebDAV Uploading</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Add your domain name (yoursite.com) to your site!">Custom Domains</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Make as many sites as you want with one account, and easily switch between them.">Unlimited Site Creation</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="Upload your SSL certificate for your custom domain name, preventing snoops from seeing your users traffic.">Custom SSL Certs (soon)</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
<tr>
<td class="feature-column">
<span data-original-title="No whitelists—you can upload anything you want (no copyrighted content, trojans, or w4r3z, please).">No File Upload Type Restrictions</span>
</td>
<td></td>
<td><i class="fa fa-check"></i></td>
</tr>
</table>
<%== erb :'plan/_compare', layout: false %>
<% if request.path.match /\/plan/ %>
<div class="row" style="margin-top: 50px; margin-bottom: 0px;">
@ -300,7 +134,7 @@
<strong>It's safe.</strong> We use <a href="https://stripe.com" target="_blank">Stripe</a> for payments, and never store your credit card information directly.
</li>
<li>
<strong>It's affordable.</strong> As low as <strong>$<%= Site::PLAN_FEATURES[:supporter][:price] %>/month</strong> (billed once every year). Higher tiers are optional (and appreciated!)
<strong>It's affordable.</strong> Only $<%= Site::PLAN_FEATURES[:supporter][:price] %> per month.
</li>
<li>
<strong>You can cancel or change plans anytime.</strong> If you do, we'll refund or credit the amount you didn't use.
@ -313,10 +147,6 @@
<script>
$(function() {
$('.feature-column span').tooltip({
placement: 'right'
})
$('.plan-image').tooltip({
placement: 'top'
})

View file

@ -16,10 +16,10 @@
<p>For people that can't use a Credit Card, we support PayPal for supporter upgrades.</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="RVN4HCVY4FT9Y">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="DFQBR5LNS3NW8">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
<h2>The Bitcoin Lifer Plan</h2>

View file

@ -14,6 +14,16 @@
<div class="col col-66" style="min-height: 43em;">
<h2>Latest News</h2>
<div class="press-news">
<h3><a href="http://recode.net/2015/07/17/why-we-all-need-to-make-the-internet-fun-again/"><strong>Re/code</strong>:
Why We All Need to Make the Internet Fun Again</a></h3>
<blockquote>
In a word, the Internet has become boring. When it went mass market in the mid-90s, the Web was promised as a place of open exploration and creativity. Now, instead, it restricts our activity at nearly every turn. This doesnt just constrain us as people, but threatens to impede the very inventiveness that the Internet industry depends on to continue thriving. Whats needed now is an understanding of how we reached this point — and an alternative vision for the Internets next generation.
</blockquote>
<br>
<blockquote>
Fortunately, we are starting to see a strong movement away from the templated, uniform Internet. Instead of defining the limits of their identity and expressiveness through social media, [people] have already turned en masse to indie games like Minecraft (bought by Microsoft for $2.5 billion last year), a free-form, online sandbox world, with building tools that enable them to build everything from massive 3-D cities to working computers and continent-spanning roller coasters. [Neocities], a quasi-rebirth of GeoCities and a vanguard member of the independent Web movement, has seen enormous growth since launching in 2013, with nearly 50,000 websites created by its users.
</blockquote>
<h3><a href="http://www.royalgazette.com/article/20150103/NEWS/150109957"><strong>The Royal Gazette</strong>: Students learn to be junior web wizards</a></h3>
<blockquote>
About 60 students attended the Islands first Hackathon yesterday to learn about computer coding and building their own websites. One of the Hackathon organisers, James Tucker, said: “Some of the students have been able to take what they learned here and move that from the Codecademy site and into a real webpage, so they have now got a presence on the web, which is their own thing that they produced themselves.” The budding programmers were able to get their partial websites online for free, using the free web-hosting system Neocities.

View file

@ -75,4 +75,4 @@ $(document).ready(function() {
return location.hash = $(e.target).attr('href').substr(1);
});
});
</script>
</script>

View file

@ -6,7 +6,7 @@
</p>
<p>
You will have to purchase a domain name from a registrar like <a href="https://www.namecheap.com/?aff=53678" target="_blank">Namecheap</a> first. We are working on providing domain purchasing from Neocities in the future, but in general it is best if you own the domain, because then you control your site.
You will have to purchase a domain name from a registrar like <a href="http://www.namecheap.com/?aff=87835" target="_blank">Namecheap</a> first. We are working on providing domain purchasing from Neocities in the future, but in general it is best if you own the domain, because then you control your site.
</p>
<% if current_site.custom_domain_available? %>
@ -17,7 +17,7 @@
<h3>Step 1</h3>
<p>
First, you need to add an "A record" to point your root domain (catsknitting.com) to the following IP address:
First, you need to add an "A record" to point your root domain (sometimes shown with an @ symbol) (catsknitting.com) to the following IP address:
</p>
<p><code>54.68.34.66</code></p>
@ -81,4 +81,4 @@
</form>
<% end %>
-->
-->

View file

@ -21,6 +21,11 @@
<div class="col col-50 profile-info">
<h2 class="eps title-with-badge"><span><%= site.title %></span> <% if site.supporter? %><a href="/plan" class="supporter-badge" title="Neocities Supporter"></a> <% end %></h2>
<p class="site-url"><a href="<%= site.uri %>"><%= site.host %></a></p>
<!--
<% if site.latest_archive %>
<p><a href="<%= site.latest_archive.url %>" style="margin-right: 5px">IPFS Link</a><small style="font-size: 7pt"><a href="/permanent-web">(what is this?)</a></small></p>
<% end %>
-->
<div class="stats">
<div class="stat"><strong><%= site.views.format_large_number %></strong> <span>view<%= site.views == 1 ? '' : 's' %></span></div>
<% follows_count = site.follows_dataset.count %>
@ -33,6 +38,12 @@
<a href="/dashboard" class="btn-Action edit"><i class="fa fa-edit" title="Edit"></i> Edit Site</a>
<% end %>
<!--
<% if current_site && current_site.id == site.id && site.latest_archive %>
<a href="/site/<%= site.username %>/archives" class="btn-Action edit"><i class="fa fa-history" title="Archives"></i> Archives</a>
<% end %>
-->
<% if current_site && current_site != site %>
<% is_following = current_site.is_following?(site) %>
@ -109,6 +120,7 @@
</strong>
</div>
<div class="stat"><span>Created</span><strong><%= site.created_at.strftime('%b %-d, %Y') %></strong></div>
<a href="/site/<%= site.username %>/stats">Site Traffic Stats</a>
</div>
<%== erb :'_follows', layout: false, locals: {site: site, is_current_site: site == current_site} %>

30
views/site/archives.erb Normal file
View file

@ -0,0 +1,30 @@
<div class="header-Outro">
<div class="row content single-Col">
<h1>Permanent Web Archives</h1>
</div>
</div>
<div class="content single-Col misc-page">
<article role="article">
<% if @archives.length == 0 %>
No archives yet.
<% else %>
<table class="table">
<tr>
<th>IPFS Hash <small style="display: inline"><a href="/permanent-web">(what is this?)</a></small></th>
<th>Archived Time</th>
</tr>
<% @archives.each do |archive| %>
<tr>
<td><a href="<%= archive.url %>"><%= archive.ipfs_hash %></a></td>
<td><%= archive.updated_at.ago.downcase %></td>
</tr>
<% end %>
</table>
<p>
Note: This is a very early preview release of a new technology! We're still figuring things out. We may stop hosting archives without notice. <a href="/permanent-web">Learn how you can host your own copies of these archives</a>.
</p>
<% end %>
</article>
</div>

342
views/site/stats.erb Normal file
View file

@ -0,0 +1,342 @@
<div class="header-Outro with-columns">
<div class="row content">
<div class="col col-100">
<h3>Site Statistics</h3>
<div class="feed-filter">
<% if !@events.empty? && (site.followings_dataset.count > 0) %>
<a href="/" <% if params[:activity].nil? %>class="selected"<% end %>>All</a>
<a href="/?activity=mine" <% if params[:activity] == 'mine' %>class="selected"<% end %>>Profile Activity</a>
<% end %>
</div>
</div>
</div>
</div>
<div class="container news-feed">
<div class="content misc-page columns right-col">
<div class="col-left">
<div class="col col-66">
<!--
<div class="row">
<div class="col col-100 globe">
<div id="earth_div"></div>
</div>
<!--
<div class="col col-50" style="padding-right: 0;">
<table class="table table-striped" id="latest-visitors">
<tbody>
<tr>
<td>
<span class="location">San Francisco, CA</span>
<a class="referrer" href=""><i class="fa fa-link"></i> neocities.org</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Portland, OR</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">London, UK</span>
<a class="referrer" href=""><i class="fa fa-link"></i> Twitter URL</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Hong Kong, China</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">San Francisco, CA</span>
<a class="referrer" href=""><i class="fa fa-link"></i> Facebook URL</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">San Francisco, CA</span>
<a class="referrer" href=""><i class="fa fa-link"></i> neocities.org</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Portland, OR</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">London, UK</span>
<a class="referrer" href=""><i class="fa fa-link"></i> Twitter URL</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Hong Kong, China</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a>, <a href="">/tech</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Hong Kong, China</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a></span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
-->
<h2>Total Visitors <small>last 7 days</small></h2>
<% if current_site && current_site.id == @site.id %>
<% if current_site.supporter? %>
<ul class="nav h-Nav">
<li><a href="?days=30">30 days</a></li>
<li><a href="?days=90">90 days</a></li>
<li><a href="?days=365">1 year</a></li>
<li><a href="?days=sincethebigbang">All time</a></li>
</ul>
<% else %>
<p>(<a href="/plan">Upgrade</a> to see up to see stats for all time)</p>
<% end %>
<% end %>
<canvas id="myChart" style="width:100%;height:300px;display:block"></canvas>
<!--
<div class="row">
<div class="col col-50">
<h2>Top Paths <small>last 7 days</small></h2>
<table class="table table-striped">
<thead>
<tr>
<th>Path</th>
<th>Visits</th>
</tr>
</thead>
<tbody>
<% @stats[:paths].each do |path| %>
<tr>
<td><a href="<%= @site.uri+path.name %>" target="_blank"><%= path.name.gsub(/\?.+/i, '') %></a></td>
<td><%= path.views %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
<div class="col col-50">
<h2>Top Locations <small>last 7 days</small></h2>
<table class="table table-striped">
<thead>
<tr>
<th>City</th>
<th>Visits</th>
</tr>
</thead>
<tbody>
<% @stats[:locations].each do |location| %>
<tr>
<td>
<%= location[:name] %>
</td>
<td><%= location[:views] %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<% if current_site && current_site.id == @site.id %>
<div class="row">
<div class="col col-100">
<h2>Top Referrers</h2>
<table class="table table-striped">
<thead>
<tr>
<th>Referrer</th>
<th>Visits</th>
</tr>
</thead>
<tbody>
<% @stats[:referrers].each do |referrer| %>
<tr>
<td><%= referrer.url %></td>
<td><%= referrer.views %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<% end %>
-->
</div>
<div class="col col-33">
<div class="news-site-info">
<p class="site-url"><a href="<%= @site.uri %>" target="_blank"><%= @site.title %></a></p>
<div class="stats">
<div class="col col-50">
<% if site.updated_at %>
Last updated<br><strong><%= site.updated_at.ago %></strong>
<% else %>
Your new website!<br><strong><a href="/dashboard"><i class="fa fa-edit" title="Edit"></i> Start Building</a></strong>
<% end %>
</div>
<div class="col col-50">
<div><strong><%= site.views.format_large_number %></strong> views</div>
<% follows_count = site.follows_dataset.count %>
<div><strong><%= follows_count.format_large_number %></strong> follower<%= follows_count == 1 ? '' : 's' %></div>
</div>
</div>
</div>
<a href="<%= site.uri %>" class="large-portrait" style="background-image:url(<%= site.screenshot_url('index.html', '540x405') %>);"></a>
<div class="news-profile-button">
<a href="/site/<%= site.username %>" class="btn-Action"><i class="fa fa-user"></i> Profile</a>
</div>
</div>
</div>
</div>
</div>
<!-- <script src="//www.webglearth.com/v2/api.js"></script> -->
<script src="/js/Chart.min.js"></script>
<script>
//OpenGL globe
$(document).ready(function() {
/*
var options = {
sky: true,
atmosphere: false,
dragging: true,
tilting: true,
center: [46.8011, 8.2266],
zoom: 2
}
var earth = new WE.map('earth_div', options)
earth.setView([20, -100], 2.07)
// WE.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{
// attribution: '© OpenStreetMap'
//}).addTo(earth);
WE.tileLayer('http://data.webglearth.com/natural-earth-color/{z}/{x}/{y}.jpg', {
tileSize: 256,
bounds: [[-85, -180], [85, 180]],
minZoom: 0,
maxZoom: 16,
attribution: 'WebGL Earth Tiles',
tms: true
}).addTo(earth)
<% @stats[:locations].each do |location| %>
var marker = WE.marker([<%= location[:latitude] %>, <%= location[:longitude] %>]).addTo(earth);
marker.bindPopup("<b><%= location[:name] %></b><br><%= location[:views] %> views", {maxWidth: 150, closeButton: true})
<% end %>
// Start a simple rotation animation
var before = null
requestAnimationFrame(function animate(now) {
var c = earth.getPosition()
var elapsed = before? now - before: 0
before = now
earth.setCenter([c[0], c[1] + 0.1*(elapsed/30)])
requestAnimationFrame(animate)
});
*/
//chart.js
var data = {
labels: <%== @stats[:stat_days].collect {|s| s.created_at.strftime("%b %-d")}.to_json %>,
datasets: [
{
label: "Hits",
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(220,220,220,1)",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: <%== @stats[:stat_days].collect {|s| s.hits}.to_json %>
},
{
label: "Unique Visits",
fillColor: "rgba(151,187,205,0.2)",
strokeColor: "rgba(151,187,205,1)",
pointColor: "rgba(151,187,205,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(151,187,205,1)",
data: <%== @stats[:stat_days].collect {|s| s.views}.to_json %>
}
]
}
// Get context with jQuery - using jQuery's .get() method.
var ctx = $("#myChart").get(0).getContext("2d")
// This will get the first returned node in the jQuery collection.
//var myNewChart = new Chart(ctx);
var myLineChart = new Chart(ctx).Line(data, {
bezierCurve: false,
multiTooltipTemplate: "<%== @multi_tooltip_template %>"
})
})
</script>

View file

@ -13,6 +13,7 @@
<li>JavaScript (.js, .json, .geojson)</li>
<li>CSS (.css)</li>
<li>Text (.txt, .text, .csv, .tsv)</li>
<li>XML (.xml)</li>
<li>Web Fonts (.eot, .ttf, .woff, .woff2, .svg)</li>
<li>MIDI Files (.mid, .midi)</li>
</ul>

View file

@ -17,11 +17,11 @@
<% end %>
</section>
<section>
<form method="POST" action="/site_files/create_page" enctype="multipart/form-data">
<form method="POST" action="/site_files/create" enctype="multipart/form-data">
<%== csrf_token_input_html %>
<input name="dir" type="hidden" value="<%= params[:dir] %>">
<h2>What's the name of your page?</h2>
<p><input type="text" name="pagefilename" autocapitalize="off" autocorrect="off">.html</p>
<p><input type="text" name="filename" autocapitalize="off" autocorrect="off">.html</p>
<p><input class="btn-Action" type="submit" value="Create Page"></p>
<p>Note: We will automatically scrub any characters not matching: a-z A-Z 0-9 _ - .</p>
@ -29,4 +29,4 @@
<p>If you want to make this the index page (and an index page doesn't exist), name it <strong>index.html</strong>.</p>
</section>
</article>
</div>
</div>

View file

@ -27,7 +27,12 @@
<div class="header-Outro editor">
<div class="row content">
<div class="breadcrumbs">
<a href="/dashboard">Dashboard</a> > <span class="filename"><%= @filename %></span>
<a href="/dashboard">Dashboard</a> >
<span class="filename">
<% dir_array = Pathname(@filename).dirname.to_s.split '/' %>
<% dir_array = [] if dir_array == ['.'] %>
<% dir_array.each_with_index do |dir,i| %><a href="/dashboard?dir=<%= Rack::Utils.escape dir_array[0..i].join('/') %>"><%= dir %></a>/<% end %><%= Pathname(@filename).basename %>
</span>
</div>
<div class="tools">
<div class="theme">
@ -69,9 +74,11 @@
</optgroup>
</select>
</div>
<a id="saveButton" class="btn-Action" href="#" onclick="saveTextFile(false); return false" style="opacity: 0.5"><i class="fa fa-save"></i>Save</a>
<a class="btn-Action" href="//<%= current_site.host %>/<%= @filename %>" target="_blank">View</a>
<a href="#" id="shareButton" class="btn-Action" data-container="body" data-toggle="popover" data-placement="bottom" data-content='<%== erb :'_share', layout: false, locals: {site: current_site, page_uri: "#{current_site.uri}/#{@filename}"} %>'>Share</a>
<a id="saveButton" class="btn-Action" href="#" onclick="saveTextFile(false); return false" style="opacity: 0.5"><span class="hide-on-mobile"><i class="fa fa-save"></i></span>Save</a>
<span class="hide-on-mobile">
<a class="btn-Action" href="<%= current_site.uri %>/<%= @filename %>" target="_blank">View</a>
<a href="#" id="shareButton" class="btn-Action" data-container="body" data-toggle="popover" data-placement="bottom" data-content='<%== erb :'_share', layout: false, locals: {site: current_site, page_uri: "#{current_site.uri}/#{@filename}"} %>'>Share</a>
</span>
<!-- <a id="saveAndExitButton" class="btn-Action" href="#" onclick="saveTextFile(true); return false" style="opacity: 0.5"><i class="fa fa-save"></i>&nbsp;&nbsp;Save and Exit</a> -->
<div id="editorUpdates" class="tooltip fade bottom in hidden" style="top: 90px;right: 12.5em;">
<div class="tooltip-arrow"></div>
@ -85,8 +92,7 @@
<div class="row editor">
<div class="col col-100">
<div id="editor"><%==encoding_fix(@file_data) %>
</div>
<div id="editor"><%==encoding_fix(@file_data) %></div>
</div>
</div>

View file

@ -6,7 +6,7 @@
<div class="content single-Col misc-page">
<article>
<h2>Why our finances are open</h2>
<h2>Why our growth statistics and finances are open</h2>
<p>
Neocities is an <a href="http://www.opencompany.org">Open Company</a> startup, and are committed to openness as a defining element in how we create value.
@ -17,11 +17,11 @@
</p>
<p>
Despite this, most companies today still treat their backend infrastructure and business finances as proprietary. The result is an erosion of user trust, where users become dependant on proprietary services that have bugs they can't help fix, financial sustainability problems they can't discover, and limitations they can't understand. We believe this is the biggest problem facing startups today.
Despite this, most companies today still treat their backend infrastructure and business operations as proprietary. The result is an erosion of user trust, where users become dependant on proprietary services that have bugs they can't help fix, financial sustainability problems they can't discover, and limitations they can't understand. We believe this is the biggest problem facing startups today.
</p>
<p>
We do not feel that opening of our finances is as risky as is currently believed, and that the increased trust we gain from doing it more than makes up for the risk. So we have decided to open our finances.
We do not feel that opening of our finances is as risky as is currently believed, and that the increased trust we gain from doing it more than makes up for the risk. So we have decided to open our growth statistics and finances.
</p>
<p>
@ -29,7 +29,7 @@
</p>
<p>
Note that we do not disclose everything publicly. For example, we do not reveal the locations of our servers, the identities of our users, investors (if they choose to be anonymous) or any salaries or dividends we choose to issue. There are very legitimate security and privacy considerations to consider when providing open data, and we understand and respect that.
Note that we do not disclose everything publicly. For example, we do not currently reveal the locations of our servers, the identities of our users, investors (if they choose to be anonymous) or any salaries or dividends (in our case, member ownership percentages) we choose to issue. There are very legitimate security and privacy considerations to consider when providing open data, and we understand and respect that.
</p>
<p>
@ -40,7 +40,15 @@
<table class="table">
<tr>
<td>Total Sites</td>
<td><strong>Total Hits</strong> (sites hosted on Neocities)</td>
<td><%= @stats[:total_hosted_site_hits].to_comma_separated %></td>
</tr>
<tr>
<td><strong>Total Views</strong> (sites hosted on Neocities)</td>
<td><%= @stats[:total_hosted_site_views].to_comma_separated %></td>
</tr>
<tr>
<td><strong>Total Sites</strong></td>
<td><%= @stats[:total_sites] %></td>
</tr>
<tr>

342
views/stats_mockup.erb Normal file
View file

@ -0,0 +1,342 @@
<div class="header-Outro with-columns">
<div class="row content">
<div class="col col-66">
<h3>Your Stats</h3>
<div class="feed-filter">
<% if !@events.empty? && (site.followings_dataset.count > 0) %>
<a href="/" <% if params[:activity].nil? %>class="selected"<% end %>>All</a>
<a href="/?activity=mine" <% if params[:activity] == 'mine' %>class="selected"<% end %>>Profile Activity</a>
<% end %>
<a href="/activity">Global Activity</a>
</div>
</div>
<div class="col col-32">
<h3>Your Site</h3>
<a href="/dashboard" class="btn-Action edit"><i class="fa fa-edit" title="Edit"></i>Edit Site</a>
</div>
</div>
</div>
<div class="container news-feed">
<div class="content misc-page columns right-col">
<div class="col-left">
<div class="col col-66">
<div class="row">
<div class="col col-50 globe">
<h2>Latest Visitors</h2>
<div id="earth_div"></div>
</div>
<div class="col col-50" style="padding-right: 0;">
<table class="table table-striped" id="latest-visitors">
<tbody>
<tr>
<td>
<span class="location">San Francisco, CA</span>
<a class="referrer" href=""><i class="fa fa-link"></i> neocities.org</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Portland, OR</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">London, UK</span>
<a class="referrer" href=""><i class="fa fa-link"></i> Twitter URL</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Hong Kong, China</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">San Francisco, CA</span>
<a class="referrer" href=""><i class="fa fa-link"></i> Facebook URL</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">San Francisco, CA</span>
<a class="referrer" href=""><i class="fa fa-link"></i> neocities.org</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Portland, OR</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">London, UK</span>
<a class="referrer" href=""><i class="fa fa-link"></i> Twitter URL</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Hong Kong, China</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a>, <a href="">/tech</a>, <a href="">/about</a></span>
</td>
</tr>
<tr>
<td>
<span class="location">Hong Kong, China</span>
<a class="referrer" href=""><i class="fa fa-search"></i> Google search</a>
</td>
<td>
<span class="time">7:11PM - 4/27/15</span>
<span class="paths"><a href="">/index</a>, <a href="">/links</a>, <a href="">/art</a>, <a href="">/music</a></span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<h2>Last 7 Days</h2>
<p>(<a href="/plan">Upgrade</a> to see up to see stats for all time)</p>
<ul class="nav h-Nav">
<li><a href="">Month</a></li>
<li><a href="">3 months</a></li>
<li><a href="">1 Year</a></li>
<li><a href="">All time</a></li>
</ul>
<canvas id="myChart" style="width:100%;height:300px;display:block"></canvas>
<div class="row">
<div class="col col-50">
<h2>Top Paths</h2>
<table class="table table-striped">
<thead>
<tr>
<th>Path</th>
<th>Visits</th>
</tr>
</thead>
<tbody>
<tr>
<td>/</td>
<td>130</td>
</tr>
<tr>
<td>/contact</td>
<td>110</td>
</tr>
<tr>
<td>/art</td>
<td>101</td>
</tr>
<tr>
<td>/about</td>
<td>99</td>
</tr>
<tr>
<td>/links</td>
<td>33</td>
</tr>
</tbody>
</table>
<h2>Top Locations</h2>
<table class="table table-striped">
<thead>
<tr>
<th>City</th>
<th>Visits</th>
</tr>
</thead>
<tbody>
<tr>
<td>Portland, OR, USA</td>
<td>22</td>
</tr>
<tr>
<td>Portland, OR, USA</td>
<td>22</td>
</tr>
<tr>
<td>Portland, OR, USA</td>
<td>22</td>
</tr>
<tr>
<td>Portland, OR, USA</td>
<td>22</td>
</tr>
<tr>
<td>Portland, OR, USA</td>
<td>22</td>
</tr>
</tbody>
</table>
</div>
<div class="col col-50">
<h2>Top Referrers</h2>
<table class="table table-striped">
<thead>
<tr>
<th>Referrer</th>
<th>Visits</th>
</tr>
</thead>
<tbody>
<tr>
<td>Google search</td>
<td>22</td>
</tr>
<tr>
<td>Google search</td>
<td>22</td>
</tr>
<tr>
<td>Google search</td>
<td>22</td>
</tr>
<tr>
<td>Google search</td>
<td>22</td>
</tr>
<tr>
<td>Google search</td>
<td>22</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col col-33">
<div class="news-site-info">
<p class="site-url"><a href="<%= current_site.uri %>" target="_blank"><%= site.title %></a></p>
<div class="stats">
<div class="col col-50">
<% if site.updated_at %>
Last updated<br><strong><%= site.updated_at.ago %></strong>
<% else %>
Your new website!<br><strong><a href="/dashboard"><i class="fa fa-edit" title="Edit"></i> Start Building</a></strong>
<% end %>
</div>
<div class="col col-50">
<div><strong><%= site.views.format_large_number %></strong> views</div>
<% follows_count = site.follows_dataset.count %>
<div><strong><%= follows_count.format_large_number %></strong> follower<%= follows_count == 1 ? '' : 's' %></div>
</div>
</div>
</div>
<a href="<%= site.uri %>" class="large-portrait" style="background-image:url(<%= site.screenshot_url('index.html', '540x405') %>);"></a>
<div class="news-profile-button">
<a href="/site/<%= site.username %>" class="btn-Action"><i class="fa fa-user"></i> Profile</a>
<a href="#" id="shareButton" class="btn-Action" data-container="body" data-toggle="popover" data-placement="bottom" data-content='<%== erb :'_share', layout: false, locals: {site: current_site} %>'><i class="fa fa-share-alt"></i> Share</a>
</div>
<%== erb :'_follows', layout: false, locals: {site: site, is_current_site: site == current_site} %>
<%== erb :'_tags', layout: false, locals: {site: site, is_current_site: site == current_site} %>
</div>
</div>
</div>
</div>
<script src="http://www.webglearth.com/v2/api.js"></script>
<script src="/js/Chart.min.js"></script>
<script>
//OpenGL globe
$(document).ready(function() {
var earth = new WE.map('earth_div');
earth.setView([20, -100], 2.07);
WE.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{
attribution: '© OpenStreetMap'
}).addTo(earth);
// Start a simple rotation animation
var before = null;
requestAnimationFrame(function animate(now) {
var c = earth.getPosition();
var elapsed = before? now - before: 0;
before = now;
earth.setCenter([c[0], c[1] + 0.1*(elapsed/30)]);
requestAnimationFrame(animate);
});
//chart.js
var data = {
labels: ["May 1", "May 2", "May 3", "May 4", "May 5", "May 6", "May7"],
datasets: [
{
label: "Hits",
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(220,220,220,1)",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: [65, 59, 80, 81, 56, 55, 65]
},
{
label: "Visits",
fillColor: "rgba(151,187,205,0.2)",
strokeColor: "rgba(151,187,205,1)",
pointColor: "rgba(151,187,205,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(151,187,205,1)",
data: [28, 48, 40, 66, 33, 27, 45]
}
]
};
// Get context with jQuery - using jQuery's .get() method.
var ctx = $("#myChart").get(0).getContext("2d");
// This will get the first returned node in the jQuery collection.
//var myNewChart = new Chart(ctx);
var myLineChart = new Chart(ctx).Line(data, {bezierCurve: false});
})
</script>

View file

@ -2,11 +2,7 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<% if @title %>
<title><%= @title %> - Neocities</title>
<% else %>
<title>Neocities</title>
<% end %>
<title><%= title %></title>
<link href="/css/font-awesome.css" rel="stylesheet">
<link href="/css/bootstrap.min.css" rel="stylesheet">
<style>

View file

@ -2,9 +2,9 @@ Hello,
We're writing to let you know that Neocities has had an issue charging your card. We will try again automatically in a few days, but we just wanted to give you a heads up in case something is wrong with your card.
We will retry over the next few weeks. If we can't make a successful charge, your account will be downgraded from supporter to the free plan.
We will retry over the next few weeks. If we can't make a successful charge, we will automatically switch your account over to the free plan.
If you need to change the card on file, you can do so on the settings page. If you run into any issues, please contact us at https://neocities.org/contact.
If you need to change the card on file, you can do so on your account settings page. If you run into any issues, please contact us at https://neocities.org/contact.
Regards,
- The Neocities Team

View file

@ -1,12 +1,28 @@
<%= request.request_method %> <%= request.path %>
#### Route
<%== request.request_method %> <%== request.path %>
<% if current_site %>
Site: <%= current_site.username %>
Email: <%= current_site.email %>
#### Site
<%== current_site.username %>
<% if current_site.email %>
Email: <%== current_site.email %>
<% else %>
User does not have an email address.
<% end %>
<% else %>
Not a logged in session.
<% end %>
Params:
<%= params.inspect %>
#### Params
<%== params.inspect %>
Backtrace:
<%= env['sinatra.error'].backtrace.join("\n") %>
#### Session
<%== session.inspect %>
#### HTTP REFERRER
<%== request.referrer %>
#### Backtrace
<%== env['sinatra.error'].backtrace.join("\n") %>

View file

@ -243,10 +243,16 @@
Using the Services for any activity that adversely affects the ability of other people or systems to use Neocities. This includes "denial of service" (DoS) attacks against another network host or individual user. Interference with or disruption of other network users, network services, websites or network equipment is prohibited. A User may not, through action or inaction, allow others to use their account for access for illegal or inappropriate actions. A User may not permit their account, through action or inaction, to be configured in such a way that gives a third party the capability to use their account in an illegal or inappropriate manner.
</p>
<p>
<strong>Auto-generating sites from pre-fabricated templates for other people</strong>
<br>
Using the Neocities API to generate a Neocities site for other people from a different web service is prohibited without our consent, unless that generating service is being completely operated by the owner of the web site on Neocities. This does not apply to any services providing HTML editing capabilities that use Neocities to save web sites edited by the user. This policy is in place due to third party services using Neocities to create SEO spam for their services. We can make exceptions to this, please contact us if you believe you have a legitimate use case.
</p>
<p>
<strong>ENFORCEMENT</strong>
<br>
Neocities' reserves the right to suspend, block or cancel access to any and all Services when, in our judgment and sole discretion, an account may have violated this AUP. Neocities, by way of example and not limitation, may take any one or more of the following actions in response to complaints of conduct that amounts to a violation of this AUP:
Neocities' reserves the right to suspend, block or cancel access to any and all Services when, in our judgment and sole discretion, an account may have violated this AUP. Neocities, by way of example and not limitation, may take any one or more of the following actions in response to complaints of conduct that amounts to a violation of this AUP:
<ul>
<li>Suspension of account, or blocking of access to Neocities services.</li>
@ -320,4 +326,4 @@
<p>
Please contact the Designated Agent to Receive Notification of Claimed Infringement for Company at https://neocities.org/contact.
</p>
</div>
</div>

View file

@ -1,13 +1,15 @@
<section class="section plans welcome">
<h2>Welcome to Neocities, <%= current_site.username %>!</h2>
<h3 class="subtitle">Free accounts will always be free and ad-free.
You can support our quest to bring back the creative, independent web by upgrading to the Supporter&nbsp;Plan.</h3>
<h3 class="subtitle">
<strong>Neocities will never put advertising on your site.</strong> Instead, Neocities is powered by <strong>you</strong>.
Help us bring back creative personal websites by becoming a supporter.
</h3>
<div class="plan-overview">
<div class="col free">
<div class="row content">
<div class="col col-100">
<h3>Free Plan</h3>
<h3>Free</h3>
<div class="plan-image free">
</div>
<div class="price">$<%= Site::PLAN_FEATURES[:free][:price] %></div>
@ -27,7 +29,7 @@ You can support our quest to bring back the creative, independent web by upgradi
<div class="col supporter">
<div class="row content">
<div class="col col-33">
<h3>Supporter Plan</h3>
<h3>Supporter</h3>
<div class="plan-image supporter">
</div>
<% if parent_site && parent_site.legacy_supporter? %>
@ -39,8 +41,8 @@ You can support our quest to bring back the creative, independent web by upgradi
<% end %>
<ul class="main-features">
<li><strong><%= Site::PLAN_FEATURES[:supporter][:space].to_space_pretty %></strong> <span data-original-title="How much disk space you can use for your site. More space means you can upload more files.">storage</span></li>
<li><strong>1000 GB</strong> <span data-original-title="How much content you can serve in one month. Dont worry—these are soft limits. Temporary surges are fine, we won't take your site down automatically, and were very flexible.">bandwidth</span></li>
<li><strong><%= (Site::PLAN_FEATURES[:supporter][:space] / (10**6)).to_comma_separated %> MB</strong> <span data-original-title="How much disk space you can use for your site. More space means you can upload more files.">storage</span></li>
<li><strong><%= Site::PLAN_FEATURES[:supporter][:bandwidth].to_bytes_pretty %></strong> <span data-original-title="How much content you can serve in one month. Dont worry—these are soft limits. Temporary surges are fine, we won't take your site down automatically, and were very flexible.">bandwidth</span></li>
</ul>
<ul>
@ -52,7 +54,7 @@ You can support our quest to bring back the creative, independent web by upgradi
</div>
<div class="col col-66">
<p class="instructions">To upgrade, enter your credit card info below:</p>
<p class="instructions">Just enter your card info, and you're done:</p>
<div>
<div id="plan_error" class="alert alert-block alert-error" style="display:none"></div>
<form id="upgradeForm" method="POST" action="/plan/update">
@ -130,6 +132,12 @@ You can support our quest to bring back the creative, independent web by upgradi
</div>
</div>
</section>
<section class="section" style="padding-top: 0;">
<%== erb :'plan/_compare', layout: false %>
</section>
<%== erb :'plan/_signupcode', layout: false %>
<script>
$(function() {