diff --git a/README.md b/README.md index a5e9ea86a..c09a7a367 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Quay.io - container image registry +# Quay - container image registry -`master` branch build status: ![Docker Repository on Quay.io](https://quay.io/repository/quay/quay/status?token=7bffbc13-8bb0-4fb4-8a70-684a0cf485d3 "Docker Repository on Quay.io") +`master` branch build status: ![Docker Repository on Quay](https://quay.io/repository/quay/quay/status?token=7bffbc13-8bb0-4fb4-8a70-684a0cf485d3 "Docker Repository on Quay") -Quay.io is a container image registry with managements APIs, a Docker registry API, a container build system. +Quay is a container image registry with managements APIs, a Docker registry API, a container build system. The application is implemented as a set of API endpoints written in python and an Angular.js frontend. ## Setup Development Environment diff --git a/ROADMAP.md b/ROADMAP.md index d94d81588..b2edd0717 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,4 +1,4 @@ -# Quay.io Roadmap +# Quay Roadmap **work in progress** diff --git a/config.py b/config.py index f97447f45..fd7813c67 100644 --- a/config.py +++ b/config.py @@ -46,8 +46,8 @@ class DefaultConfig(object): PREFERRED_URL_SCHEME = 'http' SERVER_HOSTNAME = 'localhost:5000' - REGISTRY_TITLE = 'CoreOS Enterprise Registry' - REGISTRY_TITLE_SHORT = 'Enterprise Registry' + REGISTRY_TITLE = 'Quay Enterprise' + REGISTRY_TITLE_SHORT = 'Quay Enterprise' CONTACT_INFO = [ 'mailto:support@quay.io', diff --git a/endpoints/api/discovery.py b/endpoints/api/discovery.py index bcf45428b..70a48664d 100644 --- a/endpoints/api/discovery.py +++ b/endpoints/api/discovery.py @@ -241,10 +241,10 @@ def swagger_route_data(include_internal=False, compact=False): ], 'info': { 'version': 'v1', - 'title': 'Quay.io Frontend', + 'title': 'Quay Frontend', 'description': ('This API allows you to perform many of the operations required to work ' - 'with Quay.io repositories, users, and organizations. You can find out more ' - 'at Quay.io.'), + 'with Quay repositories, users, and organizations. You can find out more ' + 'at Quay.'), 'termsOfService': 'https://quay.io/tos', 'contact': { 'email': 'support@quay.io' diff --git a/static/css/directives/ui/plan-manager.css b/static/css/directives/ui/plan-manager.css new file mode 100644 index 000000000..9bea93c85 --- /dev/null +++ b/static/css/directives/ui/plan-manager.css @@ -0,0 +1,42 @@ +.plan-manager-element .plans-list-table thead td { + color: #aaa; + font-weight: bold; +} + +.plan-manager-element .plans-list-table td { + padding: 10px; + font-size: 16px; + vertical-align: middle; +} + +.plan-manager-element .plans-list-table td.controls { + text-align: right; +} + +.plan-manager-element .plans-list-table .plan-price { + font-size: 16px; + margin-bottom: 0px; +} + +.plan-manager-element .plans-list-table .deprecated-plan { + color: #aaa; +} + +.plan-manager-element .plans-list-table .deprecated-plan-label { + font-size: 0.7em; +} + +.plan-manager-element .qe-shoutout { + float: right; + padding: 20px; + border: 1px solid #ddd; + border-radius: 4px; + margin-top: 20px; + max-width: 500px; +} + +.plan-manager-element .qe-shoutout img { + max-width: 100%; + max-height: 28px; + margin-bottom: 10px; +} \ No newline at end of file diff --git a/static/css/pages/landing.css b/static/css/pages/landing.css new file mode 100644 index 000000000..5689a967c --- /dev/null +++ b/static/css/pages/landing.css @@ -0,0 +1,316 @@ +.landing-page { + color: #555; +} + +.landing-page #padding-container { + padding: 0px; +} + +.landing-page .main-panel { + padding: 0px; + border: 0px; + padding-bottom: 10px; +} + +.landing.jumbotron { + background: transparent; + position: relative; + color: white; + + margin-bottom: 0px; + min-height: 440px; +} + +.landing.jumbotron p { + font-size: 100%; +} + +.landing.jumbotron h1 { + margin-bottom: 30px; + font-size: 50px; + line-height: 60px; +} + +.landing.jumbotron h2 { + margin-bottom: 60px; + font-size: 26px; + font-weight: 300; + line-height: 36px; +} + +.landing.jumbotron .buttons { + margin-bottom: 70px; +} + +.landing.jumbotron .buttons .btn { + padding: 6px; + padding-left: 40px; + padding-right: 40px; + + border: 1px solid #40B4E5; + border-radius: 6px; + margin-left: 30px; + background-color: transparent; + text-transform: uppercase; + font-size: 26px; + font-weight: 500; + + color: white !important; +} + +.landing.jumbotron .buttons .btn.highlighted { + background-color: rgba(64, 180, 229, 0.4); +} + +.landing.jumbotron .buttons .btn:hover { + background-color: rgba(64, 180, 229, 0.8); +} + +.landing.jumbotron .buttons .btn:first-child { + margin-left: 0px; +} + +.landing-background { + z-index: 0; + + position: absolute; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + + background: url('/static/img/quay_pattern.png') left top repeat, linear-gradient(30deg, #2277ad, #144768) no-repeat left top fixed; + background-color: #2277ad; + background-size: 100% 100%; +} + +.landing-content { + z-index: 4; + padding-left: 20px; + padding-right: 20px; + position: relative; +} + +.landing-content { + text-align: center; +} + +.landing-content .works-with img { + max-height: 28px; + margin-left: 30px; +} + +.landing-content .works-with .supports { + vertical-align: middle; + margin-left: 30px; + font-size: 12px; + line-height: 16px; + max-width: 400px; + display: inline-block; + padding-left: 30px; + border-left: 1px solid white; + height: 42px; + text-align: left; + padding-top: 4px; +} + + +.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; +} + +.landing-signup-button { + 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 .twitter-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; +} + +.landing-page .shoutout { + font-size: 14px; + text-align: center; + line-height: normal; + padding-top: 30px; + margin-bottom: 20px; +} + +.landing-page .shoutout > i { + font-size: 50px; + display: inline-block; + width: 100px; + height: 92px; + text-align: center; + line-height: 92px; + background-image: url(/static/img/landing-icon-background.svg); + color: #337ab7; +} + +.landing-page .shoutout .shoutout-link { + font-size: 20px; + display: block; + line-height: 31px; + margin-top: 20px; + margin-bottom: 20px; +} + +.landing-page .shoutout .shoutout-expand { + font-family: Source Sans Pro; + font-size: 12px; + line-height: 16px; + color: #717273; +} + +.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 .btn { + font-size: 26px; +} + +.landing-page .enterprise-logo { + display: inline-block; + background: white; + + border: 1px solid transparent; + padding: 30px; + -webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + -moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + -ms-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + -o-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.4); +} + +.landing-page .enterprise-logo img { + max-height: 50px; +} + +@media (max-width: 989px) { + .landing-content .works-with .supports { + display: block; + margin: 0px; + margin-top: 20px; + padding: 0px; + border: 0px; + text-align: center; + max-width: 989px; + } +} + +@media (max-width: 767px) { + .landing-page .buttons { + text-align: center; + } + + .landing-page .btn { + margin: 0px !important; + display: block; + } + + .landing-page .btn:last-child { + margin-top: 20px !important; + } + + .landing-content .works-with { + text-align: center; + } + + .landing-content .works-with .text { + display: block; + } + + .landing-content .works-with .works-logo { + display: block; + } + + .landing-content .works-with img { + margin-left: 0px; + margin-top: 10px; + } +} diff --git a/static/css/pages/plans.css b/static/css/pages/plans.css new file mode 100644 index 000000000..70ab1574d --- /dev/null +++ b/static/css/pages/plans.css @@ -0,0 +1,442 @@ +.plans-panel { + padding: 0px; + padding-top: 50px; +} + +.plans-panel .plans-header { + font-size: 24px; + color: #1D314F; + font-weight: 300; + margin-bottom: 40px; + text-align: center; + padding-left: 15px; + padding-right: 15px; +} + +.plans-panel .plan-tabs { + text-align: center; + padding-left: 30px; + padding-right: 30px; + margin-bottom: 40px; +} + +.plans-panel .plan-tabs li { + display: inline-block; + width: 49%; +} + +.plans-panel .plan-tabs a { + padding-bottom: 25px; +} + +.plans-panel .plan-tabs a:hover { + background-color: transparent; + border-color: transparent; + cursor: pointer !important; /* override very specific bootstrap style */ +} + +.plans-panel .plan-tabs a:hover svg [fill="#003764"] { + fill: #345D84; +} + +.plans-panel .plan-tabs a .tab-logo { + display: block; + margin-bottom: 25px; + text-align: center; + margin-top: 25px; +} + +.plans-panel .plan-tabs a .tab-logo svg { + height: 40px; +} + +.plans-panel .plan-tabs a .tab-title { + display: block; + text-align: center; + font-size: 16px; + color: #1D314F; + font-weight: 300; +} + +.plans-panel .plan-tabs a:hover .tab-title { + color: #51A3D9; +} + +@media (max-width: 992px) { + .plans-panel .plan-tabs a .tab-logo svg { + height: 30px; + } + .plans-panel .plan-tabs a .tab-title { + font-size: 13px; + } +} + +@media (max-width: 767px) { + .plans-panel .plan-tabs { + margin-bottom: 0px; + padding-right: 5px; + padding-left: 5px; + } + + .plans-panel .plan-tabs a { + padding-bottom: 0px; + padding-left: 10px; + padding-right: 10px; + } + + .plans-panel .plan-tabs a .tab-title { + display: none; + } + + .plans-panel .plan-tabs a .tab-logo { + margin-top: 5px; + margin-bottom: 10px; + } + + .plans-panel .plan-tabs a .tab-logo svg { + height: 20px; + max-width: 100%; + } +} + +.plans-panel .tab-pane .plan-col { + padding-left: 12px; + padding-right: 12px; + margin-bottom: 30px; +} + +.plans-panel .plan-col:before { + display: block; + text-align: center; + content: "-"; + text-transform: uppercase; + color: white; + height: 25px; +} + +.plans-panel .plan-col.popular:before { + content: "Most Popular"; + color: #2276ad; + height: 25px; + line-height: 25px; + background-color: #c1dff3; +} + +.plans-panel .plan-box { + background-color: #1d3447; + color: #fff; + padding: 20px; +} + +.plans-panel .plan-box .plan-header { + margin-bottom: 20px; + padding-bottom: 20px; + border-bottom: 1px dashed #495b6a; +} + +.plans-panel .plan-box.gray .plan-header { + border-bottom: 1px dashed #ccc; +} + +.plans-panel .plan-box .qe-plan-description { + margin-bottom: 20px; +} + +.plans-panel .plan-box .plan-description { + margin-top: 20px; + padding-top: 20px; + border-top: 1px dashed #495b6a; + + text-align: center; + font-size: 16px; + margin-bottom: 20px; +} + +.plans-panel .plan-box .plan-header b { + font-size: 18px; + color: white; +} + +.plans-panel .plan-box.gray .plan-header b { + color: black; +} + +.plans-panel .plan-box .plan-header .plan-box-price { + float: right; + width: 75px; + text-align: right; + font-size: 18px; + position: relative; +} + +.plans-panel .plan-box .plan-header .plan-box-price-hidden { + font-style: italic; + font-size: 13px; + line-height: 27px; +} + +.plans-panel .plan-box .trial-button { + display: block; + text-align: center; + width: 100%; +} + +.plans-panel .plan-box .trial-button .fa { + padding-left: 5px; +} + +.plans-panel .plan-box select { + margin-bottom: 10px; +} + +.plans-panel .plan-box ul { + padding: 0px; + padding-left: 16px; + list-style: square; +} + +.plans-panel .plan-box.gray { + background-color: #f5f5f5; + text-align: center; + color: black; +} + +.plans-panel .plan-box.gray .qe-plan-description { + margin-bottom: 10px; +} + +.plans-panel .plan-box.gray .qe-plan-description i { + margin-right: 5px; +} + +.plans-panel .plan-features { + margin: 0px; + margin-top: 10px; + list-style: none; + text-align: center; + padding: 0px; +} + +.plans-panel .plan-features li { + text-align: left; + margin-bottom: 10px; + position: relative; + padding-left: 25px; +} + +.plans-panel .plan-features i.fa { + position: absolute; + left: 0px; + top: 4px; + color: #6aab56; +} + +.plans-panel .plan-features li b { + color: #6aab56; +} + +.plans-panel .plan-features.single-feature li { + text-align: center; + color: #6aab56; +} + +.plans-panel .plan-features.single-feature i.fa { + position: static; + margin-right: 4px; +} + +.plans-panel .plan-features li.disabled { + color: #aaa; +} + +.plans-panel .faq-features { + margin-top: 15px; + border-top: 1px solid #ddd; +} + +.plans-panel .features-col { + background-color: #f9f9f9; + padding: 30px; + border-bottom: 1px solid #ddd; + border-top: none; +} + +.plans-panel .row-container { + margin-left: 30px; + margin-right: 30px; +} + +.plans-panel .row-container-no-margin { + margin-right: 15px; + margin-left: 15px; +} + +.plans-panel .tab-content { + margin-bottom: 0px; +} + +.plans-panel .features-col .features-title { + text-align: center; + font-size: 18px; + margin-bottom: 20px; + color: #1d3447; + font-weight: bold; +} + +.plans-panel .features-col .features-list { + padding: 0px; + list-style: none; +} + +.plans-panel .features-col .features-list li { + position: relative; + padding-left: 40px; + margin-bottom: 20px; +} + +.plans-panel .features-col .features-list li i { + position: absolute; + font-size: 25px; + color: #2e79b9; + left: 0px; + display: block; + width: 30px; + text-align: center; +} + +.plans-panel .features-col .features-list li b { + display: block; + color: #2e79b9; + font-size: 16px; + margin-bottom: 12px; +} + +.plans-panel .features-col .features-list li p { + display: none; +} + +@media (min-width: 992px) { + .plans-panel .features-col .features-list li p { + display: block; + } + .plans-panel .features-col { + border-right: none; + border-left: 1px solid #ddd; + } +} + +.plans-panel .faq-col { + padding-bottom: 0px; + padding-top: 30px; + padding-left: 30px; + padding-right: 30px; + margin-bottom: 20px +} + +.plans-panel .faq-col h4 { + color: #2e79b9; + margin-top: 50px; + font-weight: 500; + margin-bottom: 23px; +} + +.plans-panel .faq-col p+h4 { + margin-top: 40px; +} + +.plans-panel .faq-col h4:first-child { + margin-top: 0px; +} + +.plans-panel .faq-col > b { + margin-bottom: 10px; + display: block; +} + +.plans-panel .faq-col p+b { + margin-top: 20px; +} + +.plans-panel .faq-sub-col { + padding: 40px; + padding-bottom: 0px; +} + +.plans-panel .faq-sub-col ul { + padding: 0px; + list-style: square; +} + +.plans-panel .faq-sub-col img { + width: 100%; + max-height: 45px; + margin-bottom: 20px; +} + +.plans-panel .faq-sub-col b { + margin-bottom: 20px; + text-align: center; + display: block; +} + +#tectonicManagerDialog .modal-body { + text-align: center; + padding: 40px; +} + +#tectonicManagerDialog .qe-logo { + max-height: 50px; + margin-bottom: 30px; + max-width: 100%; +} + +#tectonicManagerDialog b { + display: block; + margin-bottom: 15px; +} + +#tectonicManagerDialog .buttons { + margin-top: 10px; + margin-bottom: 30px; +} + +#tectonicManagerDialog .buttons .btn { + margin-left: 30px; + font-size: 14px; + padding-left: 20px; + padding-right: 20px +} + +@media (max-width: 767px) { + #tectonicManagerDialog .buttons .btn { + margin: 0px; + margin-top: 20px; + } +} + +#tectonicManagerDialog .buttons .btn:first-child { + margin-left: 0px; +} + +#tectonicManagerDialog .shoutout { + padding: 20px; + border: 1px solid #ddd; + border-radius: 4px; + max-width: 300px; + display: inline-block; + color: #1d304f; + + font-size: 13px; + margin-top: 30px; + margin-bottom: 10px; +} + +#tectonicManagerDialog .shoutout img { + max-width: 260px; + max-height: 20px; + margin-top: 20px; +} + +#tectonicManagerDialog .modal-dialog { + max-width: 650px; +} diff --git a/static/css/pages/repo-list.css b/static/css/pages/repo-list.css index ad27c908d..2f316e6bc 100644 --- a/static/css/pages/repo-list.css +++ b/static/css/pages/repo-list.css @@ -40,4 +40,27 @@ width: 30px; margin-right: 10px; text-align: center; +} + +.repo-list .qe-shoutout { + padding: 10px; +} + +.repo-list .qe-shoutout b { + margin-left: 6px; +} + +.repo-list .qe-shoutout div { + margin-right: 94px; +} + +.repo-list .qe-shoutout img { + max-height: 24px; + max-width: 100%; +} + +.repo-list .qe-shoutout span { + float: right; + line-height: 24px; + margin-right: 4px; } \ No newline at end of file diff --git a/static/css/quay.css b/static/css/quay.css index bd8e3873a..bcafda642 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -83,6 +83,8 @@ } #quay-logo { + margin-left: 10px; + margin-top: 1px; height: 36px; width: 100px; background-repeat: no-repeat; @@ -91,6 +93,10 @@ display: inline-block; } +#quay-logo.hosted-logo { + width: 150px; +} + #padding-container { padding: 20px; padding-top: 20px; @@ -1142,221 +1148,6 @@ i.toggle-icon:hover { padding: 20px; } -.jumbotron { - background: transparent; -} - -.jumbotron p { - font-size: 100%; -} - -.jumbotron .disclaimer-link { - font-size: .3em; - vertical-align: 23px; -} - -.jumbotron .disclaimer-link:hover { - text-decoration: none; -} - -.landing-page .help-block { - color: #C9C9C9; -} - -.landing-page { - color: #555; -} - -.landing-page #padding-container { - padding: 0px; -} - -.landing-page .main-panel { - padding: 0px; - border: 0px; - padding-bottom: 10px; -} - -.landing-page.signedin .main-panel { - background: transparent; - box-shadow: none; -} - -.landing { - position: relative; -} - -.landing .popover { - font-size: 14px; -} - -.landing-background { - z-index: 0; - - position: absolute; - top: 0px; - bottom: 0px; - left: 0px; - right: 0px; - - background: url('/static/img/network-tile.png') left top repeat, linear-gradient(30deg, #2277ad, #144768) no-repeat left top fixed; - background-color: #2277ad; - background-size: auto, 100% 100%; -} - -.landing-page.signedin .landing-background { - background: transparent; -} - -.landing-filter { - z-index: 0; - - position: absolute; - top: 0px; - bottom: 0px; - left: 0px; - right: 0px; -} - -.landing-content { - z-index: 2; - padding-left: 20px; - padding-right: 20px; -} - -.landing .call-to-action i.fa { - margin-left: 10px; -} - -.landing .call-to-action { - font-size: 18px; - padding-left: 14px; - padding-right: 14px; - padding-top: 2px; - padding-bottom: 2px; - - background: rgba(15, 131, 203, 0.6); - display: inline-block; - margin-top: 20px; -} - -.landing { - color: white; - - margin-bottom: 0px; - padding-top: 40px; - min-height: 440px; -} - -.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 .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; -} - -.signin-buttons { - text-align: center; -} - -.landing-signup-button { - 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 .twitter-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; } @@ -1409,68 +1200,13 @@ form input.ng-valid.ng-dirty, border-top: 4px solid #ccc; } -.landing .popover-content { - color: black; +.form-signup input { + margin: 12px; + margin-left: 0px; } -.landing-page .shoutout > i { - font-size: 50px; - display: inline-block; - width: 120px; - height: 120px; - background: #eee; +.signin-buttons { text-align: center; - border-radius: 50%; - line-height: 120px; -} - -.landing-page .shoutout > b { - font-size: 22px; - display: block; - line-height: 31px; - margin-top: 10px; - margin-bottom: 10px; -} - -.landing-page .shoutout { - font-size: 14px; - text-align: center; - line-height: normal; - padding-top: 30px; - margin-bottom: 15px; -} - -.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; } .footer-container, .push { @@ -3116,34 +2852,6 @@ p.editable:hover i { margin-bottom: 20px; } -.plan-manager-element .plans-list-table thead td { - color: #aaa; - font-weight: bold; -} - -.plan-manager-element .plans-list-table td { - padding: 10px; - font-size: 16px; - vertical-align: middle; -} - -.plan-manager-element .plans-list-table td.controls { - text-align: right; -} - -.plan-manager-element .plans-list-table .plan-price { - font-size: 16px; - margin-bottom: 0px; -} - -.plan-manager-element .plans-list-table .deprecated-plan { - color: #aaa; -} - -.plan-manager-element .plans-list-table .deprecated-plan-label { - font-size: 0.7em; -} - .plans-table-element table { margin: 20px; border: 1px solid #eee; @@ -3162,7 +2870,6 @@ p.editable:hover i { padding: 0px; } - .plans-table ul li { padding: 4px; margin: 0px; diff --git a/static/directives/header-bar.html b/static/directives/header-bar.html index b3b2111ea..ddab29e3f 100644 --- a/static/directives/header-bar.html +++ b/static/directives/header-bar.html @@ -7,7 +7,8 @@ ≡ - + {{ parseDate(subscription.trialEnd) | date }} + + +
+ data-title="Container Repository on Quay"> diff --git a/static/directives/tour-content.html b/static/directives/tour-content.html index f569f5a82..ad5b90a70 100644 --- a/static/directives/tour-content.html +++ b/static/directives/tour-content.html @@ -198,205 +198,17 @@
-
Run Quay.io Behind Your Firewall
+
-
- - + - -
- Quay.io has partnered with CoreOS to offer Enterprise Registry, a version - of Quay.io that can be hosted behind your firewall. + Run a private instance of Quay behind your firewall, with all the same build features and geo-replication. Fixed price for unlimited users and repositories.
-
-
-
-
- - - - - - - - - -
-

