Merge remote-tracking branch 'origin/touchdown'
Conflicts: static/css/quay.css static/js/controllers.js test/data/test.db
BIN
art/box-logo.psd
Normal file
BIN
art/landing-back-new.psd
Normal file
BIN
art/landing-back.psd
Normal 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():
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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">≡</span>
|
||||
≡
|
||||
</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 -->
|
||||
|
|
296
static/directives/tour-content.html
Normal 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>
|
14
static/directives/twitter-view.html
Normal 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>
|
15
static/img/apptentive-logo.svg
Normal 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
After Width: | Height: | Size: 18 KiB |
BIN
static/img/box-logo.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
static/img/default-twitter.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
static/img/landing-back copy.jpg
Normal file
After Width: | Height: | Size: 884 KiB |
BIN
static/img/landing-back-pattern-fast.jpg
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
static/img/landing-back-pattern.jpg
Normal file
After Width: | Height: | Size: 5.6 MiB |
BIN
static/img/landing-back.jpg
Normal file
After Width: | Height: | Size: 920 KiB |
BIN
static/img/modcloth-logo.png
Normal file
After Width: | Height: | Size: 9 KiB |
BIN
static/img/quay-logo-inverted-new.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
static/img/quay-logo-inverted.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
static/img/testimonial-frank.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
static/img/testimonial-kris.jpg
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
static/img/testimonial-mike.png
Normal file
After Width: | Height: | Size: 6.7 KiB |
BIN
static/img/travisci-logo.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
static/img/white_horizontal.png
Executable file
After Width: | Height: | Size: 10 KiB |
|
@ -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) {
|
||||
|
|
|
@ -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
|
@ -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 -->
|
||||
|
|
|
@ -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&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 haven’t 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&src=hash">#awesomeTool</a>
|
||||
<a href="https://twitter.com/search?q=%23awesomeTeam&src=hash">#awesomeTeam</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<a href="#" class="jcarousel-control jcarousel-control-prev">‹</a>
|
||||
<a href="#" class="jcarousel-control jcarousel-control-next">›</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>
|
||||
|
|
|
@ -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
|
@ -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>
|
|
@ -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>
|
||||
|
||||
|
|