Merge remote-tracking branch 'origin/touchdown'

Conflicts:
	static/css/quay.css
	static/js/controllers.js
	test/data/test.db
This commit is contained in:
Jake Moshenko 2014-07-07 15:33:51 -04:00
commit c338b7d621
33 changed files with 1296 additions and 242 deletions

BIN
art/box-logo.psd Normal file

Binary file not shown.

BIN
art/landing-back-new.psd Normal file

Binary file not shown.

BIN
art/landing-back.psd Normal file

Binary file not shown.

View file

@ -67,6 +67,13 @@ def guide():
return index('')
@web.route('/tour/')
@web.route('/tour/<path:path>')
@no_cache
def tour(path = ''):
return index('')
@web.route('/tutorial/')
@no_cache
def tutorial():

View file

@ -9,6 +9,28 @@
}
}
nav.navbar {
border: 0px;
border-radius: 0px;
background-image: linear-gradient(to top, #535C66 0%,#6E8194 100%);
}
nav.navbar-default .navbar-nav>li>a {
color: white;
letter-spacing: 0.5px;
font-weight: 600;
}
.navbar-default .navbar-nav>li>a:hover, .navbar-default .navbar-nav>li>a:focus {
color: #BEE1FF;
}
.navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:hover, .navbar-default .navbar-nav>.open>a:focus {
cursor: pointer;
background: rgba(255, 255, 255, 0.4) !important;
color: white;
}
.notification-view-element {
cursor: pointer;
margin-bottom: 10px;
@ -548,6 +570,7 @@ i.toggle-icon:hover {
padding-left: 10px;
cursor: pointer;
font-size: 14px;
color: black;
}
.namespace-selector-dropdown .namespace-item {
@ -561,6 +584,10 @@ i.toggle-icon:hover {
color: #aaa;
}
.namespace-selector-dropdown a.namespace {
color: black !important;
}
.namespace-selector-dropdown .namespace-item.disabled img {
-webkit-filter: grayscale(1);
opacity: 0.5;
@ -1202,38 +1229,222 @@ i.toggle-icon:hover {
text-decoration: none;
}
.landing-page .help-block {
color: #C9C9C9;
}
.landing-page {
color: #555;
}
.landing-page .wrapper > nav {
display: none;
}
.landing-page .nav > li > a {
border-radius: 4px;
}
.landing-page .nav > li > a:hover, .landing-page .nav > li > a:focus {
background: rgba(255, 255, 255, 0.4);
}
.landing-page .nav .user-view {
color: white !important;
font-weight: bold;
}
.landing-page .user-tool {
color: white;
}
.landing {
position: relative;
}
.landing .popover {
font-size: 14px;
}
.landing-content {
}
.landing-background {
z-index: 0;
position: absolute;
top: 0px;
bottom: 0px;
left: 0px;
right: 0px;
background-color: #1d1d1d;
background-image: url(../img/landing-back.jpg);
background-repeat: no-repeat;
background-size: cover;
}
.landing-filter {
z-index: 0;
position: absolute;
top: 0px;
bottom: 0px;
left: 0px;
right: 0px;
}
.landing-filter.signedin {
}
.landing-content {
z-index: 2;
}
.landing {
color: white;
background-color: #1d1d1d;
background-position: left -30px;
background-image: url(../img/containers-back-black.jpg);
background-repeat: no-repeat;
margin-top: -20px;
margin-bottom: 0px;
padding-top: 46px;
padding-top: 120px;
min-height: 440px;
}
.landing .messages {
margin-bottom: 40px;
.landing a:not(.btn) {
color: #BEE1FF;
}
.landing .logo {
position: absolute;
top: 20px;
left: 16px;
}
.landing .product-name {
position: absolute;
top: 22px;
left: 131px;
color: white;
font-size: 40px;
}
.landing .header-bar .navbar-brand {
display: none;
}
.landing .header-bar form {
display: none;
}
.landing .header-bar {
font-size: 16px;
position: absolute;
right: 20px;
top: 20px;
color: white;
z-index: 100;
}
.landing .header-bar .user-tools a {
padding-left: 10px;
padding-right: 10px;
background: transparent !important;
}
.landing .navbar-links a {
font-weight: bold;
color: white;
border-radius: 6px;
}
.landing .navbar-links li a:hover {
background: rgba(255, 255, 255, 0.2);
}
.landing .nav .dropdown-menu a {
color: black;
font-weight: normal;
}
@media (max-width: 971px) {
.landing .navbar-collapse {
background: rgba(0, 0, 0, 0.8);
border-radius: 2px;
}
.navbar-header {
float: none;
}
.navbar-toggle {
display: block;
color: white;
font-size: 48px;
line-height: 28px;
padding: 4px;
}
.navbar-collapse {
border-top: 1px solid transparent;
box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
}
.navbar-collapse.collapse {
display: none!important;
}
.navbar-nav {
float: none!important;
margin: 7.5px -15px;
}
.navbar-nav>li {
float: none;
}
.navbar-nav>li>a {
padding-top: 10px;
padding-bottom: 10px;
}
.navbar-collapse.collapse.in { display: block!important; }
}
.landing .messages b {
color: #94C9F7;
color: #59B2FF;
}
.landing .messages h1 {
font-size: 48px;
}
.landing-section {
padding: 20px;
padding-bottom: 40px;
border-top: 1px solid #ddd;
display: block;
}
.landing-section:nth-child(even) {
background: #f7f7f7;
}
.landing-section h2 {
text-align: center;
display: block;
margin-bottom: 30px;
font-weight: 200;
}
.landing-page .tour-overview {
}
.landing-page .tour-overview img {
width: 500px;
padding: 10px;
display: inline-block;
}
.form-signup input {
margin: 12px;
margin-left: 0px;
@ -1247,6 +1458,57 @@ i.toggle-icon:hover {
margin-bottom: 10px;
}
.landing-page .twitter-tweet {
width: 100%;
margin: 0px;
border: 0px;
}
.landing-page .twitter-tweet p {
display: block;
text-align: center;
font-size: 20px;
}
.landing-page .twitter-tweet .attribute {
display: block;
text-align: center;
margin-bottom: 20px;
position: relative;
margin-top: 20px;
}
.landing-page .twitter-tweet .info-wrap {
display: inline-block;
padding-left: 70px;
}
.landing-page .twitter-tweet .avatar img {
border-radius: 4px;
border: 2px solid rgb(70, 70, 70);
width: 50px;
float: left;
}
.landing-page .twitter-tweet .info {
display: inline-block;
margin-left: 10px;
text-align: left;
margin-top: 4px;
}
.landing-page .twitter-tweet .reference {
display: block;
}
.landing-page .twitter-tweet .author {
display: block;
}
.follow-button {
text-align: center;
}
form input.ng-invalid.ng-dirty,
*[ng-form] input.ng-invalid.ng-dirty {
background-color: #FDD7D9;
@ -1258,10 +1520,9 @@ form input.ng-valid.ng-dirty,
}
.product-tour .tour-header {
height: 172px;
text-align: center;
margin-bottom: 40px;
border-bottom: 4px solid black;
border-bottom: 4px solid #333;
}
.product-tour .tour-header .tour-shoutout-header {
@ -1289,32 +1550,75 @@ form input.ng-valid.ng-dirty,
margin-bottom: 20px;
}
.product-tour .testimonial {
margin-bottom: 20px;
margin-top: 10px;
padding-top: 20px;
border-top: 4px solid #ccc;
}
.landing .popover-content {
color: black;
}
.landing .shoutout i {
font-size: 36px;
display: block;
.landing-page .shoutout > i {
font-size: 50px;
display: inline-block;
width: 120px;
height: 120px;
background: #eee;
text-align: center;
border-radius: 50%;
line-height: 120px;
}
.landing .shoutout b {
.landing-page .shoutout > b {
font-size: 22px;
display: block;
line-height: 31px;
margin-top: 10px;
margin-bottom: 10px;
}
.landing .shoutout {
.landing-page .shoutout {
font-size: 14px;
text-align: center;
line-height: normal;
padding-top: 30px;
margin-bottom: 15px;
}
@media (max-height: 768px) {
.landing {
padding: 20px;
padding-top: 20px;
}
.landing-page .shoutout .shoutout-link {
display: block;
margin-top: 16px;
font-size: 18px;
text-align: center;
}
.landing-page .feature-shoutout {
margin-bottom: 20px;
}
.landing-page .feature-shoutout > a {
font-size: 22px;
display: block;
line-height: 31px;
padding-top: 10px;
padding-bottom: 10px;
text-align: center;
}
.landing-page .feature-shoutout .img-responsive {
border: 2px solid #eee;
padding: 6px;
}
.landing-page .landing-action {
text-align: center;
}
.landing-page .landing-action a {
font-size: 26px;
}
.page-footer {
@ -2335,11 +2639,11 @@ p.editable:hover i {
}
.navbar-brand {
padding: 12px 15px;
padding: 6px;
}
.navbar-brand img {
height: 25px;
height: 36px;
}
.user-dropdown > img {
@ -3850,4 +4154,258 @@ pre.command:before {
background: red;
}
/*
This is the visible area of you carousel.
Set a width here to define how much items are visible.
The width can be either fixed in px or flexible in %.
Position must be relative!
*/
.jcarousel {
position: relative;
overflow: hidden;
margin-left: 30px;
margin-right: 30px;
}
.jcarousel-wrapper {
position: relative;
}
.jcarousel-wrapper .jcarousel-control {
font-size: 64px;
position: absolute;
top: -16px;
text-decoration: none !important;
}
.jcarousel-wrapper .jcarousel-control-prev {
left: 0px;
}
.jcarousel-wrapper .jcarousel-control-next {
right: 0px;
}
/*
This is the container of the carousel items.
You must ensure that the position is relative or absolute and
that the width is big enough to contain all items.
*/
.jcarousel ul {
width: 20000em;
position: relative;
/* Optional, required in this case since it's a <ul> element */
list-style: none;
margin: 0;
padding: 0;
}
/*
These are the item elements. jCarousel works best, if the items
have a fixed width and height (but it's not required).
*/
.jcarousel li {
/* Required only for block elements like <li>'s */
float: left;
display: block;
}
.jcarousel-page {
padding: 10px;
text-decoration: none !important;
font-size: 18px;
color: #aaa;
}
.jcarousel-page.active {
color: #428bca;
}
.jcarousel-page:before {
content: "\f10c";
font-family: FontAwesome;
}
.jcarousel-page.active:before {
content: "\f111";
font-family: FontAwesome;
}
.jcarousel-pagination {
display: block;
text-align: center;
}
.tour-section-container {
text-align: center;
border-bottom: 1px solid #eee;
}
.tour-sections {
margin: 0px;
padding: 0px;
}
.tour-sections li {
margin: 0px;
font-size: 16px;
list-style: none;
display: inline-block;
border-right: 1px solid #eee;
border-bottom: 2px solid transparent;
cursor: pointer;
}
.tour-sections li a {
display: block;
color: black;
padding: 10px;
padding-left: 20px;
padding-right: 20px;
text-decoration: none !important;
}
.tour-sections li:hover {
background: #eee;
}
.tour-sections li.active {
border-bottom: 2px solid #428bca;
}
.tour-sections li:first-child {
border-left: 1px solid #eee;
}
.tour-action {
text-align: center;
padding: 40px;
background: #eee;
}
.tour-action button {
font-size: 24px;
}
.tour-section.tour-header {
margin-top: 40px;
margin-bottom: 40px;
}
.tour-section.tour-header .tour-section-title {
text-align: center;
}
.screenshot-feature {
margin-bottom: 20px;
position: relative;
}
.screenshot-feature .fa {
float: left;
display: inline-block;
width: 50px;
height: 50px;
line-height: 50px;
border-radius: 50%;
background: #eee;
font-size: 28px;
text-align: center;
margin-right: 20px;
margin-top: 0px;
clear: both;
}
.screenshot-feature.active .fa {
color: white;
background: #428bca;
}
.screenshot-feature .sf-title {
font-size: 20px;
display: inline-block;
margin-bottom: 10px;
margin-top: 6px;
}
.screenshot-feature:hover {
cursor: pointer;
}
.screenshot-feature:hover .sf-title {
text-decoration: underline;
}
.screenshot-feature .sf-text {
margin-left: 70px;
}
.trusted-logos {
text-align: center;
}
.trusted-logos .trusted-logo {
min-height: 75px;
}
.trusted-logos .trusted-logo.apptentive {
padding-top: 20px;
}
.enterprise-icon {
text-align: center;
}
.testimonial {
text-align: center;
}
.testimonial .message:before {
font-size: 32px;
content: "“";
color: #aaa;
}
.testimonial .message:after {
font-size: 32px;
content: "”";
color: #aaa;
}
.testimonial .message {
font-size: 22px;
}
.testimonial img {
width: 120px;
margin: 10px;
border: 1px solid black;
border-radius: 10px;
margin-right: 20px;
}
.testimonial .speaker-info {
font-size: 18px;
margin-top: 10px;
}
.testimonial .speaker-info span {
display: inline-block;
margin-right: 20px;
}
.testimonial .speaker-info .speaker-title {
color: #888;
}
.testimonial .speaker-info .speaker-title a {
text-decoration: none;
color: #888;
}
.learn-more {
float: right;
font-size: 22px;
}

View file

@ -1,21 +1,22 @@
<!-- Quay -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse" style="padding: 0px; padding-left: 4px; padding-right: 4px;">
<span style="font-size: 24px">&equiv;</span>
&equiv;
</button>
<a class="navbar-brand" href="/" target="{{ appLinkTarget() }}">
<img src="/static/img/quay-logo.png">
<img src="/static/img/white_horizontal.png">
</a>
</div>
<!-- Collapsable stuff -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<ul class="nav navbar-nav navbar-links">
<li><a ng-href="/tour/" target="{{ appLinkTarget() }}">Tour</a></li>
<li><a ng-href="/repository/" target="{{ appLinkTarget() }}">Repositories</a></li>
<li><a href="http://docs.quay.io/" target="_blank">Docs</a></li>
<li><a ng-href="/tutorial/" target="{{ appLinkTarget() }}">Tutorial</a></li>
<li><a ng-href="/plans/" target="{{ appLinkTarget() }}" quay-require="['BILLING']">Pricing</a></li>
<li><a ng-href="/organizations/" target="{{ appLinkTarget() }}">Organizations</a></li>
<li quay-require="['BILLING']"><a ng-href="/plans/" target="{{ appLinkTarget() }}">Pricing</a></li>
<li><a ng-href="{{ user.organizations.length ? '/organizations/' : '/tour/organizations/' }}" target="{{ appLinkTarget() }}">Organizations</a></li>
</ul>
@ -33,7 +34,7 @@
</li>
<li class="dropdown" ng-switch-when="false">
<a href="javascript:void(0)" class="dropdown-toggle user-dropdown" data-toggle="dropdown">
<a href="javascript:void(0)" class="dropdown-toggle user-dropdown user-view" data-toggle="dropdown">
<img src="//www.gravatar.com/avatar/{{ user.gravatar }}?s=32&d=identicon" />
{{ user.username }}
<span class="badge user-notification notification-animated"
@ -70,7 +71,7 @@
</ul>
</li>
<li ng-switch-default>
<a href="/signin/" target="{{ appLinkTarget() }}">Sign in</a>
<a class="user-view" href="/signin/" target="{{ appLinkTarget() }}">Sign in</a>
</li>
</ul>
</div><!-- /.navbar-collapse -->

View file

@ -0,0 +1,296 @@
<!-- Features -->
<div class="product-tour" ng-if="kind == '' || kind == 'features'">
<div class="tour-section row tour-header">
<div class="col-md-12">
<div class="tour-section-title">The most advanced repository insight available</div>
<div class="tour-section-description">
Features and benefits that make working with Docker repositories awesome
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/user-home.png" title="User Home - Quay.io" data-screenshot-url="https://quay.io/" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Customized for you</div>
<div class="tour-section-description">
Your personal home screen shows those repositories most important to you, ordered by recent activity.
</div>
<div class="tour-section-description">Keep up to date on the status of those repositories you deem important.</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/repo-view.png" title="Repository View - Quay.io" data-screenshot-url="https://quay.io/repository/devtable/complex" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Useful views of respositories</div>
<div class="tour-section-description">
Each repository is presented with the maximum amount of useful information, including its image history, <b>markdown</b>-based description, and tags.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/build-history.png" title="View Image - Quay.io"
data-screenshot-url="https://quay.io/repository/devtable/building/build"
class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Dockerfile build in the cloud</div>
<div class="tour-section-description">
Like to use <b>Dockerfiles</b> to build your images? Simply upload your Dockerfile (and any additional files it needs) and we'll build your Dockerfile into an image and push it to your repository.
</div>
<div class="tour-section-description">
If you store your Dockerfile in <i class="fa fa-github fa-lg" style="margin: 6px;"></i><b>GitHub</b>, add a <b>Build Trigger</b> to your repository and we'll start a Dockerfile build for every change you make.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/repo-admin.png" title="Repository Admin - Quay.io" data-screenshot-url="https://quay.io/repository/devtable/complex/admin" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Share at your control</div>
<div class="tour-section-description">
Share any repository with as many (or as few) users as you choose.
</div>
<div class="tour-section-description">Need a repository only for your team? Easily <b>share</b> with your team members.</div>
<div class="tour-section-description">Need finer grain control? Mark a user as <b>read-only</b> or <b>read/write</b>.</div>
<div class="tour-section-description">Have a build script or a deploy process that needs access? Generate an <b>access token</b> to grant revocable access for pushing or pulling.</div>
<div class="tour-section-description">Want to share with the world? Make your repository <b>fully public</b>.</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/repo-changes.png" title="View Image - Quay.io" data-screenshot-url="https://quay.io/repository/devtable/image/..." class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Docker diff whenever you need it</div>
<div class="tour-section-description">
We wanted to know what was changing in each image of our repositories just as much as you do. So we added diffs. Now you can see exactly which files were <b>added</b>, <b>changed</b>, or <b>removed</b> for each image. We've also provided two awesome ways to view your changes, either in a filterable list, or in a drill down tree view.
</div>
</div>
</div>
<div class="row testimonial" quay-require="['BILLING']">
<div class="message">
Being responsible for operations of a startup means finding tools that just work, and Quay.io has provided that for us. Whenever we've needed a new feature, or found an issue, it was resolved immediately. I wish every third party we relied on offered the same level of support as Quay.io.
</div>
<div class="speaker-info">
<img src="/static/img/testimonial-kris.jpg">
<span class="speaker-info-internal">
<span class="speaker">Kris Constable</span>
<span class="speaker-title"><a href="http://bex.io" target="_blank" alt="Bex.io">Bex.io</a> - Operations & Security</span>
</span>
</div>
</div>
<div class="tour-action" quay-require="['BILLING']">
<a href="/plans?trial-plan=personal">
<button class="btn btn-success">
Start free trial
</button>
</a>
</div>
</div>
<!-- Organizations -->
<div class="product-tour" ng-if="kind == 'organizations'">
<div class="tour-section row tour-header">
<div class="col-md-12">
<div class="tour-section-title">Organize your repositories like you organize your company</div>
<div class="tour-section-description">
Organizations in Quay provide unique features for <span quay-require="['BILLING']">businesses and other</span>
groups, including team-based sharing and fine-grained permission controls.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/org-repo-list.png" data-title="Repositories - Quay.io" data-screenshot-url="https://quay.io/repository/" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">A central collection of repositories</div>
<div class="tour-section-description">
Your organization is the focal point for all activity that occurs within
your public or private repositories. Your repositories are centrally visible
and managed within the namespace of your organization. You may share
your repositories with as many users and teams as you like, without
any additional cost.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/org-admin.png" data-title="buynlarge Admin - Quay.io" data-screenshot-url="https://quay.io/organization/buynlarge/admin" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Organization settings at a glance</div>
<div class="tour-section-description">
Your organization allows you to view your private repository count
and manage billing settings in a centralized place.
</div>
<div class="tour-section-description">
You can also see all of the users who have access to your organization
and the teams of which they are members. This allows you to audit the
access that has been granted in your organization.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/org-logs.png" data-title="buynlarge Admin - Quay.io" data-screenshot-url="https://quay.io/organization/buynlarge" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Logging for comprehensive analysis</div>
<div class="tour-section-description">
Every time a user in your organization performs an action it is logged
and categorized in a way that allows for a complete understanding of
how your repositories have been accessed and modified. Each log entry
includes the action performed, the authorization which allowed the action
to occur, and additional relevant data such as the name of the item
which was modified or accessed.
</div>
<div class="tour-section-description">
For those times when you need full control when generating reports from
your logs, we also allow you to export your logs in JSON format. These
can be ingested by custom tooling solutions allowing you to visualize
reports in whatever format you require.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/org-teams.png" data-title="buynlarge - Quay.io" data-screenshot-url="https://quay.io/organization/buynlarge" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Teams simplify access controls</div>
<div class="tour-section-description">
Teams allow your organization to delegate access to your namespace and
repositories in a controlled fashion. Each team has permissions that
apply across the entire org, and can also be given specific levels of
access to specific repositories. A user is switching roles? No problem,
change their team membership and their access will be adjusted accordingly.
</div>
<div class="tour-section-description">
Owners of your organization, and members of other teams with
administrator privileges, have full permissions to all repositories
in the organization, as well as permissions to view and adjust the
account settings for the organization. Add users to these teams with
caution.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/org-repo-admin.png" data-title="buynlarge/orgrepo - Quay.io" data-screenshot-url="https://quay.io/repository/buynlarge/orgrepo" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Fine-grained control of sharing</div>
<div class="tour-section-description">
Repositories that you create within your organization can be assigned
fine-grained permissions just like any other repository. You can also
add teams that exist in your organization, or individual users from
inside our outside your organization.
</div>
<div class="tour-section-description">
In order to protect your intellectual property, we warn you before
you share your repositories with anyone who is not currently a member
of a team in your organization.
</div>
</div>
</div>
<div class="row testimonial" quay-require="['BILLING']">
<div class="message">
Docker is at the core of Aptible's deployment platform, and Quay provides the secure repository hosting we need to safely store our customer's application images, and our own. With its thorough team access control model, we can be sure that only authorized users are able to access a Docker image repository. No other Docker repository index makes this as easy as Quay.
</div>
<div class="speaker-info">
<img src="/static/img/testimonial-frank.png">
<span class="speaker-info-internal">
<span class="speaker">Frank Macreery</span>
<span class="speaker-title"><a href="https://www.aptible.com" target="_blank" alt="Aptible">Aptible</a> - CTO & Co-Founder</span>
</span>
</div>
</div>
<div class="tour-action" quay-require="['BILLING']">
<a href="/organizations/new/" data-title="Starts the process to create a new organization" bs-tooltip="tooltip.title">
<button class="btn btn-success">
Create New Organization
</button>
</a>
<a href="/user/?migrate" data-title="Starts the process to convert this account into an organization" quay-show="Config.AUTHENTICATION_TYPE == 'Database' && !user.anonymous" bs-tooltip="tooltip.title">
<button class="btn btn-primary">
Convert account now
</button>
</a>
</div>
</div>
<!-- Enterprise -->
<div class="product-tour" ng-if="kind == 'enterprise'">
<div class="tour-section row tour-header">
<div class="col-md-12">
<div class="tour-section-title">Quay.io in your data center</div>
<div class="tour-section-description">
All of the power of Quay.io, easily deployed to your data center via docker.
</div>
<div class="tour-section-description">
<div class="row">
<div class="alert alert-info col-md-4 col-md-offset-4"><strong>docker run quay.io/quay/enterprise</strong></div>
</div>
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-sm-3 enterprise-icon">
<span class="fa-stack fa-5x">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-lock fa-stack-1x fa-inverse"></i>
</span>
</div>
<div class="col-sm-9">
<div class="tour-section-title">Take control of your own security</div>
<div class="tour-section-description">
The nature of machine images is that they often contain keys and passwords. We're pretty proud of the <a href="/security/">security</a> of our hosted offering, but we recognize that there are situations, such as compliance or auditing, where you must control your own end to end security. Quay.io Enterprise Edition runs in your own data centers, inside your firewall.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-sm-3 col-sm-push-9 enterprise-icon">
<span class="fa-stack fa-5x">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-bar-chart-o fa-stack-1x fa-inverse"></i>
</span>
</div>
<div class="col-sm-9 col-sm-pull-3">
<div class="tour-section-title">Auditing and insight done right</div>
<div class="tour-section-description">
Our platform has built in logging and insight tools, allowing you to see who performed every action on the contents and access control settings of your repositories. This will help you pass internal auditing and compliance requirements more easily.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-sm-3 enterprise-icon">
<span class="fa-stack fa-5x">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-users fa-stack-1x fa-inverse"></i>
</span>
</div>
<div class="col-sm-9">
<div class="tour-section-title">Organize your repositories like you organize your business</div>
<div class="tour-section-description">
The built in teams and organizations features of Quay.io allow you to finely control how the different teams and projects within your enterprise collaborate on repositories.
</div>
</div>
</div>
<div class="tour-action">
<a href="mailto:support@devtable.com?Subject=Enterprise%20Quay.io%20Inquiry" data-title="Email us to find out more." bs-tooltip="tooltip.title">
<button class="btn btn-success">
Contact Us
</button>
</a>
</div>
</div>

View file

@ -0,0 +1,14 @@
<blockquote class="twitter-tweet" data-conversation="none" lang="en">
<p>
<span ng-transclude></span>
</p>
<div class="attribute">
<span class="info-wrap">
<span class="avatar"><img ng-src="{{ avatarUrl }}" fallback-src="/static/img/default-twitter.png"></span>
<span class="info">
<span class="author">{{ authorName }} (@{{authorUser}})</span>
<a class="reference" ng-href="{{ messageUrl }}">{{ messageDate }}</a>
</span>
</span>
</div>
</blockquote>

View file

@ -0,0 +1,15 @@
<svg width="198.7" xmlns="http://www.w3.org/2000/svg" height="34.6" viewBox="0 0 198.7 34.6" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 198.7 34.6">
<g fill="#999">
<path d="m45.7,26.5l-1.8-5.8h-8.8l-1.8,5.8h-5.5l8.5-24.3h6.3l8.6,24.3h-5.5zm-3-10.1c0,0-2.4-6.9-3.2-10.5-.9,3.5-3.1,10.5-3.1,10.5h6.3z"/>
<path d="m62.3,26.8c-1.1,0-2.1-.2-3.1-.7-.7-.4-1.6-1.6-2.3-1.7 .4,3.4 .3,10.2 .3,10.2h-5v-26.6h4.1l.7,2.4h.2c1.5-2.3 4.3-3.2 6.9-2.6 2.6,.6 4.2,2.9 4.9,5.4 1.3,5.1 .1,13.6-6.7,13.6zm-1.5-15.1c-3.2,0-3.7,2.9-3.6,5.5 0,1.7 .1,4.2 1.9,5.2 1.4,.7 3.3,.5 4.2-.8 1.8-2.6 1.8-9.9-2.5-9.9z"/>
<path d="m82,26.8c-1.1,0-2.1-.2-3.1-.7-.7-.4-1.6-1.6-2.3-1.7 .4,3.4 .3,10.2 .3,10.2h-5v-26.6h4.1l.7,2.4h.2c1.5-2.3 4.3-3.2 6.9-2.6 2.6,.6 4.2,2.9 4.9,5.4 1.3,5.1 .1,13.6-6.7,13.6zm-1.4-15.1c-3.2,0-3.7,2.9-3.6,5.5 0,1.7 .1,4.2 1.9,5.2 1.4,.7 3.3,.5 4.2-.8 1.7-2.6 1.7-9.9-2.5-9.9z"/>
<path d="m99.4,22.8c1.1,0 2.2-.3 3.2-.6 0,1.3 0,2.5 0,3.8-2.3,1.1-6.1,1.4-8.3-.1-1.8-1.2-2.1-3.6-2.1-5.6 0-2.8 0-8.5 0-8.5h-2.4v-2.1l2.7-1.7 1.5-3.9h3.2v3.9h5.2v3.8h-5.2v8.9c0,1.3 .9,2.1 2.2,2.1z"/>
<path d="m113,26.8c-4.1,0-7.9-1.9-9.1-6-1.1-3.9-.5-9.1 3-11.6 3.2-2.3 8.6-2.2 11.4,.7 2.3,2.4 2.2,5.6 2.2,8.6h-11.9c.2,6 7.1,4.9 10.9,3.1 0,1.3 0,2.6 0,3.9-2,1-4.2,1.3-6.5,1.3zm-.7-15.6c-2.3,0-3.4,1.8-3.6,3.9 2.4,0 4.7,0 7.1,0 0-2.1-1.2-3.9-3.5-3.9z"/>
<path d="m140.1,26.5h-5v-10.8c0-1.2-.1-2.7-1.2-3.5-1-.8-2.8-.7-3.9,0-1.9,1.1-1.9,3.9-1.9,5.8 0,2.8 0,8.5 0,8.5h-5v-18.5h3.9l.7,2.4h.3c1.9-3 6.9-3.6 9.8-1.6 2.2,1.5 2.5,4.1 2.5,6.5-.2,3.7-.2,11.2-.2,11.2z"/>
<path d="m151.4,22.8c1.1,0 2.2-.3 3.2-.6 0,1.3 0,2.5 0,3.8-2.3,1.1-6.1,1.4-8.3-.1-1.8-1.2-2.1-3.6-2.1-5.6 0-2.8 0-8.5 0-8.5h-2.4v-2.1l2.8-1.7 1.5-3.9h3.2v3.9h5.2v3.8h-5.2v8.9c-.1,1.3 .7,2.1 2.1,2.1z"/>
<path d="m156.4,3.2c0-3 4.9-3.5 5.4-.7 .7,3.9-5.4,4.4-5.4,.7zm5.2,23.3h-5v-18.5l5,.1v18.4z"/>
<path d="m169.6,26.3l-7-18.3h5.3l3.6,10.5 .8,3.8 .8-3.8 3.5-10.5h5.3l-7,18.3h-5.3z"/>
<path d="m191.2,26.8c-4.1,0-7.9-1.9-9.1-6-1.1-3.9-.5-9.1 3-11.6 3.2-2.3 8.6-2.2 11.4,.7 2.3,2.4 2.2,5.6 2.2,8.6h-11.9c.2,6 7.1,4.9 10.9,3.1 0,1.3 0,2.6 0,3.9-2,1-4.3,1.3-6.5,1.3zm-.7-15.6c-2.3,0-3.4,1.8-3.6,3.9 2.4,0 4.7,0 7.1,0 0-2.1-1.2-3.9-3.5-3.9z"/>
</g>
<path fill="#df2637" fill-rule="evenodd" d="m24.3,10.6l-5.6,15.6-14.9-5.4c-1.5-.7-2.5-1.8-3.2-3.4-.8-1.7-.8-3.5-.1-5.4 .7-1.9 1.9-3.3 3.6-4.1 1.6-.8 3.2-1.1 5-.7 5.4,1.5 7.5,4.1 6.4,8-1.8-2.5-3.8-4-6.2-4.5-2.4-.6-4,.2-4.8,2.5-.8,2.2-.3,3.8 1.4,4.5l10.7,3.9 4.3-11.9c.3-1 .2-2-.4-3-.6-1.1-1.5-1.9-2.8-2.3-1.3-.5-2.6-.5-3.7,0-1,.4-1.6,1-1.9,1.7l-3.8-1.3c.8-1.9 2.2-3.2 4.2-4.1 2-.9 4.1-1 6.3-.1 2,.7 3.6,2.2 4.8,4.4 1.1,2.2 1.2,4 .7,5.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
static/img/bexio-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
static/img/box-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 884 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

BIN
static/img/landing-back.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
static/img/white_horizontal.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -1490,7 +1490,15 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading
when('/organization/:orgname/application/:clientid', {templateUrl: '/static/partials/manage-application.html',
controller: ManageApplicationCtrl, reloadOnSearch: false}).
when('/v1/', {title: 'Activation information', templateUrl: '/static/partials/v1-page.html', controller: V1Ctrl}).
when('/', {title: 'Hosted Private Docker Registry', templateUrl: '/static/partials/landing.html', controller: LandingCtrl}).
when('/tour/', {title: 'Quay.io Tour', templateUrl: '/static/partials/tour.html', controller: TourCtrl}).
when('/tour/organizations', {title: 'Teams and Organizations Tour', templateUrl: '/static/partials/tour.html', controller: TourCtrl}).
when('/tour/features', {title: 'Quay.io Features', templateUrl: '/static/partials/tour.html', controller: TourCtrl}).
when('/tour/enterprise', {title: 'Quay.io Enterprise Edition', templateUrl: '/static/partials/tour.html', controller: TourCtrl}).
when('/', {title: 'Hosted Private Docker Registry', templateUrl: '/static/partials/landing.html', controller: LandingCtrl,
pageClass: 'landing-page'}).
otherwise({redirectTo: '/'});
}]).
config(function(RestangularProvider) {
@ -2061,6 +2069,38 @@ quayApp.directive('signupForm', function () {
});
quayApp.directive('tourContent', function () {
var directiveDefinitionObject = {
priority: 0,
templateUrl: '/static/directives/tour-content.html',
replace: false,
transclude: false,
restrict: 'C',
scope: {
'kind': '=kind'
},
controller: function($scope, $element, $timeout, UserService) {
// Monitor any user changes and place the current user into the scope.
UserService.updateUserIn($scope);
$scope.chromify = function() {
browserchrome.update();
};
$scope.$watch('kind', function(kind) {
$timeout(function() {
$scope.chromify();
});
});
},
link: function($scope, $element, $attr, ctrl) {
$scope.chromify();
}
};
return directiveDefinitionObject;
});
quayApp.directive('plansTable', function () {
var directiveDefinitionObject = {
priority: 0,
@ -4417,6 +4457,27 @@ quayApp.directive('buildProgress', function () {
});
quayApp.directive('twitterView', function () {
var directiveDefinitionObject = {
priority: 0,
templateUrl: '/static/directives/twitter-view.html',
replace: false,
transclude: true,
restrict: 'C',
scope: {
'avatarUrl': '@avatarUrl',
'authorName': '@authorName',
'authorUser': '@authorUser',
'messageUrl': '@messageUrl',
'messageDate': '@messageDate'
},
controller: function($scope, $element) {
}
};
return directiveDefinitionObject;
});
quayApp.directive('notificationView', function () {
var directiveDefinitionObject = {
priority: 0,
@ -4920,6 +4981,18 @@ quayApp.directive('tagSpecificImagesView', function () {
});
quayApp.directive('fallbackSrc', function () {
return {
restrict: 'A',
link: function postLink(scope, element, attributes) {
element.bind('error', function() {
angular.element(this).attr("src", attributes.fallbackSrc);
});
}
};
});
// Note: ngBlur is not yet in Angular stable, so we add it manaully here.
quayApp.directive('ngBlur', function() {
return function( scope, elem, attrs ) {
@ -4953,8 +5026,8 @@ quayApp.directive('ngVisible', function () {
};
});
quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanService', '$http', '$timeout', 'CookieService', 'Features',
function($location, $rootScope, Restangular, UserService, PlanService, $http, $timeout, CookieService, Features) {
quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanService', '$http', '$timeout', 'CookieService', 'Features', '$anchorScroll',
function($location, $rootScope, Restangular, UserService, PlanService, $http, $timeout, CookieService, Features, $anchorScroll) {
// Handle session security.
Restangular.setDefaultRequestParams(['post', 'put', 'remove', 'delete'], {'_csrf_token': window.__token || ''});
@ -5046,6 +5119,7 @@ quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanServi
});
$rootScope.$on('$routeChangeSuccess', function (event, current, previous) {
$rootScope.pageClass = '';
$rootScope.current = current.$$route;
if (!current.$$route) { return; }
@ -5054,6 +5128,10 @@ quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanServi
$rootScope.title = current.$$route.title;
}
if (current.$$route.pageClass) {
$rootScope.pageClass = current.$$route.pageClass;
}
if (current.$$route.description) {
$rootScope.description = current.$$route.description;
} else {
@ -5061,6 +5139,7 @@ quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanServi
}
$rootScope.fixFooter = !!current.$$route.fixFooter;
$anchorScroll();
});
$rootScope.$on('$viewContentLoaded', function(event, current) {

View file

@ -29,12 +29,7 @@ function SecurityCtrl($scope) {
function ContactCtrl($scope) {
}
function PlansCtrl($scope, $location, UserService, PlanService) {
// Load the list of plans.
PlanService.getPlans(function(plans) {
$scope.plans = plans;
}, /* include the personal plan */ true);
function PlansCtrl($scope, $location, UserService, PlanService, $routeParams) {
// Monitor any user changes and place the current user into the scope.
UserService.updateUserIn($scope);
@ -51,6 +46,15 @@ function PlansCtrl($scope, $location, UserService, PlanService) {
$('#signinModal').modal({});
}
};
// Load the list of plans.
PlanService.getPlans(function(plans) {
$scope.plans = plans;
if ($scope && $routeParams['trial-plan']) {
$scope.buyNow($routeParams['trial-plan']);
}
}, /* include the personal plan */ true);
}
function TutorialCtrl($scope, AngularTour, AngularTourSignals, UserService, Config) {
@ -270,6 +274,7 @@ function RepoListCtrl($scope, $sanitize, Restangular, UserService, ApiService) {
function LandingCtrl($scope, UserService, ApiService, Features, Config) {
$scope.namespace = null;
$scope.currentScreenshot = 'repo-view';
$scope.$watch('namespace', function(namespace) {
loadMyRepos(namespace);
@ -279,6 +284,10 @@ function LandingCtrl($scope, UserService, ApiService, Features, Config) {
loadMyRepos($scope.namespace);
});
$scope.changeScreenshot = function(screenshot) {
$scope.currentScreenshot = screenshot;
};
$scope.canCreateRepo = function(namespace) {
if (!$scope.user) { return false; }
@ -311,6 +320,52 @@ function LandingCtrl($scope, UserService, ApiService, Features, Config) {
$scope.chromify = function() {
browserchrome.update();
var jcarousel = $('.jcarousel');
jcarousel
.on('jcarousel:reload jcarousel:create', function () {
var width = jcarousel.innerWidth();
jcarousel.jcarousel('items').css('width', width + 'px');
})
.jcarousel({
wrap: 'circular'
});
$('.jcarousel-control-prev')
.on('jcarouselcontrol:active', function() {
$(this).removeClass('inactive');
})
.on('jcarouselcontrol:inactive', function() {
$(this).addClass('inactive');
})
.jcarouselControl({
target: '-=1'
});
$('.jcarousel-control-next')
.on('jcarouselcontrol:active', function() {
$(this).removeClass('inactive');
})
.on('jcarouselcontrol:inactive', function() {
$(this).addClass('inactive');
})
.jcarouselControl({
target: '+=1'
});
$('.jcarousel-pagination')
.on('jcarouselpagination:active', 'a', function() {
$(this).addClass('active');
})
.on('jcarouselpagination:inactive', 'a', function() {
$(this).removeClass('active');
})
.jcarouselPagination({
'item': function(page, carouselItems) {
return '<a href="javascript:void(0)" class="jcarousel-page"></a>';
}
});
};
$scope.getEnterpriseLogo = function() {
@ -2738,3 +2793,7 @@ function SuperUserAdminCtrl($scope, ApiService, Features, UserService) {
loadSeatUsage();
}
function TourCtrl($scope, $location) {
$scope.kind = $location.path().substring('/tour/'.length);
}

4
static/lib/jquery.jcarousel.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,11 @@
<div class="landing-content">
<div class="jumbotron landing">
<div class="jumbotron landing">
<div class="landing-background" ng-class="user.anonymous ? 'landing': 'signedin'"></div>
<div class="landing-filter" ng-class="user.anonymous ? 'landing': 'signedin'"></div>
<div class="landing-content">
<img class="logo" src="/static/img/box-logo.png">
<div class="header-bar"></div>
<div class="container">
<div class="row messages">
<div class="col-md-7">
@ -9,19 +15,20 @@
</span>
<h1>Quay.io Enterprise Edition</h1>
</div>
<div ng-show="!user.anonymous">
<span class="namespace-selector" user="user" namespace="namespace" ng-show="user.organizations"></span>
<div class="resource-view" resource="my_repositories">
<!-- Repos -->
<div ng-show="my_repositories.value.length > 0">
<h2>Top Repositories</h2>
<h2>Top Repositories</h2>
<div class="repo-listing" ng-repeat="repository in my_repositories.value">
<span class="repo-circle no-background" repo="repository"></span>
<a ng-href="/repository/{{ repository.namespace }}/{{ repository.name }}">{{repository.namespace}}/{{repository.name}}</a>
<div class="markdown-view description" content="repository.description" first-line-only="true"></div>
</div>
<a href="/repository/?namespace={{ user.username }}">See All Repositories</a>
</div>
<!-- No Repos -->
@ -41,7 +48,6 @@
<div class="col-md-4 col-md-offset-1">
<div ng-show="user.anonymous">
<h3>Create Username</h3>
<div class="signup-form"></div>
</div>
<div ng-show="!user.anonymous" class="user-welcome">
@ -52,7 +58,6 @@
</div>
</div> <!-- col -->
</div> <!-- row -->
</div> <!-- container -->
</div> <!-- jumbotron -->
</div>
</div>
</div> <!-- jumbotron -->

View file

@ -1,5 +1,11 @@
<div class="landing-content">
<div class="jumbotron landing">
<div class="jumbotron landing">
<div class="landing-background" ng-class="user.anonymous ? 'landing': 'signedin'"></div>
<div class="landing-filter" ng-class="user.anonymous ? 'landing': 'signedin'"></div>
<div class="landing-content">
<img class="logo" src="/static/img/white_horizontal.png">
<div class="header-bar"></div>
<div class="container">
<div class="row messages">
<div class="col-md-7">
@ -15,12 +21,13 @@
<div class="resource-view" resource="my_repositories">
<!-- Repos -->
<div ng-show="my_repositories.value.length > 0">
<h2>Top Repositories</h2>
<h2>Top Repositories</h2>
<div class="repo-listing" ng-repeat="repository in my_repositories.value">
<span class="repo-circle no-background" repo="repository"></span>
<a ng-href="/repository/{{ repository.namespace }}/{{ repository.name }}">{{repository.namespace}}/{{repository.name}}</a>
<div class="markdown-view description" content="repository.description" first-line-only="true"></div>
</div>
<a href="/repository/?namespace={{ user.username }}">See All Repositories</a>
</div>
<!-- No Repos -->
@ -50,102 +57,217 @@
</div>
</div> <!-- col -->
</div> <!-- row -->
</div> <!-- container -->
</div>
</div> <!-- jumbotron -->
<div class="row" ng-show="user.anonymous">
<div class="rows" ng-show="user.anonymous">
<div class=" shoutout-row landing-section">
<div class="container">
<div class="row">
<div class="col-md-4 shoutout">
<i class="fa fa-lock"></i>
<b>Secure</b>
<b>Private Storage</b>
<span class="shoutout-expand">
Your data is transferred using <strong>SSL at all times</strong> and <strong>encrypted</strong> when at rest. More information available in our <a href="/security/">security guide</a>
Push and pull Docker images to a private registry, with a focus on user experience
for your developers.
</span>
<a class="shoutout-link" href="/tour/features">View Features</a>
</div>
<div class="col-md-4 shoutout">
<i class="fa fa-group"></i>
<b>Shareable</b>
<b>Teamwork Optimized</b>
<span class="shoutout-expand">
Have to share a repository? No problem! Share with anyone you choose
Specially designed for teams, organizations and businesses that use Docker.
</span>
<a class="shoutout-link" href="/tour/organizations">View Teams and Organizations</a>
</div>
<div class="col-md-4 shoutout">
<i class="fa fa-cloud"></i>
<b>Cloud Hosted</b>
<i class="fa fa-cogs"></i>
<b>Deployment Made Easy</b>
<span class="shoutout-expand">
Accessible from anywhere, anytime
Tools and Solutions that help make your application deployment simple and straightforward.
</span>
<a class="shoutout-link" href="http://docs.quay.io/solution">View Solutions</a>
</div>
</div>
</div>
</div> <!-- -->
<div class=" landing-section">
<h2>Trusted by companies who use Docker</h2>
<div class="container">
<div class="row">
<div class="trusted-logos">
<div class="col-md-3 trusted-logo">
<a href="http://www.modcloth.com" target="_blank" alt="ModCloth"><img src="/static/img/modcloth-logo.png"></a>
</div>
<div class="col-md-3 trusted-logo">
<a href="https://travis-ci.com" target="_blank" alt="Travis CI"><img src="/static/img/travisci-logo.png"></a>
</div>
<div class="col-md-3 trusted-logo apptentive">
<a href="http://www.apptentive.com" target="_blank" alt="Apptentive"><img src="/static/img/apptentive-logo.svg"></a>
</div>
<div class="col-md-3 trusted-logo">
<a href="http://bex.io" target="_blank" alt="Bex.io"><img src="/static/img/bexio-logo.png"></a>
</div>
</div>
</div>
</div>
</div> <!-- -->
<div class="landing-section">
<h2>Built with our users in mind</h2>
<div class="container">
<div class="row">
<div class="col-lg-8 feature-shoutout">
<img id="screenshot" ng-src="{{ '/static/img/' + currentScreenshot + '.png' }}" class="img-responsive">
</div>
<div class="col-lg-4">
<div class="screenshot-feature" ng-class="currentScreenshot == 'repo-view' ? 'active' : ''" ng-click="changeScreenshot('repo-view')">
<i class="fa fa-hdd-o"></i>
<span class="sf-title">Beautiful repository view</span>
<div class="sf-text">
Repository is presented with the maximum amount of useful information, including a visual tree of its image history, markdown-based description, and tags.
</div>
</div>
<div class="screenshot-feature" ng-class="currentScreenshot == 'repo-admin' ? 'active' : ''" ng-click="changeScreenshot('repo-admin')">
<i class="fa fa-group"></i>
<span class="sf-title">Share at your control</span>
<div class="sf-text">
Set up the exact permissions your team, organization or business needs. Need to grant external access? Create one or more robot accounts to restrict access.
</div>
</div>
<div class="screenshot-feature" ng-class="currentScreenshot == 'build-history' ? 'active' : ''" ng-click="changeScreenshot('build-history')">
<i class="fa fa-tasks"></i>
<span class="sf-title">Dockerfile Build</span>
<div class="sf-text">
Repositories can be linked to Github repositories, with automatic building of the Dockerfile(s) found on push.
</div>
</div>
<div class="screenshot-feature" ng-class="currentScreenshot == 'repo-changes' ? 'active' : ''" ng-click="changeScreenshot('repo-changes')">
<i class="fa fa-code-fork"></i>
<span class="sf-title">Repository Diff</span>
<div class="sf-text">
See exactly which files were added, changed, or removed for each image in a repository.
</div>
</div>
</div>
</div>
</div>
</div> <!-- -->
<div class="landing-section">
<h2>Seamlessly integrate into your Docker-based infrastructure</h2>
<div class="container">
<div class="row testimonial">
<div class="message">
Quay.io has become an essential part of our infrastructure as we move to Docker-based deploys.
The support and service that the Quay.io team provides is phenomenal. We couldn't do it without them!
</div>
<div class="speaker-info">
<img src="/static/img/testimonial-mike.png">
<span class="speaker-info-internal">
<span class="speaker">Mike Saffitz</span>
<span class="speaker-title"><a href="http://www.apptentive.com" target="_blank" alt="Apptentive">Apptentive</a> - CTO & Co-Founder</span>
</span>
</div>
</div> <!-- row -->
</div> <!-- container -->
</div> <!-- jumbotron -->
<div class="product-tour container" ng-show="user.anonymous">
<div class="tour-header row">
<div class="tour-shoutout-header"><i class="fa fa-chevron-circle-down"></i></div>
<div class="tour-shoutout">Take a tour of Quay</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/user-home.png" title="User Home - Quay.io" data-screenshot-url="https://quay.io/" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Customized for you</div>
<div class="tour-section-description">
Your personal home screen shows those repositories most important to you, ordered by recent activity.
</div>
<div class="tour-section-description">Keep up to date on the status of those repositories you deem important.</div>
<a class="learn-more" href="/tour">Learn more</a>
</div>
</div>
</div> <!-- -->
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/repo-view.png" title="Repository View - Quay.io" data-screenshot-url="https://quay.io/repository/devtable/complex" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Useful views of respositories</div>
<div class="tour-section-description">
Each repository is presented with the maximum amount of useful information, including its image history, <b>markdown</b>-based description, and tags.
<div class="landing-section">
<h2>See what other people are saying about Quay.io</h2>
<div class="container">
<div class="row">
<div class="jcarousel-wrapper">
<div class="jcarousel">
<ul>
<li>
<div class="twitter-view" avatar-url="https://pbs.twimg.com/profile_images/3320588708/9237d8d056e9ce2fa737ea7ab2de345b_bigger.jpeg"
author-name="Ross Timson" author-user="rosstimson" message-url="https://twitter.com/rosstimson/statuses/451052618685882368"
message-date="April 1, 2014">
Pushing Dockerfile changes to Github and having <a href="https://twitter.com/quayio">@quayio</a> build the
<a href="https://twitter.com/docker">@docker</a> image/container for you is extremely awesome.
</div>
</li>
<li>
<div class="twitter-view" avatar-url="https://pbs.twimg.com/profile_images/2578175278/ykn3l9ktfdy1hia5odij_bigger.jpeg"
author-name="Frank Macreery" author-user="fancyremarker" message-url="https://twitter.com/fancyremarker/statuses/448528623692025857"
message-date="March 25, 2014">
<a href="https://twitter.com/quayio">@quayio</a> releases Docker build flair! <a href="http://t.co/72ULgveLj4">pic.twitter.com/72ULgveLj4</a>
</div>
</li>
<li>
<div class="twitter-view" avatar-url="https://pbs.twimg.com/profile_images/438406731660394496/UKGDY6xB_bigger.jpeg"
author-name="Joshua Goldie" author-user="jdgoldie" message-url="https://twitter.com/jdgoldie/statuses/446622958040408064"
message-date="March 20, 2014">
Just started playing with <a href="https://twitter.com/quayio">@quayio</a> builds tied to
<a href="https://twitter.com/search?q=%23github&amp;src=hash">#github</a> repo. Really liking it. My first experiment:
<a href="https://t.co/2LgyagwTEq">https://t.co/2LgyagwTEq</a>
</div>
</li>
<li>
<div class="twitter-view" avatar-url="https://pbs.twimg.com/profile_images/378800000731516813/e70eae6c4a2c25ae516660e958b3d36b_bigger.jpeg"
author-name="Evan Hazlett" author-user="ehazlett" message-url="https://twitter.com/ehazlett/statuses/442351806161510400"
message-date="March 8, 2014">
Great guys <a href="https://twitter.com/quayio">@quayio</a>. If you havent tried it, do.
</div>
</li>
<li>
<div class="twitter-view" avatar-url="https://pbs.twimg.com/profile_images/463168904320122880/lQG69Wqk_bigger.jpeg"
author-name="Jon Morehouse" author-user="JonMorehouse" message-url="https://twitter.com/JonMorehouse/statuses/441719785055739904"
message-date="March 6, 2014">
<a href="https://twitter.com/quayio">@quayio</a> has awesome support.
<a href="https://twitter.com/search?q=%23awesomeTool&amp;src=hash">#awesomeTool</a>
<a href="https://twitter.com/search?q=%23awesomeTeam&amp;src=hash">#awesomeTeam</a>
</div>
</li>
</ul>
</div>
<a href="#" class="jcarousel-control jcarousel-control-prev">&lsaquo;</a>
<a href="#" class="jcarousel-control jcarousel-control-next">&rsaquo;</a>
<p class="jcarousel-pagination"></p>
</div>
</div>
<div class="row">
<div class="col-md-12 follow-button">
<iframe allowtransparency="true" frameborder="0" scrolling="no"
src="//platform.twitter.com/widgets/follow_button.html?screen_name=quayio&show_count=false"
style="width:120px; height:20px;"></iframe>
</div>
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/build-history.png" title="View Image - Quay.io"
data-screenshot-url="https://quay.io/repository/devtable/building/build"
class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Dockerfile Build in the cloud</div>
<div class="tour-section-description">
Like to use <b>Dockerfiles</b> to build your images? Simply upload your Dockerfile (and any additional files it needs) and we'll build your Dockerfile into an image and push it to your repository.
</div>
<div class="tour-section-description">
If you store your Dockerfile in <i class="fa fa-github fa-lg" style="margin: 6px;"></i><b>GitHub</b>, add a <b>Build Trigger</b> to your repository and we'll start a Dockerfile build for every change you make.
</div>
<div class="landing-section">
<h2>Start pushing to Quay.io in under a minute</h2>
<div class="container">
<div class="row landing-action">
<a href="/plans" class="btn btn-primary">Start Free Trial</a>
</div>
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/repo-admin.png" title="Repository Admin - Quay.io" data-screenshot-url="https://quay.io/repository/devtable/complex/admin" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Share at your control</div>
<div class="tour-section-description">
Share any repository with as many (or as few) users as you choose.
</div>
<div class="tour-section-description">Need a repository only for your team? Easily <b>share</b> with your team members.</div>
<div class="tour-section-description">Need finer grain control? Mark a user as <b>read-only</b> or <b>read/write</b>.</div>
<div class="tour-section-description">Have a build script or a deploy process that needs access? Generate an <b>access token</b> to grant revocable access for pushing or pulling.</div>
<div class="tour-section-description">Want to share with the world? Make your repository <b>fully public</b>.</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/repo-changes.png" title="View Image - Quay.io" data-screenshot-url="https://quay.io/repository/devtable/image/..." class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Docker diff whenever you need it</div>
<div class="tour-section-description">
We wanted to know what was changing in each image of our repositories just as much as you do. So we added diffs. Now you can see exactly which files were <b>added</b>, <b>changed</b>, or <b>removed</b> for each image. We've also provided two awesome ways to view your changes, either in a filterable list, or in a drill down tree view.
</div>
</div>
</div>
<div style="border-top: 1px solid #eee; padding-top: 20px;">
<div class="container">
<div class="row">
<div style="border-top: 1px solid #eee; padding-top: 20px;" class="col-md-12">
<a href="https://mixpanel.com/f/partner"><img src="//cdn.mxpnl.com/site_media/images/partner/badge_light.png" alt="Mobile Analytics" /></a>
</div>
</div>

View file

@ -19,7 +19,7 @@
</div>
<!-- Organizations -->
<div ng-show="user.organizations.length > 0">
<div ng-if="user.organizations.length > 0">
<h2>Organizations</h2>
<div class="organization-listing" ng-repeat="organization in user.organizations">
@ -29,122 +29,5 @@
</div>
<!-- Organization Help/Tour -->
<div class="product-tour" ng-show="!user.organizations || user.organizations.length == 0">
<div class="tour-section row">
<div class="col-md-12">
<div class="tour-section-title">Organizations</div>
<div class="tour-section-description">
Organizations in Quay provide unique features for businesses and other
groups, including team-based sharing and fine-grained permission controls.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/org-repo-list.png" data-title="Repositories - Quay.io" data-screenshot-url="https://quay.io/repository/" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">A central collection of repositories</div>
<div class="tour-section-description">
Your organization is the focal point for all activity that occurs within
your public or private repositories. Your repositories are centrally visible
and managed within the namespace of your organization. You may share
your repositories with as many users and teams as you like, without
any additional cost.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/org-admin.png" data-title="buynlarge Admin - Quay.io" data-screenshot-url="https://quay.io/organization/buynlarge/admin" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Organization settings at a glance</div>
<div class="tour-section-description">
Your organization allows you to view your private repository count
and manage billing settings in a centralized place.
</div>
<div class="tour-section-description">
You can also see all of the users who have access to your organization
and the teams of which they are members. This allows you to audit the
access that has been granted in your organization.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/org-logs.png" data-title="buynlarge Admin - Quay.io" data-screenshot-url="https://quay.io/organization/buynlarge" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Logging for comprehensive analysis</div>
<div class="tour-section-description">
Every time a user in your organization performs an action it is logged
and categorized in a way that allows for a complete understanding of
how your repositories have been accessed and modified. Each log entry
includes the action performed, the authorization which allowed the action
to occur, and additional relevant data such as the name of the item
which was modified or accessed.
</div>
<div class="tour-section-description">
For those times when you need full control when generating reports from
your logs, we also allow you to export your logs in JSON format. These
can be ingested by custom tooling solutions allowing you to visualize
reports in whatever format you require.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7 col-md-push-5"><img src="/static/img/org-teams.png" data-title="buynlarge - Quay.io" data-screenshot-url="https://quay.io/organization/buynlarge" class="img-responsive"></div>
<div class="col-md-5 col-md-pull-7">
<div class="tour-section-title">Teams simplify access controls</div>
<div class="tour-section-description">
Teams allow your organization to delegate access to your namespace and
repositories in a controlled fashion. Each team has permissions that
apply across the entire org, and can also be given specific levels of
access to specific repositories. A user is switching roles? No problem,
change their team membership and their access will be adjusted accordingly.
</div>
<div class="tour-section-description">
Owners of your organization, and members of other teams with
administrator privileges, have full permissions to all repositories
in the organization, as well as permissions to view and adjust the
account settings for the organization. Add users to these teams with
caution.
</div>
</div>
</div>
<div class="tour-section row">
<div class="col-md-7"><img src="/static/img/org-repo-admin.png" data-title="buynlarge/orgrepo - Quay.io" data-screenshot-url="https://quay.io/repository/buynlarge/orgrepo" class="img-responsive"></div>
<div class="col-md-5">
<div class="tour-section-title">Fine-grained control of sharing</div>
<div class="tour-section-description">
Repositories that you create within your organization can be assigned
fine-grained permissions just like any other repository. You can also
add teams that exist in your organization, or individual users from
inside our outside your organization.
</div>
<div class="tour-section-description">
In order to protect your intellectual property, we warn you before
you share your repositories with anyone who is not currently a member
of a team in your organization.
</div>
</div>
</div>
<div class="button-bar-right button-bar-bottom">
<a href="/organizations/new/" data-title="Starts the process to create a new organization" bs-tooltip="tooltip.title">
<button class="btn btn-success">
<i class="fa fa-plus"></i>
Create New Organization
</button>
</a>
<a href="/user/?migrate" ng-show="!user.anonymous" data-title="Starts the process to convert this account into an organization" bs-tooltip="tooltip.title" quay-show="Config.AUTHENTICATION_TYPE == 'Database' && !user.anonymous">
<button class="btn btn-primary">
<i class="fa fa-caret-square-o-right"></i>
Convert account
</button>
</a>
</div>
</div>
<div class="tour-content" ng-if="!user.organizations || user.organizations.length == 0" kind="'organizations'"></div>
</div>

11
static/partials/tour.html Normal file
View file

@ -0,0 +1,11 @@
<div class="tour-section-container">
<ul class="tour-sections">
<li ng-class="kind == '' || kind == 'features' ? 'active' : ''"><a href="/tour/features">Features</a></li>
<li ng-class="kind == 'organizations' ? 'active' : ''"><a href="/tour/organizations">Teams and Organizations</a></li>
<li ng-class="kind == 'enterprise' ? 'active' : ''" quay-require="['BILLING']"><a href="/tour/enterprise">Enterprise</a></li>
</ul>
</div>
<div class="container">
<div class="tour-content" kind="kind"></div>
</div>

View file

@ -77,7 +77,7 @@ b._i.push([a,e,d])};b.__SV=1.2}})(document,window.mixpanel||[]);
mixpanel.init("{{ mixpanel_key }}", { track_pageview : false, debug: {{ is_debug }} });</script><!-- end Mixpanel -->
{% endif %}
</head>
<body>
<body ng-class="pageClass">
<div ng-class="!fixFooter ? 'wrapper' : ''">
<nav class="navbar navbar-default header-bar" role="navigation"></nav>

Binary file not shown.