landing: Add /plans/ describing ways to use Zulip.

Note from tabbott: This isn't yet linked to and will need to go
through significantly more iteration, but it's a start.
This commit is contained in:
Brock Whittaker
2017-05-15 11:42:04 -07:00
committed by Tim Abbott
parent f552c2fc2b
commit 2140a4aa01
8 changed files with 660 additions and 28 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -912,7 +912,7 @@ nav ul li.active::after {
} }
.compare tbody tr { .compare tbody tr {
border-bottom: 1px solid hsl(163, 22%, 28%); border-bottom: 1px solid hsla(360, 0%, 100%, 0.03);
} }
.compare tbody tr td { .compare tbody tr td {
@@ -942,8 +942,10 @@ nav ul li.active::after {
top: 3px; top: 3px;
font-size: 2.5rem; font-size: 2.5rem;
font-weight: 300; font-weight: 500;
line-height: 0.9; line-height: 0.9;
opacity: 0.4;
} }
.compare tbody tr td a { .compare tbody tr td a {
@@ -966,6 +968,82 @@ nav ul li.active::after {
color: hsla(0, 0%, 100%, 0.8); color: hsla(0, 0%, 100%, 0.8);
} }
/* -- faq css -- */
.faqs {
position: relative;
background-color: #fafafa;
}
.faqs .padded-content {
position: relative;
z-index: 1;
}
.faqs header {
width: 800px;
margin: 0 auto;
}
.faqs header h1 span {
vertical-align: top;
}
.faqs .faq {
margin: 50px auto;
width: 800px;
font-size: 1.3em;
}
/* the last faq in the box shouldn't have an extra 50px of margin. */
.faqs .faq-box div:last-of-type {
margin-bottom: 10px;
}
.faqs .faq .question {
font-weight: 600;
}
.faqs .faq .question::before {
content: "?";
position: relative;
display: inline-block;
vertical-align: top;
top: -1px;
padding: 0px 10px;
margin-right: 10px;
text-shadow:
0px 0px 3px rgba(255,255,255,0.5),
-0.5px 0.5px 0px rgba(48, 166, 146, 0.02),
-1px 1px 0px rgba(48, 166, 146, 0.02),
-1.5px 1.5px 0px rgba(48, 166, 146, 0.02),
-2px 2px 0px rgba(48, 166, 146, 0.02),
-2.5px 2.5px 0px rgba(48, 166, 146, 0.02),
-3px 3px 0px rgba(48, 166, 146, 0.02),
-3.5px 3.5px 0px rgba(48, 166, 146, 0.02),
-4px 4px 0px rgba(48, 166, 146, 0.02),
-4.5px 4.5px 0px rgba(48, 166, 146, 0.02),
-5px 5px 0px rgba(48, 166, 146, 0.02),
-5.5px 5.5px 0px rgba(48, 166, 146, 0.02),
-6px 6px 0px rgba(48, 166, 146, 0.02),
-6.5px 6.5px 0px rgba(48, 166, 146, 0.02),
-7px 7px 0px rgba(48, 166, 146, 0.02),
-7.5px 7.5px 0px rgba(48, 166, 146, 0.02),
-8px 8px 0px rgba(48, 166, 146, 0.02);
color: #4fc0ad;
border-radius: 50%;
overflow: hidden;
}
.faqs .faq .answer {
margin: 20px 0px 0px 45px;
}
.screen .line { .screen .line {
width: 100%; width: 100%;
height: 6px; height: 6px;
@@ -2175,6 +2253,319 @@ nav ul li.active::after {
background: linear-gradient(0deg, #fff 0%, transparent 40%); background: linear-gradient(0deg, #fff 0%, transparent 40%);
} }
/* -- pricing css -- */
.portico-landing.plans .main {
width: 100%;
}
.portico-landing.plans .main .padded-content > h1 {
text-align: center;
font-size: 2.5em;
margin: 0px;
color: #fff;
}
.portico-landing.plans .main .padded-content > h2 {
color: #444;
text-align: center;
font-size: 1.5em;
margin-bottom: 50px;
color: #fff;
}
.pricing-model .pricing-container {
text-align: center;
}
.pricing-model .pricing-container .block {
display: inline-block;
margin: 0px 20px;
}
.pricing-model .pricing-container .block .plan-title {
padding: 10px;
margin-bottom: 3px;
color: #fff;
font-size: 2em;
font-weight: 300;
}
.pricing-model .pricing-container .price-box {
position: relative;
display: inline-block;
vertical-align: bottom;
margin: 0px;
width: 300px;
height: 500px;
box-shadow: 0px 0px 10px rgba(0,0,0,0.1);
text-align: left;
background-color: #fff;
transition-property: all;
transition-duration: 0.3s;
transition-timing-function: ease;
}
.pricing-model .pricing-container .block > div:not(.plan-title):hover {
box-shadow: 0px 0px 50px rgba(0,0,0,0.2);
z-index: 2;
transform: scale(1.03);
}
.pricing-model .pricing-container .text-content {
margin: 20px;
}
.pricing-model .padded-content .text-header .text-content h1 {
margin-top: 0px;
}
.pricing-model .pricing-container .text-content h2 {
font-size: 1.5em;
font-weight: 400;
margin-bottom: 0px;
text-align: left;
}
.pricing-model .pricing-container hr {
border: none;
border-bottom: 2px solid #4fc0ad;
margin: 15px 0px 15px 0px;
}
.pricing-model .pricing-container .text-content .description {
font-size: 0.9em;
font-weight: 400;
color: #888;
}
.pricing-model .pricing-container ul.feature-list {
list-style: none;
padding: 0px;
margin: 0px;
}
.pricing-model .pricing-container ul.feature-list li {
position: relative;
padding: 10px 0px 10px 25px;
font-size: 0.9em;
font-weight: 500;
}
.pricing-model .pricing-container ul.feature-list li::before {
content: " ";
position: absolute;
top: 10px;
left: 0;
width: 20px;
height: 18px;
background-image: url(/static/images/checkbox-green.png);
background-size: 100% auto;
-webkit-filter: invert(0.3);
}
.pricing-model .pricing-container .bottom {
position: absolute;
bottom: 0px;
width: 100%;
height: 150px;
background-color: #eee;
}
.pricing-model .pricing-container .text-content .price::before {
content: "$";
position: relative;
vertical-align: top;
top: 3px;
left: -3px;
font-size: 2rem;
font-weight: 300;
color: #888;
}
.pricing-model .pricing-container .text-content .price {
display: inline-block;
margin-right: 15px;
font-size: 3.5em;
font-weight: 600;
line-height: 0.8;
}
.pricing-model .pricing-container .text-content .price .cents {
display: inline-block;
vertical-align: top;
height: 18px;
font-size: 1.3rem;
font-weight: 300;
border-bottom: 1px solid #666;
}
.pricing-model .pricing-container .bottom .details {
display: inline-block;
vertical-align: top;
margin-left: 15px;
margin-top: 4px;
font-size: 0.9em;
font-weight: 400;
color: #888;
text-align: left;
}
.pricing-model .pricing-container .bottom button {
margin-top: 20px;
width: 100%;
font-size: 0.9em;
}
.pricing-model .pricing-container .price-box:focus {
outline: none;
}
.pricing-model .pricing-container .price-box:focus button {
box-shadow: 0px 0px 25px #6acab9;
animation: box-shadow-pulse 2s infinite;
}
/* while the overlay is showing, the transform properties should stay fixed
for the container that sits inline in the page. */
.pricing-overlay.pricing-model {
position: fixed;
top: -140px;
left: 0px;
width: 100vw;
height: 100vh;
opacity: 0;
pointer-events: none;
z-index: 10;
transition: all 0.3s ease;
}
.portico-landing.plans .pricing-overlay.pricing-model {
top: -220px;
}
.pricing-overlay.pricing-model .pricing-container {
padding: 50px;
text-align: left;
}
.pricing-overlay.pricing-model.active {
opacity: 1;
pointer-events: all;
background-color: rgba(0,0,0,0.6);
}
.pricing-overlay.pricing-model .price-box {
vertical-align: top;
}
.pricing-overlay.pricing-model .info-box {
position: relative;
display: inline-block;
vertical-align: top;
margin-left: 50px;
margin-top: -2px;
width: calc(100% - 300px - 50px);
background: #fff;
opacity: 0;
transform: translateY(300px);
transition: all 0.3s ease;
}
.pricing-overlay.pricing-model .info-box.show {
opacity: 1;
transform: translateY(0);
}
.pricing-overlay.pricing-model .info-box .text-content {
position: relative;
display: inline-block;
height: calc(100% - 40px);
width: calc(100% - 300px - 40px);
}
.pricing-overlay.pricing-model .info-box .text-content h1 {
margin-top: 0px;
}
.pricing-overlay.pricing-model .info-box .text-content p {
color: #888;
}
.pricing-overlay.pricing-model .info-box .text-content .feature-detail-box {
position: absolute;
width: 100%;
bottom: 0px;
text-align: center;
}
.pricing-overlay.pricing-model .info-box .text-content .feature-detail-box .feature {
display: inline-block;
width: calc(33% - 21px);
height: 200px;
background-color: #eee;
margin: 10px;
}
.text-content .pricing-details {
padding: 15px 0px 15px 0px;
height: 17px;
font-weight: 400;
color: #888;
font-style: italic;
text-align: center;
}
.pricing-overlay.pricing-model .info-box .image {
width: 300px;
height: 100%;
float: right;
background-color: #3ca08d;
}
@keyframes box-shadow-pulse {
0% {
box-shadow: 0px 0px 0px rgba(106, 201, 185, 0);
}
50% {
box-shadow: 0px 0px 25px rgba(106, 201, 185, 0.8);
}
100% {
box-shadow: 0px 0px 0px rgba(106, 201, 185, 0);
}
}
/* -- media queries -- */ /* -- media queries -- */
@media (max-width: 1426px) { @media (max-width: 1426px) {
.portico-landing.hello .integrations .integration-icons .hide-1 { .portico-landing.hello .integrations .integration-icons .hide-1 {
@@ -2190,7 +2581,12 @@ nav ul li.active::after {
} }
} }
@media (max-width: 1368px) { @media (max-width: 1376px) {
.portico-landing.plans .price-box {
height: 500px !important;
margin: 20px;
}
.portico-landing.apps .main .details-container { .portico-landing.apps .main .details-container {
height: auto; height: auto;
} }

View File

@@ -2,7 +2,7 @@
<div class="padded-content"> <div class="padded-content">
<div class="text-header"> <div class="text-header">
<div class="text-content"> <div class="text-content">
<h1>Compare</h1> <h1><span>Compare</span></h1>
</div> </div>
</div> </div>
@@ -32,17 +32,17 @@
<td class="yes"></td> <td class="yes"></td>
</tr> </tr>
<tr> <tr>
<td>Convenient SaaS offering</td> <td>Hosting available</td>
<td class="yes"></td> <td class="yes"></td>
<td class="yes"></td> <td class="yes"></td>
<td class="no"></td> <td class="no"></td>
<td class="yes"></td> <td class="yes"></td>
</tr> </tr>
<tr> <tr>
<td>Gmail-style threading</td> <td>Emoji reactions</td>
<td class="yes"></td>
<td class="yes"></td>
<td class="yes"></td> <td class="yes"></td>
<td class="no"></td>
<td class="no"></td>
<td class="no"></td> <td class="no"></td>
</tr> </tr>
<tr> <tr>
@@ -53,18 +53,18 @@
<td class="no"></td> <td class="no"></td>
</tr> </tr>
<tr> <tr>
<td>Lightning-fast search</td> <td>Topic-based threading</td>
<td class="yes"></td> <td class="yes"></td>
<td class="no"></td> <td class="no"></td>
<td class="no"></td> <td class="no"></td>
<td class="no"></td> <td class="no"></td>
</tr> </tr>
<tr> <tr>
<td>Emoji reactions</td> <td>Lightning-fast search</td>
<td class="yes"></td>
<td class="yes"></td>
<td class="yes"></td> <td class="yes"></td>
<td class="no"></td> <td class="no"></td>
<td class="no"></td>
<td class="no"></td>
</tr> </tr>
<tr> <tr>
<td>Free and open source</td> <td>Free and open source</td>
@@ -73,26 +73,21 @@
<td>See below*</td> <td>See below*</td>
<td class="no"></td> <td class="no"></td>
</tr> </tr>
<tr>
<td>Actually increases productivity :)</td>
<td class="yes"></td>
<td class="no"></td>
<td class="no"></td>
<td class="no"></td>
</tr>
</tbody> </tbody>
</table> </table>
<p class="terms"> <p class="terms">
<span class="term"> <span class="term">
* On Mattermost's licensing: The components of Mattermost * On Mattermost's licensing: The components of
are, technically, released under open source licenses. Mattermost are, technically, released under various
However, Mattermost was founded by an ex-Microsoft team, open source licenses.
is developed primarily by paid employees, and their However, <a href="https://www.mattermost.org/licensing/">Mattermost's
licensing and trademark policies do not allow third licensing and trademark policy</a> forbids
parties to distribute patched Mattermost servers without redistributing patched versions of Mattermost without
renaming the project in their fork. In contrast, Zulip is renaming the project, which does not comply with the
a true open source project with a wide development <a href="https://www.debian.org/social_contract.html#guidelines">Debian
community and a clean Apache 2.0 license. Free Software Guidelines</a>. This means, for
example, that Debian will never be able to include a
Mattermost server package.
</span> </span>
</p> </p>
</div> </div>

77
templates/zerver/faq.html Normal file
View File

@@ -0,0 +1,77 @@
<div class="faqs">
<div class="padded-content">
<header>
<h1>Frequently asked questions</h1>
</header>
<div class="faq-box">
<div class="faq">
<div class="question">
Does Zulip scale to a large number of users?
</div>
<div class="answer">
Yes! Zulip's unique threading is amazing for
large, busy communities. Some of our biggest fans
are organizations use Zulip with hundreds or
thousands of users, including Fortune 500
companies like Akamai and open source communities
like <a href="https://www.recurse.com/blog/112-how-rc-uses-zulip">The
Recurse Center</a>. If you'd like to see what
Zulip looks like in action in a larger community,
our
own <a href="https://zulip.readthedocs.io/en/latest/chat-zulip-org.html">Zulip
development community</a> is open to the public
and has several thousand user accounts and
hundreds of weekly active users.
</div>
</div>
<div class="faq">
<div class="question">
If I start out on the Zulip hosted cloud service,
and a few years down the line want to move to
running my own server, can I later export my data?
</div>
<div class="answer">
Yes! Zulip supports exporting your organization's
data and then importing it into another Zulip
server.
</div>
</div>
<div class="faq">
<div class="question">
Can I use your free hosting service just to hang
out with a few dozen of my friends?
</div>
<div class="answer">
Yes! Our "non-commercial use with less than 100
users" offering is for you in addition to
non-profits and other worthy causes!
</div>
</div>
<div class="faq">
<div class="question">
My organization isn't obviously eligible for your
free hosting plan, but we have a lot of
non-employee users and can't afford to pay for all
of them. Do you offer discounts for this sort of
situation?
</div>
<div class="answer">
Yes! Our pricing is designed to be affordable for
companies that are paying their users a salary.
If your organization is an educational institution
or otherwise has a lot of participants who you
aren't paying a salary, we can likely offer your
organization free or highly discounted
hosting. <a href="mailto:support@zulipchat.com"
target="_blank">Contact us</a> with your
organization's story and we'd be happy to discuss.
You may also be interested in our resources on
<a href="/for/open-source">Zulip for open source
projects</a>
and <a href="/for/working-groups-and-communities">Zulip
for part-time communities</a>.
</div>
</div>
</div>
</div>
</div>

162
templates/zerver/plans.html Normal file
View File

@@ -0,0 +1,162 @@
{% extends "zerver/portico.html" %}
{% block customhead %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% stylesheet 'portico' %}
{% stylesheet 'landing-page' %}
{{ render_bundle('landing-page') }}
{% endblock %}
{% block portico_content %}
{% include 'zerver/gradients.html' %}
{% include 'zerver/landing_nav.html' %}
<div class="portico-landing plans">
<div class="main">
<div class="pricing-model">
<div class="padded-content">
<h1>Get started using Zulip today!</h1>
<div class="pricing-container">
<div class="block">
<div class="plan-title">
Run your own server
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Community support</h2>
<div class="description">
Install your own Zulip server
</div>
<hr />
<ul class="feature-list">
<li>Easy self-service installation</li>
<li>Free and open source forever under Apache 2.0 license</li>
<li><a href="/features">All Zulip features</a> included</li>
<li>LDAP/Active directory integration</li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="pricing-details">
Free and open source forever!
</div>
<a href="https://zulip.readthedocs.io/en/latest/prod.html" class="no-style">
<button class="green" type="button">
Install a Zulip server!
</button>
</a>
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Commercial support</h2>
<div class="description">
For mission-critical installations
</div>
<hr />
<ul class="feature-list">
<li>Easy self-service installation</li>
<li>Support response SLAs</li>
<li>Input into the Zulip roadmap</li>
<li>High availability assistance</li>
<li>Anything else you need</li>
<li>Funds the Zulip open source project</li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="pricing-details">
Pricing varies with support
required.
</div>
<a href="mailto:sales@zulipchat.com" target="_blank" class="no-style">
<button class="green" type="button" name="button">Contact sales!</button>
</a>
</div>
</div>
</div>
</div>
<div class="block">
<div class="plan-title">
Use our servers
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Free hosting</h2>
<div class="description">
For organizations without a big budget
</div>
<hr />
<p>Our hosted service is free for:</p>
<ul class="feature-list">
<li><a href="/for/open-source">Open source communities</a></li>
<li>Unlimited evaluation for
commercial or non-commercial use</li>
<li>Non-commercial use for up to
100 users</li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="pricing-details">
Free!
</div>
<a href="/create_realm/" class="no-style">
<button class="green" type="button">
Sign up now!
</button>
</a>
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Commercial hosting</h2>
<div class="description">
For corporate users
</div>
<hr />
<ul class="feature-list">
<li>Convenient web service</li>
<li>No sysadmin work required</li>
<li>Priority commerical support</li>
<li>Funds the Zulip open source project</li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="">
<div class="price">7<span class="cents">00</span></div>
<div class="details">
per user per month
<br />
$8.00 billed monthly
</div>
</div>
<a href="/create_realm/" class="no-style">
<button class="green" type="button">
Sign up now!
</button>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include "zerver/faq.html" %}
{% include "zerver/compare.html" %}
</div>
{% endblock %}

View File

@@ -61,6 +61,7 @@ class DocPageTest(ZulipTestCase):
self._test('/for/open-source/', 'for open source projects') self._test('/for/open-source/', 'for open source projects')
self._test('/for/companies/', 'in a company') self._test('/for/companies/', 'in a company')
self._test('/for/working-groups-and-communities/', 'standards bodies') self._test('/for/working-groups-and-communities/', 'standards bodies')
self._test('/plans/', 'Commercial support')
self._test('/integrations/', self._test('/integrations/',
'Over 60 native integrations.', 'Over 60 native integrations.',
extra_strings=[ extra_strings=[

View File

@@ -146,6 +146,7 @@ i18n_urls = [
url(r'^integrations/(.*)', IntegrationView.as_view()), url(r'^integrations/(.*)', IntegrationView.as_view()),
url(r'^about/$', zerver.views.users.about_view), url(r'^about/$', zerver.views.users.about_view),
url(r'^apps/(.*)', zerver.views.home.apps_view, name='zerver.views.home.apps_view'), url(r'^apps/(.*)', zerver.views.home.apps_view, name='zerver.views.home.apps_view'),
url(r'^plans/$', TemplateView.as_view(template_name='zerver/plans.html'), name='landing-page'),
url(r'^robots\.txt$', RedirectView.as_view(url='/static/robots.txt', permanent=True)), url(r'^robots\.txt$', RedirectView.as_view(url='/static/robots.txt', permanent=True)),