Deployment Made Easy

-

Trigger container builds when your code is checked into GitHub and passes tests. Automatically pushed into your repository for immediate access by your servers.

-
-
-
- - - - - - - - - - - - - - - - - - - - - - -
-

Teamwork Optimized

-

Control how the different teams and projects within your enterprise collaborate on repositories.

-
-
-
- - - - - - - - - - - - - - - -
-

Secure, Private Storage

-

Containers often contain keys and passwords — take control of your registry by running it behind your firewall on CoreOS Managed Linux.

-
-
-
diff --git a/static/img/QuayByCoreOS_horizontal_color.svg b/static/img/QuayByCoreOS_horizontal_color.svg new file mode 100644 index 000000000..7b4a2544a --- /dev/null +++ b/static/img/QuayByCoreOS_horizontal_color.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/QuayEnterprise_horizontal_color.svg b/static/img/QuayEnterprise_horizontal_color.svg new file mode 100644 index 000000000..8b6c0cb3a --- /dev/null +++ b/static/img/QuayEnterprise_horizontal_color.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/Quay_horizontal_color.svg b/static/img/Quay_horizontal_color.svg new file mode 100644 index 000000000..d8ccc161f --- /dev/null +++ b/static/img/Quay_horizontal_color.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/apple-touch-icon-114x114.png b/static/img/apple-touch-icon-114x114.png deleted file mode 100644 index 2c58782bd..000000000 Binary files a/static/img/apple-touch-icon-114x114.png and /dev/null differ diff --git a/static/img/apple-touch-icon-120x120.png b/static/img/apple-touch-icon-120x120.png deleted file mode 100644 index 3c86dfb4c..000000000 Binary files a/static/img/apple-touch-icon-120x120.png and /dev/null differ diff --git a/static/img/apple-touch-icon-144x144.png b/static/img/apple-touch-icon-144x144.png deleted file mode 100644 index ee4100f3a..000000000 Binary files a/static/img/apple-touch-icon-144x144.png and /dev/null differ diff --git a/static/img/apple-touch-icon-152x152.png b/static/img/apple-touch-icon-152x152.png deleted file mode 100644 index 5299d0854..000000000 Binary files a/static/img/apple-touch-icon-152x152.png and /dev/null differ diff --git a/static/img/apple-touch-icon-57x57.png b/static/img/apple-touch-icon-57x57.png deleted file mode 100644 index a7ae199c1..000000000 Binary files a/static/img/apple-touch-icon-57x57.png and /dev/null differ diff --git a/static/img/apple-touch-icon-60x60.png b/static/img/apple-touch-icon-60x60.png deleted file mode 100644 index 98f3fc6ee..000000000 Binary files a/static/img/apple-touch-icon-60x60.png and /dev/null differ diff --git a/static/img/apple-touch-icon-72x72.png b/static/img/apple-touch-icon-72x72.png deleted file mode 100644 index d29d35eb8..000000000 Binary files a/static/img/apple-touch-icon-72x72.png and /dev/null differ diff --git a/static/img/apple-touch-icon-76x76.png b/static/img/apple-touch-icon-76x76.png deleted file mode 100644 index d219bd709..000000000 Binary files a/static/img/apple-touch-icon-76x76.png and /dev/null differ diff --git a/static/img/apple-touch-icon.png b/static/img/apple-touch-icon.png deleted file mode 100644 index a7ae199c1..000000000 Binary files a/static/img/apple-touch-icon.png and /dev/null differ diff --git a/static/img/black-horizontal.svg b/static/img/black-horizontal.svg deleted file mode 100644 index b299889ce..000000000 --- a/static/img/black-horizontal.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/box-logo.png b/static/img/box-logo.png deleted file mode 100644 index 7e2ce7b4d..000000000 Binary files a/static/img/box-logo.png and /dev/null differ diff --git a/static/img/containers-back-black.jpg b/static/img/containers-back-black.jpg deleted file mode 100644 index 46d154d0f..000000000 Binary files a/static/img/containers-back-black.jpg and /dev/null differ diff --git a/static/img/containers.jpg b/static/img/containers.jpg deleted file mode 100644 index 8cbeaaa4b..000000000 Binary files a/static/img/containers.jpg and /dev/null differ diff --git a/static/img/docker-white-custom.png b/static/img/docker-white-custom.png new file mode 100644 index 000000000..afa44237c Binary files /dev/null and b/static/img/docker-white-custom.png differ diff --git a/static/img/dt-logo.png b/static/img/dt-logo.png deleted file mode 100644 index cb813b4d5..000000000 Binary files a/static/img/dt-logo.png and /dev/null differ diff --git a/static/img/landing-back copy.jpg b/static/img/landing-back copy.jpg deleted file mode 100644 index 73b278980..000000000 Binary files a/static/img/landing-back copy.jpg and /dev/null differ diff --git a/static/img/landing-back-opt.jpg b/static/img/landing-back-opt.jpg deleted file mode 100644 index 12454f43f..000000000 Binary files a/static/img/landing-back-opt.jpg and /dev/null differ diff --git a/static/img/landing-back-pattern-fast.jpg b/static/img/landing-back-pattern-fast.jpg deleted file mode 100644 index 6db12c79b..000000000 Binary files a/static/img/landing-back-pattern-fast.jpg and /dev/null differ diff --git a/static/img/landing-back-pattern.jpg b/static/img/landing-back-pattern.jpg deleted file mode 100644 index 102a9d30d..000000000 Binary files a/static/img/landing-back-pattern.jpg and /dev/null differ diff --git a/static/img/landing-back.jpg b/static/img/landing-back.jpg deleted file mode 100644 index 8cbc70f24..000000000 Binary files a/static/img/landing-back.jpg and /dev/null differ diff --git a/static/img/landing-icon-background.svg b/static/img/landing-icon-background.svg new file mode 100644 index 000000000..b3a59639d --- /dev/null +++ b/static/img/landing-icon-background.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/static/img/qe-legos.svg b/static/img/qe-legos.svg new file mode 100644 index 000000000..6d2bc0b9a --- /dev/null +++ b/static/img/qe-legos.svg @@ -0,0 +1,59 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/quay-logo-inverted-old.png b/static/img/quay-logo-inverted-old.png deleted file mode 100644 index 727d28b23..000000000 Binary files a/static/img/quay-logo-inverted-old.png and /dev/null differ diff --git a/static/img/quay-logo-old.png b/static/img/quay-logo-old.png index c6792d74b..3f7faf4c8 100644 Binary files a/static/img/quay-logo-old.png and b/static/img/quay-logo-old.png differ diff --git a/static/img/quay-logo.png b/static/img/quay-logo.png index 3f7faf4c8..4cf1219ed 100644 Binary files a/static/img/quay-logo.png and b/static/img/quay-logo.png differ diff --git a/static/img/quay_favicon.png b/static/img/quay_favicon.png new file mode 100644 index 000000000..8deb09a91 Binary files /dev/null and b/static/img/quay_favicon.png differ diff --git a/static/img/quay_pattern.png b/static/img/quay_pattern.png new file mode 100644 index 000000000..2f7cc1492 Binary files /dev/null and b/static/img/quay_pattern.png differ diff --git a/static/img/quay_pattern2x.png b/static/img/quay_pattern2x.png new file mode 100644 index 000000000..b5f9f753d Binary files /dev/null and b/static/img/quay_pattern2x.png differ diff --git a/static/img/rkt-horizontal-white.svg b/static/img/rkt-horizontal-white.svg new file mode 100644 index 000000000..3ecaa2848 --- /dev/null +++ b/static/img/rkt-horizontal-white.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/static/img/tectonic-bycoreos-color-sidebyside.svg b/static/img/tectonic-bycoreos-color-sidebyside.svg new file mode 100644 index 000000000..fcef6c503 --- /dev/null +++ b/static/img/tectonic-bycoreos-color-sidebyside.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/tectonic-bycoreos-color.svg b/static/img/tectonic-bycoreos-color.svg new file mode 100644 index 000000000..bc41bcbe6 --- /dev/null +++ b/static/img/tectonic-bycoreos-color.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/js/app.js b/static/js/app.js index 26c6c10fe..33747af7a 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -74,7 +74,7 @@ quayApp.config(['$tooltipProvider', function ($tooltipProvider) { // Configure the routes. quayApp.config(['$routeProvider', '$locationProvider', 'pages', function($routeProvider, $locationProvider, pages) { - var title = window.__config['REGISTRY_TITLE'] || 'Quay.io'; + var title = window.__config['REGISTRY_TITLE'] || 'Quay'; $locationProvider.html5Mode(true); @@ -203,7 +203,7 @@ if (window.__config && window.__config.SENTRY_PUBLIC_DSN) { quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanService', '$http', '$timeout', 'CookieService', 'Features', '$anchorScroll', 'UtilService', 'MetaService', 'UIService', function($location, $rootScope, Restangular, UserService, PlanService, $http, $timeout, CookieService, Features, $anchorScroll, UtilService, MetaService, UIService) { - var defaultTitle = window.__config['REGISTRY_TITLE'] || 'Quay.io'; + var defaultTitle = window.__config['REGISTRY_TITLE'] || 'Quay'; // Handle session security. Restangular.setDefaultRequestParams(['post', 'put', 'remove', 'delete'], {'_csrf_token': window.__token || ''}); diff --git a/static/js/directives/ui/header-bar.js b/static/js/directives/ui/header-bar.js index 243055df9..7fde5851d 100644 --- a/static/js/directives/ui/header-bar.js +++ b/static/js/directives/ui/header-bar.js @@ -51,6 +51,7 @@ angular.module('quay').directive('headerBar', function () { } }; + $scope.Config = Config; $scope.notificationService = NotificationService; $scope.searchingAllowed = false; $scope.searchVisible = false; @@ -159,7 +160,11 @@ angular.module('quay').directive('headerBar', function () { $scope.getEnterpriseLogo = function() { if (!Config.ENTERPRISE_LOGO_URL) { - return '/static/img/quay-logo.png'; + if (Features.BILLING) { + return '/static/img/QuayByCoreOS_horizontal_color.svg'; + } else { + return '/static/img/QuayEnterprise_horizontal_color.svg' + } } return Config.ENTERPRISE_LOGO_URL; diff --git a/static/js/pages/about.js b/static/js/pages/about.js index 0423cf9f6..303e2936c 100644 --- a/static/js/pages/about.js +++ b/static/js/pages/about.js @@ -5,7 +5,7 @@ angular.module('quayPages').config(['pages', function(pages) { pages.create('about', 'about.html', null, { 'title': 'About Us', - 'description': 'About Quay.io' + 'description': 'About Us' }); }]); }()); \ No newline at end of file diff --git a/static/js/pages/landing.js b/static/js/pages/landing.js index e0f2c4d45..3408c7fd6 100644 --- a/static/js/pages/landing.js +++ b/static/js/pages/landing.js @@ -84,7 +84,7 @@ $scope.getEnterpriseLogo = function() { if (!Config.ENTERPRISE_LOGO_URL) { - return '/static/img/quay-logo.png'; + return '/static/img/QuayEnterprise_horizontal_color.svg'; } return Config.ENTERPRISE_LOGO_URL; diff --git a/static/js/pages/plans.js b/static/js/pages/plans.js index 22b73d1bd..6d301d286 100644 --- a/static/js/pages/plans.js +++ b/static/js/pages/plans.js @@ -4,7 +4,8 @@ */ angular.module('quayPages').config(['pages', function(pages) { pages.create('plans', 'plans.html', PlansCtrl, { - 'title': 'Plans and Pricing' + 'title': 'Plans and Pricing', + 'newLayout': true }); }]); @@ -12,11 +13,22 @@ // Monitor any user changes and place the current user into the scope. UserService.updateUserIn($scope); + $('.plan-tabs a[data-toggle="tab"]').on('shown.bs.tab', function (e) { + $scope.$apply(function() { + $location.search({'tab': e.target.getAttribute('data-target').substr(1)}); + }); + }); + $scope.signedIn = function() { $('#signinModal').modal('hide'); PlanService.handleNotedPlan(); }; + $scope.qeStartTrial = function(plan) { + $scope.currentQEPlan = plan; + $('#tectonicManagerDialog').modal('show'); + }; + $scope.buyNow = function(plan) { PlanService.notePlan(plan); if ($scope.user && !$scope.user.anonymous) { @@ -30,9 +42,21 @@ PlanService.getPlans(function(plans) { $scope.plans = plans; + for (var i = 0; i < $scope.plans.length; ++i) { + var plan = plans[i]; + if (plan.privateRepos > 20 && !plan.plans_page_hidden) { + $scope.dropdownPlan = plan.stripeId; + break + } + } + if ($scope && $routeParams['trial-plan']) { $scope.buyNow($routeParams['trial-plan']); } + + if ($scope && $routeParams['tab'] == 'enterprise') { + $('#enterpriseTab').tab('show') + } }, /* include the personal plan */ true); } })(); \ No newline at end of file diff --git a/static/js/pages/repo-list.js b/static/js/pages/repo-list.js index 2009042e6..85885aaeb 100644 --- a/static/js/pages/repo-list.js +++ b/static/js/pages/repo-list.js @@ -11,7 +11,7 @@ }]); - function RepoListCtrl($scope, $sanitize, $q, Restangular, UserService, ApiService, CookieService) { + function RepoListCtrl($scope, $sanitize, $q, Restangular, UserService, ApiService, CookieService, Features) { $scope.namespace = null; $scope.page = 1; $scope.publicPageCount = null; @@ -19,6 +19,7 @@ $scope.loading = true; $scope.resources = []; $scope.showAsList = CookieService.get('quay.repoview') == 'list'; + $scope.Features = Features; // When loading the UserService, if the user is logged in, create a list of // relevant namespaces and collect the relevant repositories. diff --git a/static/js/pages/tour.js b/static/js/pages/tour.js index 47ca8ea4c..a9a8ce530 100644 --- a/static/js/pages/tour.js +++ b/static/js/pages/tour.js @@ -5,7 +5,7 @@ angular.module('quayPages').config(['pages', function(pages) { pages.create('tour', 'tour.html', TourCtrl, { 'title': 'Feature Tour', - 'description': 'Take a tour of Quay.io\'s features' + 'description': 'Take a tour of Quay\'s features' }); }]); diff --git a/static/js/pages/tutorial.js b/static/js/pages/tutorial.js index aaf8a9be5..67fa3bae3 100644 --- a/static/js/pages/tutorial.js +++ b/static/js/pages/tutorial.js @@ -6,7 +6,7 @@ pages.create('tutorial', 'tutorial.html', TutorialCtrl, { 'newLayout': true, 'title': 'Tutorial', - 'description': 'Basic tutorial on using Quay.io' + 'description': 'Basic tutorial on using Quay' }) }]); diff --git a/static/js/services/plan-service.js b/static/js/services/plan-service.js index eb841db36..972b341ab 100644 --- a/static/js/services/plan-service.js +++ b/static/js/services/plan-service.js @@ -363,7 +363,7 @@ function(KeyService, UserService, CookieService, ApiService, Features, Config) { email: email, amount: planDetails.price, currency: 'usd', - name: 'Quay.io ' + planDetails.title + ' Subscription', + name: 'Quay ' + planDetails.title + ' Subscription', description: 'Up to ' + planDetails.privateRepos + ' private repositories', panelLabel: opt_title || 'Subscribe', token: submitToken, diff --git a/static/partials/about.html b/static/partials/about.html index 01c40f277..5fcb36b07 100644 --- a/static/partials/about.html +++ b/static/partials/about.html @@ -25,7 +25,7 @@
Local Worker Bees
- 2 + 7
@@ -40,36 +40,9 @@

Our Story

-

Quay.io was originally created out of necessity when we wanted to use Docker containers with our original IDE product. We were using Docker containers to host and isolate server processes invoked on behalf of our users and often running their code. We started by building the Docker image dynamically whenever we spun up a new host node. The image was monolithic. It was too large, took too long to build, and was hard to manage conflicts. It was everything that Docker wasn't supposed to be. When we decided to split it up into pre-built images and host them somewhere, we noticed that there wasn't a good place to host images securely. Determined to scratch our own itch, we built Quay.io, and officially launched it as an aside in our presentation to the Docker New York City Meetup on October 2nd, 2013.

-

After launch, our customers demanded that Quay.io become our main focus. They rely on us to make sure they can store and distribute their Docker images, and we understand that solemn responsibility. Our customers have been fantastic with giving us great feedback and suggestions.

-

In August, 2014, Quay.io joined CoreOS to provide registry support for the enterprise. As ever, we are working as hard as we can to deliver on the promise and execute our vision of what a top notch Docker registry should be. -

-
- -
-
-

The Quay.io Team at CoreOS

- The Quay.io team is composed of two software engineers: -
-
-
-
-

Jacob Moshenko
- Co-Founder

-
- -
-

Jacob graduated from The University of Michigan with a Bachelors in Computer Engineering. From there he allowed his love of flight and mountains to lure him to Seattle where he took a job with Boeing Commercial Airplanes working on the world's most accurate flight simulator. When he realized how much he also loved web development, he moved to Amazon to work on the e-commerce back-end. Finally, desiring to move to New York City, he moved to Google, where he worked on several products related to Google APIs.

-
-
-
-
-

Joseph Schorr
- Co-Founder

-
- -
-

Joseph graduated from University of Pennsylvania with a Bachelors and Masters in Computer Science. After a record setting (probably) five internships with Google, he took a full time position there to continue his work on exciting products such as Google Spreadsheets, the Google Closure Compiler, and Google APIs.

+

Quay was originally created out of necessity when we wanted to use Docker containers with our original IDE product. We were using Docker containers to host and isolate server processes invoked on behalf of our users and often running their code. We started by building the Docker image dynamically whenever we spun up a new host node. The image was monolithic. It was too large, took too long to build, and was hard to manage conflicts. It was everything that Docker wasn't supposed to be. When we decided to split it up into pre-built images and host them somewhere, we noticed that there wasn't a good place to host images securely. Determined to scratch our own itch, we built Quay, and officially launched it as an aside in our presentation to the Docker New York City Meetup on October 2nd, 2013.

+

After launch, our customers demanded that Quay become our main focus. They rely on us to make sure they can store and distribute their container images, and we understand that solemn responsibility. Our customers have been fantastic with giving us great feedback and suggestions.

+

In August, 2014, Quay joined CoreOS to provide registry support for the enterprise. As ever, we are working as hard as we can to deliver on the promise and execute our vision of what a top notch container registry should be.

diff --git a/static/partials/landing-login.html b/static/partials/landing-login.html index 638b809d2..571f571df 100644 --- a/static/partials/landing-login.html +++ b/static/partials/landing-login.html @@ -1,14 +1,12 @@
-
- - + -

Enterprise Registry

diff --git a/static/partials/landing-normal.html b/static/partials/landing-normal.html index 85181fd05..7c1513d10 100644 --- a/static/partials/landing-normal.html +++ b/static/partials/landing-normal.html @@ -1,26 +1,18 @@
-
-
+
-
- Thank you for registering! We have sent you an activation email. - You must verify your email address before you can continue. +

Build, Store and Distribute your Containers

+

Powerful Build Triggers. Advanced Team Permissions. Secure Storage.

+ +
+ Works with + + + Supports Docker and rkt images. Images are transformed on the fly, allowing you to push Docker and pull rkt.
- -
-
-
-

Secure hosting for private Docker* repositories

-

Use the Docker images your team needs with the safety of private repositories

- Start your free 30 day trial today -
- -
- -
-
-
@@ -30,30 +22,27 @@
- Private Storage + Private Storage - Push and pull Docker images to a private registry, with a focus on user experience + Push and pull Docker and rkt images to a private registry, with a focus on user experience for your developers. - View Features
- Teamwork Optimized + Teamwork Optimized - Specially designed for teams, organizations and businesses that use Docker. + Specially designed for organizations with multiple teams that manage their own containers and permissions. - View Teams and Organizations
- Deployment Made Easy + Deployment Made Easy - Tools and Solutions that help make your application deployment simple and straightforward. + Integrations with GitHub and other tools to make deployments simple and automated. - View Solutions
@@ -132,8 +121,8 @@
- 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! + Quay has become an essential part of our infrastructure as we move to Docker-based deploys. + The support and service that the Quay team provides is phenomenal. We couldn't do it without them!
@@ -149,7 +138,7 @@
-

See what other people are saying about Quay.io

+

See what other people are saying about Quay

@@ -220,10 +209,10 @@
-

Start pushing to Quay.io in under a minute

+

Start pushing to Quay in under a minute

diff --git a/static/partials/plans.html b/static/partials/plans.html index a9ad82c6b..65fee3cfc 100644 --- a/static/partials/plans.html +++ b/static/partials/plans.html @@ -1,152 +1,607 @@ -
-
-
-