diff --git a/fonts/clearsans-bold-webfont.ttf b/fonts/clearsans-bold-webfont.ttf deleted file mode 100755 index 710166c79c..0000000000 Binary files a/fonts/clearsans-bold-webfont.ttf and /dev/null differ diff --git a/fonts/clearsans-bolditalic-webfont.ttf b/fonts/clearsans-bolditalic-webfont.ttf deleted file mode 100755 index 1cc7838060..0000000000 Binary files a/fonts/clearsans-bolditalic-webfont.ttf and /dev/null differ diff --git a/fonts/clearsans-italic-webfont.ttf b/fonts/clearsans-italic-webfont.ttf deleted file mode 100755 index c67d772cb9..0000000000 Binary files a/fonts/clearsans-italic-webfont.ttf and /dev/null differ diff --git a/fonts/clearsans-light-webfont.ttf b/fonts/clearsans-light-webfont.ttf deleted file mode 100755 index 295bf8ef94..0000000000 Binary files a/fonts/clearsans-light-webfont.ttf and /dev/null differ diff --git a/fonts/clearsans-medium-webfont.ttf b/fonts/clearsans-medium-webfont.ttf deleted file mode 100755 index a1cc3c54d5..0000000000 Binary files a/fonts/clearsans-medium-webfont.ttf and /dev/null differ diff --git a/fonts/clearsans-mediumitalic-webfont.ttf b/fonts/clearsans-mediumitalic-webfont.ttf deleted file mode 100755 index 17f338c341..0000000000 Binary files a/fonts/clearsans-mediumitalic-webfont.ttf and /dev/null differ diff --git a/fonts/clearsans-regular-webfont.ttf b/fonts/clearsans-regular-webfont.ttf deleted file mode 100755 index 248778b300..0000000000 Binary files a/fonts/clearsans-regular-webfont.ttf and /dev/null differ diff --git a/fonts/clearsans-thin-webfont.ttf b/fonts/clearsans-thin-webfont.ttf deleted file mode 100755 index 69a6219cbc..0000000000 Binary files a/fonts/clearsans-thin-webfont.ttf and /dev/null differ diff --git a/images/roundedcontainer.png b/images/roundedcontainer.png deleted file mode 100644 index 897e09e792..0000000000 Binary files a/images/roundedcontainer.png and /dev/null differ diff --git a/images/roundedcontainer@2x.png b/images/roundedcontainer@2x.png deleted file mode 100644 index a220e3d093..0000000000 Binary files a/images/roundedcontainer@2x.png and /dev/null differ diff --git a/images/running 2.png b/images/running 2.png deleted file mode 100644 index 4a81d6da97..0000000000 Binary files a/images/running 2.png and /dev/null differ diff --git a/images/running 2@2x.png b/images/running 2@2x.png deleted file mode 100644 index f72445227e..0000000000 Binary files a/images/running 2@2x.png and /dev/null differ diff --git a/src/ContainerModal.react.js b/src/ContainerModal.react.js deleted file mode 100644 index a78ef0edd0..0000000000 --- a/src/ContainerModal.react.js +++ /dev/null @@ -1,248 +0,0 @@ -var $ = require('jquery'); -var assign = require('object-assign'); -var React = require('react/addons'); -var Modal = require('react-bootstrap').Modal; -var OverlayTrigger = require('react-bootstrap'); -var Popover = require('react-bootstrap/Popover'); -var RetinaImage = require('react-retina-image'); -var ContainerStore = require('./ContainerStore'); -var OverlayTrigger = require('react-bootstrap/OverlayTrigger'); -var Popover = require('react-bootstrap/Popover'); - -var ContainerModal = React.createClass({ - _searchRequest: null, - getInitialState: function () { - return { - query: '', - results: ContainerStore.recommended(), - loading: false, - tags: {}, - active: null, - }; - }, - componentDidMount: function () { - this.refs.searchInput.getDOMNode().focus(); - ContainerStore.on(ContainerStore.CLIENT_RECOMMENDED_EVENT, this.update); - }, - update: function () { - if (!this.state.query.length) { - this.setState({ - results: ContainerStore.recommended() - }); - } - }, - search: function (query) { - if (this._searchRequest) { - this._searchRequest.abort(); - this._searchRequest = null; - } - - if (!query.length) { - return; - } - - this.setState({ - loading: true - }); - - var self = this; - this._searchRequest = $.get('https://registry.hub.docker.com/v1/search?q=' + query, function (result) { - self.setState({ - query: query, - loading: false - }); - self._searchRequest = null; - if (self.isMounted()) { - self.setState(result); - } - }); - }, - handleChange: function (e) { - var query = e.target.value; - - if (query === this.state.query) { - return; - } - - clearTimeout(this.timeout); - if (!query.length) { - this.setState({ - query: query, - results: ContainerStore.recommended() - }); - } else { - var self = this; - this.timeout = setTimeout(function () { - self.search(query); - }, 200); - } - }, - handleClick: function (name) { - this.props.onRequestHide(); - ContainerStore.create(name, 'latest', function (err) { - if (err) { - throw err; - } - }.bind(this)); - }, - handleTagClick: function (tag, name) { - this.props.onRequestHide(); - ContainerStore.create(name, tag, function () {}); - }, - handleDropdownClick: function (name) { - this.setState({ - active: name - }); - if (this.state.tags[name]) { - return; - } - $.get('https://registry.hub.docker.com/v1/repositories/' + name + '/tags', function (result) { - var res = {}; - res[name] = result; - console.log(assign(this.state.tags, res)); - this.setState({ - tags: assign(this.state.tags, res) - }); - }.bind(this)); - }, - handleModalClick: function (event) { - if (!this.state.active) { - return; - } - if (!$('.popover').is(event.target)) { - this.setState({ - active: null - }); - } - }, - componentDidUpdate: function () { - if (!this.state.active) { - return; - } - var $dropdown = $(this.getDOMNode()).find('[data-name="' + this.state.active + '"]'); - var $popover = $(this.getDOMNode()).find('.popover'); - - $popover.offset({ - top: $dropdown.offset().top + 32, - left: $dropdown.offset().left - $popover.width() / 2 + 11 - }); - }, - render: function () { - var self = this; - var data = this.state.results.slice(0, 7); - - var results; - if (data.length) { - var items = data.map(function (r) { - var name; - if (r.is_official) { - name = {r.name}; - } else { - name = {r.name}; - } - - return ( -
  • -
    -
    - {name} -
    -
    -
    -
    {r.star_count}
    -
    -
    -
    -
    - - -
    -
    -
  • - ); - }); - - results = ( -
    - -
    - ); - } else { - results = ( -
    -

    - No Results -

    -
    - ); - } - - var title = this.state.query ? 'Results' : 'Recommended'; - var loadingClasses = React.addons.classSet({ - hidden: !this.state.loading, - loading: true - }); - var magnifierClasses = React.addons.classSet({ - hidden: this.state.loading, - icon: true, - 'icon-magnifier': true, - 'search-icon': true - }); - - var question = ( -
    - An image is a template for a container.}> - What's an image? - -
    - ); - - var tagData = self.state.tags[this.state.active]; - var tags; - if (tagData) { - var list = tagData.map(function (t) { - return
  • {t.name}
  • ; - }); - tags = ( - - ); - } else { - tags = ; - } - - var popoverClasses = React.addons.classSet({ - popover: true, - hidden: !this.state.active - }); - - return ( - -
    -
    -
    - -
    - -
    - {question} -
    -
    {title}
    - {results} -
    -
    - - {tags} - -
    -
    - ); - } -}); - -module.exports = ContainerModal; diff --git a/src/Header.react.js b/src/Header.react.js index 69b20baf08..c608d710fa 100644 --- a/src/Header.react.js +++ b/src/Header.react.js @@ -40,9 +40,9 @@ var Header = React.createClass({ return (
    -
    -
    -
    +
    +
    +
    @@ -51,9 +51,9 @@ var Header = React.createClass({ return (
    -
    -
    -
    +
    +
    +
    diff --git a/styles/animation.less b/styles/animation.less new file mode 100644 index 0000000000..641545c055 --- /dev/null +++ b/styles/animation.less @@ -0,0 +1,36 @@ +@-webkit-keyframes spin { + from { + -webkit-transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + } +} + +@-webkit-keyframes translatewave { + from { + -webkit-transform: translateX(0px); + } + to { + -webkit-transform: translateX(20px); + } +} + +@-webkit-keyframes translatedownload { + 0% { + -webkit-transform: translateY(6px); + opacity: 0; + } + 25% { + opacity: 1; + -webkit-transform: translateY(6px); + } + 50% { + opacity: 1; + -webkit-transform: translateY(20px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(20px); + } +} diff --git a/styles/clearsans.less b/styles/clearsans.less deleted file mode 100644 index 5456dc2740..0000000000 --- a/styles/clearsans.less +++ /dev/null @@ -1,56 +0,0 @@ -@font-face { - font-family: 'Clear'; - src: url('clearsans-regular-webfont.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Clear Sans'; - src: url('clearsans-medium-webfont.ttf') format('truetype'); - font-weight: 500; - font-style: normal; -} - -@font-face { - font-family: 'Clear Sans'; - src: url('clearsans-light-webfont.ttf') format('truetype'); - font-weight: 300; - font-style: normal; -} - -@font-face { - font-family: 'Clear Sans'; - src: url('clearsans-thin-webfont.ttf') format('truetype'); - font-weight: 100; - font-style: normal; -} - -@font-face { - font-family: 'Clear Sans'; - src: url('clearsans-mediumitalic-webfont.ttf') format('truetype'); - font-weight: 500; - font-style: italic; -} - -@font-face { - font-family: 'Clear Sans'; - src: url('clearsans-italic-webfont.ttf') format('truetype'); - font-weight: normal; - font-style: italic; - -} - -@font-face { - font-family: 'Clear Sans'; - src: url('clearsans-bolditalic-webfont.ttf') format('truetype'); - font-weight: 700; - font-style: italic; -} - -@font-face { - font-family: 'Clear Sans'; - src: url('clearsans-bold-webfont.ttf') format('truetype'); - font-weight: 700; - font-style: normal; -} diff --git a/styles/container-home.less b/styles/container-home.less new file mode 100644 index 0000000000..6f2c021f5d --- /dev/null +++ b/styles/container-home.less @@ -0,0 +1,170 @@ +.details-panel.home { + background-color: #F9F9F9; + overflow: hidden; + .content { + display: flex; + flex: 1 auto; + flex-direction: row; + padding: 10px 27px; + .left { + width: 60%; + flex-direction: column; + margin-right: 30px; + } + .right { + width: 40%; + flex-direction: column; + } + .web-preview { + margin-bottom: 50px; + .subtext { + text-align: right; + color: @gray-lightest; + margin-top: 2px; + transition: all 0.25s; + &:hover { + color: darken(@gray-lightest, 10%); + } + } + .widget { + background-color: white; + width: 100%; + height: 100%; + border-radius: 4px; + border: 1px solid @gray-lightest; + position: relative; + overflow: hidden; + p { + font-size: 13px; + color: @gray-normal; + padding: 10px; + padding-bottom: 0px; + } + .ip-port { + padding: 20px; + padding-top: 5px; + color: @gray-darkest; + font-family: Menlo; + -webkit-user-select: text; + } + .frame { + border: 0; + position: absolute; + left: -100%; + top: -100%; + height: 400%; + width: 401%; + transform: scale(0.5); + } + .frame-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + color: transparent; + transition: all 0.25s; + .icon { + margin-top: 40%; + display: block; + font-size: 60px; + text-align: center; + } + .text { + font-size: 20px; + text-align: center; + } + &:hover { + color: white; + background-color: @gray-darkest; + opacity: 0.75; + } + } + } + } + .mini-logs { + margin-bottom: 50px; + .widget { + position: relative; + border-radius: 4px; + border: 1px solid @gray-lightest; + background-color: @gray-darkest; + color: @gray-lightest; + height: 100%; + padding: 10px; + overflow: hidden; + font-family: Menlo; + font-size: 7px; + white-space: pre; + .logs { + overflow: hidden; + height: 100%; + } + p { + margin-bottom: 0px; + } + .mini-logs-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + color: transparent; + transition: all 0.25s; + .icon { + margin-top: 25%; + display: block; + font-size: 60px; + text-align: center; + } + .text { + font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-size: 20px; + text-align: center; + } + &:hover { + color: white; + background-color: @gray-darkest; + opacity: 0.75; + } + } + } + } + .folders { + .subtext { + text-align: right; + color: @gray-lightest; + margin-top: 2px; + transition: all 0.25s; + &:hover { + color: darken(@gray-lightest, 10%); + } + } + .widget { + padding: 10px 5px; + background-color: white; + border-radius: 4px; + border: 1px solid @gray-lightest; + display: flex; + .folder { + width: 110px; + padding: 5px; + &:hover { + background-color: #F9F9F9; + border-radius: 10px; + } + img { + display: block; + margin: 0 auto; + } + .text { + margin-top: 4px; + text-align: center; + } + } + } + } + } +} diff --git a/styles/container-logs.less b/styles/container-logs.less new file mode 100644 index 0000000000..cf72ca0cca --- /dev/null +++ b/styles/container-logs.less @@ -0,0 +1,12 @@ +.details-panel.logs { + background-color: @gray-darkest; + -webkit-user-select: text; + font-family: Menlo; + font-size: 12px; + padding: 20px 18px; + color: @gray-lightest; + white-space: pre-wrap; + p { + margin-bottom: 0px; + } +} diff --git a/styles/container-modal.less b/styles/container-modal.less deleted file mode 100644 index 295f9f25f7..0000000000 --- a/styles/container-modal.less +++ /dev/null @@ -1,207 +0,0 @@ -.create-modal { - @modal-padding: 32px; - @search-width: 372px; - @custom-width: 0; - .modal-dialog { - margin-top: 80px; - width: calc(@modal-padding + @search-width + 2 * @modal-padding + @custom-width); - } - .modal-content { - //box-shadow: 0 3px 15px rgba(0, 0, 0, 0.2); - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.10); - border: none; //1px solid #ccc; - height: 610px; - display: flex; - - } - .modal-body { - flex: 1 auto; - display: flex; - flex-direction: row; - padding: 32px 32px; - - .popover { - width: 180px; - text-align: center; - - .popover-content { - max-height: 160px; - padding: 0; - overflow: auto; - } - ul { - padding: 0; - list-style: none; - margin: 0; - li { - padding: 8px 0; - border-bottom: 1px solid #eee; - - &:hover { - color: white; - background: @brand-primary; - } - } - } - .tags-loading { - text-align: center; - margin: 14px auto; - text-align: center; - -webkit-animation-name: spin; - -webkit-animation-duration: 1.8s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; - } - } - - section.search { - min-width: 404px; - - .question { - text-align: right; - } - - .search-bar { - position: relative; - .loading { - position: absolute; - left: 13px; - top: 10px; - width: 20px; - height: 20px; - -webkit-animation-name: spin; - -webkit-animation-duration: 1.8s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; - } - .search-icon { - font-size: 20px; - color: @gray-lighter; - position: absolute; - top: 9px; - left: 14px; - } - input { - border-radius: 20px; - font-size: 13px; - height: 38px; - padding: 8px 16px 8px 40px; - color: @gray-darkest; - margin-bottom: 3px; - border-color: @gray-lightest; - box-shadow: none; - - &:focus { - box-shadow: none; - border-color: @gray-lighter; - } - - &::-webkit-input-placeholder { - color: #ddd; - font-weight: 300; - } - } - } - - .results { - overflow: auto; - padding-bottom: 80px; - - .no-results { - text-align: center; - h3 { - color: #ABC0C0; - font-size: 16px; - margin-top: 160px; - } - } - - .title { - flex: 0 auto; - margin-top: 16px; - } - - ul { - margin-top: 10px; - list-style: none; - padding: 0; - - li { - &:hover { - background-color: lighten(@gray-lightest, 17.5%); - } - display: flex; - flex-direction: row; - padding: 8px 14px 5px 14px; - //margin: 12px; - border-bottom: 1px solid #eee; - &:last-child { - border-bottom: 0; - } - .info { - .name { - color: @gray-darkest; - max-width: 278px; - img { - margin-right: 6px; - margin-left: 2px; - } - font-size: 16px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - .properties { - color: @gray-lighter; - margin-top: 2px; - - .star-count { - font-size: 10px; - display: inline-block; - position: relative; - top: -3px; - left: 1px; - height: 17px; - } - - .icon { - overflow: hidden; - display: inline-block; - font-size: 15px; - height: 15px; - } - } - flex: 0 auto; - } - .action { - position: relative; - top: 5px; - text-align: right; - flex: 1 auto; - ul { - text-align: center; - ul { - overflow: auto; - max-height: 300px; - } - } - - - .icon { - position: relative; - top: 2px; - font-size: 11px; - } - } - } - } - } - } - } -} - -.modal-backdrop.in { - background: rgba(227,230,230,0.95); - opacity: 1; - height: 100%; -} diff --git a/styles/container-settings.less b/styles/container-settings.less new file mode 100644 index 0000000000..616f962f26 --- /dev/null +++ b/styles/container-settings.less @@ -0,0 +1,202 @@ +.details-panel .settings { + display: flex; + flex: 1 auto; + flex-direction: row; + .settings-menu { + min-width: 180px; + flex: 0 auto; + ul { + position: fixed; + margin: 0; + padding: 0; + padding-top: 14px; + + display: flex; + flex-direction: column; + + a { + min-width: 160px; + margin-left: 12px; + color: @gray-normal; + flex-shrink: 0; + cursor: default; + outline: none; + margin-bottom: 10px; + &.active { + li { + color: white; + border-radius: 40px; + background-image: linear-gradient(-180deg, #24B8EB 4%, #24A3EB 100%); + } + } + &:hover { + text-decoration: none; + li { + cursor: default; + border-radius: 40px; + background-color: #F9F9F9; + } + } + &:focus { + text-decoration: none; + } + } + + li { + vertical-align: middle; + padding: 5px 12px; + display: flex; + flex-direction: row; + } + } + } + .settings-panel { + padding-left: 20px; + flex: 1 auto; + overflow-x: hidden; + .settings-section { + margin-bottom: 40px; + } + .container-name { + margin-bottom: 20px; + input { + width: 40%; + } + p { + font-weight: 300; + margin-top: 5px; + color: @gray-lighter; + font-size: 12px; + strong { + font-weight: 500; + } + } + } + .env-vars-labels { + width: 100%; + font-size: 12px; + color: @gray-lightest; + margin-left: 5px; + margin-bottom: 5px; + margin-top: 20px; + .label-key { + display: inline-block; + margin-right: 30px; + width: 30%; + } + .label-val { + display: inline-block; + width: 50%; + } + } + .env-vars { + margin-bottom: 20px; + .keyval-row { + margin-bottom: 5px; + } + input { + margin-right: 30px; + &.key { + width: 30%; + } + &.val { + width: 50%; + } + } + } + .table { + margin-bottom: 0; + .icon-arrow-right { + color: #BBB; + font-size: 20px; + margin: 0px 10px; + flex: 0 auto; + min-width: 13px; + } + &.ports { + .table-labels { + margin-top: 20px; + flex: 1 auto; + display: flex; + font-size: 12px; + color: @gray-lightest; + .label-left { + flex: 0 auto; + min-width: 85px; + margin-right: 30px; + text-align: right; + } + .label-right { + flex: 1 auto; + display: inline-block; + margin-left: 10px; + width: 40%; + } + } + .table-values { + flex: 1 auto; + display: flex; + flex-direction: row; + margin: 8px 0; + .value-left { + text-align: right; + min-width: 85px; + flex: 0 auto; + padding: 0px; + } + .value-right { + flex: 1 auto; + -webkit-user-select: text; + max-width: 170px; + padding: 0px; + } + label { + margin-left: 8px; + margin-top: 1px; + font-weight: 400; + font-size: 13px; + } + input[type="checked"] { + + } + } + } + &.volumes { + .table-labels { + margin-top: 20px; + flex: 1 auto; + display: flex; + font-size: 12px; + color: @gray-lightest; + .label-left { + flex: 0 auto; + margin-right: 30px; + } + .label-right { + flex: 1 auto; + display: inline-block; + margin-left: 10px; + } + } + .table-values { + flex: 1 auto; + display: flex; + flex-direction: row; + margin: 8px 0; + .value-left { + flex: 0 auto; + padding: 0px; + } + .value-right { + flex: 1 auto; + -webkit-user-select: text; + padding: 0px; + } + .btn { + margin-left: 10px; + } + } + } + } + } +} diff --git a/styles/containers.less b/styles/containers.less deleted file mode 100644 index c4b34c11ca..0000000000 --- a/styles/containers.less +++ /dev/null @@ -1,1121 +0,0 @@ -.popover { - - &.popover-view { - min-width: 364px; - } - - &.popover-volume { - min-width: 480px; - } - - .popover-content { - display: flex; - flex-direction: column; - padding: 14px 14px 20px; - - .question { - margin: 12px 6px 6px; - } - } -} - -.result-grid { - display: flex; - flex-flow: row wrap; - justify-content: flex-start; - margin-top: 10px; - overflow: auto; - .image-item { - display: flex; - width: 320px; - height: 166px; - border-radius: 4px; - border: 1px solid @gray-lightest; - background-color: white; - margin-right: 20px; - margin-bottom: 20px; - .tag-overlay { - z-index: 999; - background-color: rgba(0,0,0,0.8); - border-radius: 4px; - width: 320px; - height: 166px; - position: absolute; - color: white; - font-size: 13px; - display: none; - padding: 10px; - .tag-list { - display: flex; - flex-direction: row; - align-items: flex-start; - align-content: flex-start; - flex-flow: row wrap; - height: 140px; - overflow: auto; - .tag { - display: inline-block; - flex: 0 auto; - margin-right: 2px; - padding: 3px 5px; - &:hover { - background-color: rgba(255,255,255,0.2); - border-radius: 20px; - } - } - } - .tags-loading { - position: relative; - left: 42%; - top: 20%; - text-align: center; - margin: 14px auto; - -webkit-animation-name: spin; - -webkit-animation-duration: 1.8s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; - } - } - .logo { - flex: 1 auto; - min-width: 90px; - background-color: @brand-action; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - justify-content: center; - text-align: center; - img { - margin-top: 15px; - } - } - .card { - padding: 10px 20px 10px 20px; - .name { - font-size: 18px; - color: @gray-darkest; - margin-bottom: 5px; - width: 190px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - img { - margin-right: 7px; - position: relative; - top: -1px; - } - } - .description { - font-size: 12px; - color: @gray-normal; - height: 65px; - text-overflow: ellipsis; - overflow: hidden; - -webkit-box-orient: vertical; - -webkit-line-clamp: 4; - display: -webkit-box; - word-wrap: break-word; - } - .actions { - width: 190px; - padding-top: 25px; - .stars { - height: 15px; - font-size: 10px; - color: @gray-darker; - border-right: 1px solid @gray-lightest; - padding-right: 10px; - .icon { - position: relative; - font-size: 16px; - margin-right: 3px; - top: -1px; - color: @gray-darkest; - } - .text { - position: relative; - top: -6px; - } - } - .tags { - height: 15px; - font-size: 10px; - color: @gray-darker; - padding-left: 10px; - .icon { - position: relative; - font-size: 11px; - margin-right: 2px; - top: 2px; - color: @gray-darkest; - } - .text { - position: relative; - top: 0px; - padding: 3px 5px; - text-decoration: underline; - &:hover { - background-color: @brand-action; - color: white; - border-radius: 20px; - } - } - } - .action { - flex: 1 auto; - .btn { - text-align: right; - position: relative; - float: right; - top: -7px; - } - } - display: flex; - flex-direaction: row; - position: relative; - bottom: 0px; - } - } - } -} - -.new-container { - display: flex; - flex: 1 auto; - flex-direction: column; - padding: 35px 20px 32px 25px; - .results { - display: flex; - flex-direction: column; - flex: 1 auto; - .no-results { - flex: 1 auto; - display: flex; - align-items: center; - .loader { - margin: 0 auto; - margin-top: -20%; - text-align: center; - width: 300px; - h2 { - margin-bottom: 20px; - } - } - h1 { - color: @gray-lightest; - font-size: 24px; - margin: 0 auto; - margin-top: -20%; - } - } - } - .new-container-header { - margin-bottom: 18px; - display: flex; - flex: 0 auto; - .text { - flex: 1 auto; - width: 50%; - font-size: 14px; - color: @gray-lighter; - } - .search { - flex: 1 auto; - margin-right: 30px; - .search-bar { - top: -7px; - position: relative; - .loading { - position: absolute; - left: 10px; - top: 7px; - width: 16px; - height: 16px; - -webkit-animation-name: spin; - -webkit-animation-duration: 1.8s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; - } - .search-icon { - font-size: 18px; - color: @gray-lighter; - position: absolute; - top: 5px; - left: 10px; - } - input { - border-radius: 20px; - font-size: 12px; - height: 30px; - padding: 4px 8px 4px 35px; - color: @gray-darkest; - margin-bottom: 3px; - border-color: @gray-lightest; - box-shadow: none; - - &:focus { - box-shadow: none; - border-color: @gray-lighter; - } - - &::-webkit-input-placeholder { - color: #CCC; - font-weight: 400; - } - } - } - } - } -} - -.containers { - box-sizing: border-box; - height: 100%; - display: flex; - flex-direction: column; - .containers-body { - flex: 1; - display: flex; - flex-direction: row; - - padding: 0px; - - .sidebar { - padding-top: 28px; - background-color: white; - display: flex; - flex-direction: column; - min-width: 260px; - margin: 0; - box-sizing: border-box; - border-right: 1px solid #DCE2E2; - - .sidebar-header { - flex: 0 auto; - min-width: 240px; - min-height: 47px; - display: flex; - border-bottom: 1px solid transparent; - transition: border-bottom 0.25s; - //padding: 0px 10px 0px 10px; - - &.sep { - border-bottom: 1px solid #eee; - box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.03); - } - - h4 { - align-self: flex-start; - //padding: 0 24px; - padding-left: 26px; - margin: 14px 0 0; - display: inline-block; - position: relative; - } - - .create { - flex: 1 auto; - text-align: right; - margin-right: 20px; - margin-top: 3px; - - .btn-new { - font-size: 24px; - color: @brand-action; - transition: all 0.25s; - &:hover { - color: darken(@brand-action, 15%); - } - } - } - } - - .sidebar-containers { - position: relative; - flex: 1 auto; - overflow-y: auto; - overflow-x: hidden; - box-sizing: border-box; - max-width: 260px; - - &.sep { - border-top: 1px solid #eee; - } - - ul { - margin: 0; - padding: 0; - - display: flex; - flex-direction: column; - - .new-container-item { - .info { - position: relative; - top: 9px; - } - } - - a { - color: inherit; - flex-shrink: 0; - cursor: default; - outline: none; - &.active { - background: @brand-primary; - li { - height: 57px; - border-bottom: none; - background-image: linear-gradient(-180deg, #24B8EB 4%, #24A3EB 100%); - .name { - color: white; - } - .image { - color: white; - opacity: 0.8; - } - .btn-delete { - font-size: 24px; - color: white; - position: relative; - z-index: 9999; - } - .state-new { - .at2x('container-white.png', 20px, 20px); - } - .state-running { - .at2x('running-white.png', 20px, 20px); - - .runningwave { - .at2x('runningwave-white.png', 20px, 20px); - } - } - .state-stopped { - .at2x('stopped-white.png', 20px, 20px); - } - .state-downloading { - .at2x('downloading-white.png', 20px, 20px); - - .downloading-arrow { - .at2x('downloading-arrow-white.png', 20px, 20px); - } - } - } - } - - &:hover { - text-decoration: none; - cursor: default; - } - &:focus { - text-decoration: none; - } - } - - li { - vertical-align: middle; - padding: 10px 16px 10px 26px; - - display: flex; - flex-direction: row; - height: 57px; - - - .info { - font-size: 13px; - margin-left: 16px; - .name { - text-overflow: ellipsis; - max-width: 140px; - white-space: nowrap; - overflow: hidden; - font-size: 14px; - font-weight: 400; - color: @gray-darkest; - } - .image { - color: @gray-lighter; - font-size: 12px; - font-weight: 400; - text-overflow: ellipsis; - max-width: 140px; - white-space: nowrap; - overflow: hidden; - } - } - - .action { - display: none; - flex: 1; - position: relative; - top: 5px; - text-align: right; - margin-right: 4px; - .btn-delete { - font-size: 24px; - color: @gray-lighter; - position: relative; - z-index: 9999; - } - } - - .state { - margin-top: 9px; - display: inline-block; - position: relative; - min-width: 20px; - height: 20px; - } - - .state-error { - .at2x('error.png', 20px, 20px); - } - - .state-stopped { - .at2x('stopped.png', 20px, 20px); - } - - .state-paused { - .at2x('paused.png', 20px, 20px); - } - - .state-new { - .at2x('container.png', 20px, 20px); - } - - .state-downloading { - .at2x('downloading.png', 20px, 20px); - overflow: hidden; - - .downloading-arrow { - width: 20px; - height: 20px; - .at2x('downloading-arrow.png', 20px, 20px); - position: absolute; - // background-repeat: repeat; - -webkit-animation-name: translatedownload; - -webkit-animation-duration: 1.8s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; - } - } - - .state-running { - .at2x('running.png', 20px, 20px); - overflow: hidden; - // -webkit-mask-image: -webkit-radial-gradient(circle, white, black); - - .runningwave { - position: absolute; - width: 40px; - height: 20px; - left: -20px; - .at2x('runningwave.png', 20px, 20px); - // background-repeat: repeat; - -webkit-animation-name: translatewave; - -webkit-animation-duration: 8.0s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; - } - } - - .state-restarting { - display: inline-block; - width: 20px; - height: 20px; - .at2x('restarting.png', 20px, 20px); - background-repeat: repeat-x; - -webkit-animation-delay: -1s; - -webkit-animation-name: rotate; - -webkit-animation-duration: 3.0s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; - } - } - } - } - } - - .no-containers { - flex: 1 auto; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - position: relative; - - h3 { - position: relative; - top: -44px; - font-size: 18px; - color: #C7D7D7; - } - } - - .details { - background-color: #F9F9F9; - margin: 0; - padding: 0; - box-sizing: border-box; - - flex: 1; - - display: flex; - flex-direction: column; - - .details-subheader { - flex: 0 auto; - display: flex; - flex-direction: row; - position: relative; - //border-top: 1px solid #EEE; - border-bottom: 1px solid #DCE2E2; - background-color: white; - height: 57px; - padding: 6px 10px 10px 24px; - font-size: 13px; - color: @gray-normal; - - .image { - flex: 1 auto; - //margin: 7px 0px 0px 16px; - margin-top: 1px; - font-size: 13px; - color: @gray-normal; - //font-weight: 300; - img { - width: 30px; - height: 18px; - position: relative; - top: -2px; - margin-right: 10px; - } - } - - .details-header-actions { - flex: 1 auto; - text-align: left; - margin-top: -12px; - .action { - display: inline-block; - &.disabled { - opacity: 0.3; - } - .action-icon { - color: @gray-normal; - font-size: 30px; - margin-right: 20px; - } - .btn-label { - position: relative; - top: 0px; - display: block; - color: @brand-action; - font-size: 10px; - &.run { - left: 8px; - } - &.restart { - left: 1px; - } - &.terminal { - left: -2px; - } - visibility: hidden; - } - } - } - - .details-subheader-tabs { - flex: 1 auto; - text-align: right; - margin-right: 3px; - margin-top: 3px; - .tab { - margin-left: 16px; - padding: 6px 10px; - font-weight: 400; - &:hover { - border-radius: 40px; - background-color: #F9F9F9; - } - &.active { - border-radius: 40px; - color: white; - background-image: linear-gradient(-180deg, #24B8EB 4%, #24A3EB 100%); - } - &.disabled { - opacity: 0.5; - } - } - } - } - - .details-header { - flex: 0 auto; - display: flex; - flex-direction: row; - padding: 31px 24px 18px 24px; - position: relative; - background-color: white; - height: 75px; - h1 { - margin: 0; - font-size: 20px; - font-weight: 400; - margin: 0; - color: @gray-darkest; - } - .status { - font-size: 10px; - font-weight: 500; - position: relative; - top: 8px; - left: 14px; - &.running { - color: @brand-positive; - } - &.paused { - color: @gray-lighter; - } - &.stopped { - color: @gray-lighter; - } - &.downloading { - color: @brand-action; - } - } - - /*.details-header-actions { - flex: 1; - display: flex; - flex-direction: row; - margin-top: 24px; - margin-bottom: 6px; - position: relative; - border-bottom: 1px solid transparent; - transition: border-bottom 0.25s; - .action { - - a { - -webkit-transition: none; - } - transition: none; - flex: 0 auto; - margin-right: 24px; - } - .details-header-actions-rhs { - flex: 1 auto; - display: flex; - align-items: right; - justify-content: flex-end; - a.btn { - z-index: 0; - } - } - }*/ - } - - .details-progress { - margin: 20% auto 0; - text-align: center; - width: 300px; - h2 { - margin-bottom: 20px; - } - } - - .details-panel { - flex: 1; - overflow: auto; - background-color: #FFF; - &.home { - background-color: #F9F9F9; - overflow: hidden; - .content { - display: flex; - flex: 1 auto; - flex-direction: row; - padding: 10px 27px; - .left { - width: 60%; - flex-direction: column; - margin-right: 30px; - } - .right { - width: 40%; - flex-direction: column; - } - .web-preview { - margin-bottom: 50px; - .subtext { - text-align: right; - color: @gray-lightest; - margin-top: 2px; - transition: all 0.25s; - &:hover { - color: darken(@gray-lightest, 10%); - } - } - .widget { - background-color: white; - width: 100%; - height: 100%; - border-radius: 4px; - border: 1px solid @gray-lightest; - position: relative; - overflow: hidden; - p { - font-size: 13px; - color: @gray-normal; - padding: 10px; - padding-bottom: 0px; - } - .ip-port { - padding: 20px; - padding-top: 5px; - color: @gray-darkest; - font-family: Menlo; - -webkit-user-select: text; - } - .frame { - border: 0; - position: absolute; - left: -100%; - top: -100%; - height: 400%; - width: 401%; - transform: scale(0.5); - } - .frame-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 100; - color: transparent; - transition: all 0.25s; - .icon { - margin-top: 40%; - display: block; - font-size: 60px; - text-align: center; - } - .text { - font-size: 20px; - text-align: center; - } - &:hover { - color: white; - background-color: @gray-darkest; - opacity: 0.75; - } - } - } - } - .mini-logs { - margin-bottom: 50px; - .widget { - position: relative; - border-radius: 4px; - border: 1px solid @gray-lightest; - background-color: @gray-darkest; - color: @gray-lightest; - height: 100%; - padding: 10px; - overflow: hidden; - font-family: Menlo; - font-size: 7px; - white-space: pre; - .logs { - overflow: hidden; - height: 100%; - } - p { - margin-bottom: 0px; - } - .mini-logs-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 100; - color: transparent; - transition: all 0.25s; - .icon { - margin-top: 25%; - display: block; - font-size: 60px; - text-align: center; - } - .text { - font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; - font-size: 20px; - text-align: center; - } - &:hover { - color: white; - background-color: @gray-darkest; - opacity: 0.75; - } - } - } - } - .folders { - .subtext { - text-align: right; - color: @gray-lightest; - margin-top: 2px; - transition: all 0.25s; - &:hover { - color: darken(@gray-lightest, 10%); - } - } - .widget { - padding: 10px 5px; - background-color: white; - border-radius: 4px; - border: 1px solid @gray-lightest; - display: flex; - .folder { - width: 110px; - padding: 5px; - &:hover { - background-color: #F9F9F9; - border-radius: 10px; - } - img { - display: block; - margin: 0 auto; - } - .text { - margin-top: 4px; - text-align: center; - } - } - } - } - } - } - &.logs { - background-color: @gray-darkest; - -webkit-user-select: text; - font-family: Menlo; - font-size: 12px; - padding: 20px 18px; - color: @gray-lightest; - white-space: pre-wrap; - p { - margin-bottom: 0px; - } - } - .settings { - display: flex; - flex: 1 auto; - flex-direction: row; - .settings-menu { - min-width: 180px; - flex: 0 auto; - ul { - position: fixed; - margin: 0; - padding: 0; - padding-top: 14px; - - display: flex; - flex-direction: column; - - a { - min-width: 160px; - margin-left: 12px; - color: @gray-normal; - flex-shrink: 0; - cursor: default; - outline: none; - margin-bottom: 10px; - &.active { - li { - color: white; - border-radius: 40px; - background-image: linear-gradient(-180deg, #24B8EB 4%, #24A3EB 100%); - } - } - &:hover { - text-decoration: none; - li { - cursor: default; - border-radius: 40px; - background-color: #F9F9F9; - } - } - &:focus { - text-decoration: none; - } - } - - li { - vertical-align: middle; - padding: 5px 12px; - display: flex; - flex-direction: row; - } - } - } - .settings-panel { - padding-left: 20px; - flex: 1 auto; - overflow-x: hidden; - .settings-section { - margin-bottom: 40px; - } - } - } - } - - .container-name { - margin-bottom: 20px; - input { - width: 40%; - } - p { - font-weight: 300; - margin-top: 5px; - color: @gray-lighter; - font-size: 12px; - strong { - font-weight: 500; - } - } - } - - .env-vars-labels { - width: 100%; - font-size: 12px; - color: @gray-lightest; - margin-left: 5px; - margin-bottom: 5px; - margin-top: 20px; - .label-key { - display: inline-block; - margin-right: 30px; - width: 30%; - } - .label-val { - display: inline-block; - width: 50%; - } - } - .env-vars { - margin-bottom: 20px; - .keyval-row { - margin-bottom: 5px; - } - input { - margin-right: 30px; - &.key { - width: 30%; - } - &.val { - width: 50%; - } - } - } - - .table { - margin-bottom: 0; - .icon-arrow-right { - color: #BBB; - font-size: 20px; - margin: 0px 10px; - flex: 0 auto; - min-width: 13px; - } - &.ports { - .table-labels { - margin-top: 20px; - flex: 1 auto; - display: flex; - font-size: 12px; - color: @gray-lightest; - .label-left { - flex: 0 auto; - min-width: 85px; - margin-right: 30px; - text-align: right; - } - .label-right { - flex: 1 auto; - display: inline-block; - margin-left: 10px; - width: 40%; - } - } - .table-values { - flex: 1 auto; - display: flex; - flex-direction: row; - margin: 8px 0; - .value-left { - text-align: right; - min-width: 85px; - flex: 0 auto; - padding: 0px; - } - .value-right { - flex: 1 auto; - -webkit-user-select: text; - max-width: 170px; - padding: 0px; - } - label { - margin-left: 8px; - margin-top: 1px; - font-weight: 400; - font-size: 13px; - } - input[type="checked"] { - - } - } - } - &.volumes { - .table-labels { - margin-top: 20px; - flex: 1 auto; - display: flex; - font-size: 12px; - color: @gray-lightest; - .label-left { - flex: 0 auto; - margin-right: 30px; - } - .label-right { - flex: 1 auto; - display: inline-block; - margin-left: 10px; - } - } - .table-values { - flex: 1 auto; - display: flex; - flex-direction: row; - margin: 8px 0; - .value-left { - flex: 0 auto; - padding: 0px; - } - .value-right { - flex: 1 auto; - -webkit-user-select: text; - padding: 0px; - } - .btn { - margin-left: 10px; - } - } - } - } - } - } -} diff --git a/styles/header.less b/styles/header.less index 63c7c4a435..0a040fabc0 100644 --- a/styles/header.less +++ b/styles/header.less @@ -1,18 +1,12 @@ -@import "bootstrap/bootstrap.less"; - .header { position: absolute; min-width: 100%; - flex: 0; min-height: 40px; -webkit-app-region: drag; -webkit-user-select: none; - // border-bottom: 1px solid #efefef; - &.no-drag { -webkit-app-region: no-drag; } - .logo { position: relative; float: right; @@ -20,13 +14,11 @@ right: 10px; z-index: 1000; } - .buttons { display: inline-block; position: relative; top: 10px; left: 15px; - &:hover { .button-minimize.enabled { .at2x('minimize.png', 10px, 10px); @@ -41,42 +33,23 @@ .at2x('fullscreenclose.png', 10px, 10px); } } - .button { - box-sizing: border-box; - display: inline-block; - background: white; - margin-right: 9px; - height: 12px; - width: 12px; - border: 1px solid #CCD3D5; - border-radius: 6px; - box-shadow: 0px 1px 1px 0px rgba(234,234,234,0.50); - -webkit-app-region: no-drag; - &.red { - background-color: #FF5F52; - border-color: #E33E32; + .traffic-light(); + &.button-close { + background-color: @traffic-light-red; + border-color: @traffic-light-red-border; } - &.yellow { - background-color: #FFBE05; - border-color: #E2A100; + &.button-minimize { + background-color: @traffic-light-yellow; + border-color: @traffic-light-yellow-border; } - &.green { - background-color: #15CC35; - border-color: #17B230; + &.button-fullscreen { + background-color: @traffic-light-green; + border-color: @traffic-light-green-border; } &.disabled { - background-color: #DDDDDD; - border: 1px solid #D3D3D3; - } - - &.enabled:hover { - box-shadow: 0px 1px 1px 0px rgba(195,198,201,0.50); - } - - &.enabled:hover:active { - cursor: default; - -webkit-filter: brightness(92%); + background-color: @traffic-light-gray; + border-color: @traffic-light-gray-border; } } } diff --git a/styles/layout.less b/styles/layout.less new file mode 100644 index 0000000000..0d6b15d4ed --- /dev/null +++ b/styles/layout.less @@ -0,0 +1,12 @@ +.containers { + box-sizing: border-box; + height: 100%; + display: flex; + flex-direction: column; + .containers-body { + flex: 1; + display: flex; + flex-direction: row; + padding: 0px; + } +} diff --git a/styles/left-panel.less b/styles/left-panel.less new file mode 100644 index 0000000000..7d2d4fe594 --- /dev/null +++ b/styles/left-panel.less @@ -0,0 +1,249 @@ +/* Sidebar */ + +.sidebar { + padding-top: 28px; + background-color: white; + margin: 0; + border-right: 1px solid @divider-color; + display: flex; + flex-direction: column; + min-width: 260px; + box-sizing: border-box; + .sidebar-header { + flex: 0 auto; + min-width: 240px; + min-height: 47px; + display: flex; + border-bottom: 1px solid transparent; + transition: border-bottom 0.25s; + &.sep { + border-bottom: 1px solid #EEE; + box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.03); + } + h4 { + align-self: flex-start; + padding-left: 26px; + margin: 14px 0 0; + display: inline-block; + position: relative; + } + .create { + flex: 1 auto; + text-align: right; + margin-right: 20px; + margin-top: 3px; + .btn-new { + font-size: 24px; + color: @brand-action; + transition: all 0.25s; + &:hover { + color: darken(@brand-action, 15%); + } + } + } + } + .sidebar-containers { + position: relative; + flex: 1 auto; + overflow-y: auto; + overflow-x: hidden; + box-sizing: border-box; + max-width: 260px; + ul { + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + .new-container-item { + .info { + position: relative; + top: 9px; + } + } + a { + color: inherit; + flex-shrink: 0; + cursor: default; + outline: none; + &:hover { + text-decoration: none; + cursor: default; + } + &:focus { + text-decoration: none; + } + &.active { + background: @brand-action; + li { + height: 57px; + border-bottom: none; + .brand-gradient(); + .name { + color: white; + } + .image { + color: white; + opacity: 0.8; + } + .btn-delete { + font-size: 24px; + color: white; + position: relative; + z-index: 9999; + } + .state-new { + .at2x('container-white.png', 20px, 20px); + } + .state-running { + .at2x('running-white.png', 20px, 20px); + .runningwave { + .at2x('runningwave-white.png', 20px, 20px); + } + } + .state-paused { + .at2x('wavy-white.png', 20px, 20px); + } + .state-stopped { + .at2x('stopped-white.png', 20px, 20px); + } + .state-downloading { + .at2x('downloading-white.png', 20px, 20px); + .downloading-arrow { + .at2x('downloading-arrow-white.png', 20px, 20px); + } + } + } + } + } + li { + vertical-align: middle; + padding: 10px 16px 10px 26px; + display: flex; + flex-direction: row; + height: 57px; + .info { + font-size: 13px; + margin-left: 16px; + .name { + text-overflow: ellipsis; + max-width: 140px; + white-space: nowrap; + overflow: hidden; + font-size: 14px; + font-weight: 400; + color: @gray-darkest; + } + .image { + color: @gray-lighter; + font-size: 12px; + font-weight: 400; + text-overflow: ellipsis; + max-width: 140px; + white-space: nowrap; + overflow: hidden; + } + } + .action { + display: none; + flex: 1; + position: relative; + top: 5px; + text-align: right; + margin-right: 4px; + .btn-delete { + font-size: 24px; + color: @gray-lighter; + position: relative; + z-index: 9999; + } + } + .state { + margin-top: 9px; + display: inline-block; + position: relative; + min-width: 20px; + height: 20px; + } + .state-error { + .at2x('error.png', 20px, 20px); + } + .state-stopped { + .at2x('stopped.png', 20px, 20px); + } + .state-paused { + .at2x('paused.png', 20px, 20px); + } + .state-new { + .at2x('container.png', 20px, 20px); + } + .state-downloading { + .at2x('downloading.png', 20px, 20px); + overflow: hidden; + .downloading-arrow { + width: 20px; + height: 20px; + .at2x('downloading-arrow.png', 20px, 20px); + position: absolute; + -webkit-animation-name: translatedownload; + -webkit-animation-duration: 1.8s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } + } + .state-running { + .at2x('running.png', 20px, 20px); + overflow: hidden; + .runningwave { + position: absolute; + width: 40px; + height: 20px; + left: -20px; + .at2x('runningwave.png', 20px, 20px); + -webkit-animation-name: translatewave; + -webkit-animation-duration: 8.0s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } + } + .state-restarting { + display: inline-block; + width: 20px; + height: 20px; + .at2x('restarting.png', 20px, 20px); + background-repeat: repeat-x; + -webkit-animation-delay: -1s; + -webkit-animation-name: rotate; + -webkit-animation-duration: 3.0s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } + } + } + } +} + +/* Auto-Update */ + +.update-notification { + background-color: white; + opacity: 0.9; + position: fixed; + bottom: 0; + width: 259px; + padding: 10px; + color: @gray-normal; + font-size: 12px; + .text { + position: relative; + top: 3px; + } + .btn { + position: relative; + float: right; + } +} + +.update-padding { + position: relative; + height: 40px; +} diff --git a/styles/main.less b/styles/main.less index 3c793c6a60..ff66c8e0ad 100644 --- a/styles/main.less +++ b/styles/main.less @@ -1,5 +1,6 @@ @import "bootstrap/bootstrap.less"; @import "variables.less"; +@import "mixins.less"; @import "clearsans.less"; @import "theme.less"; @import "icons.less"; @@ -8,8 +9,14 @@ @import "radial.less"; @import "preferences.less"; @import "header.less"; -@import "containers.less"; -@import "container-modal.less"; +@import "layout.less"; +@import "left-panel.less"; +@import "right-panel.less"; +@import "new-container.less"; +@import "container-home.less"; +@import "container-logs.less"; +@import "container-settings.less"; +@import "animation.less"; html, body { height: 100%; @@ -17,108 +24,8 @@ html, body { overflow: hidden; -webkit-user-select: none; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; - cursor: default; img { pointer-events: none; } } - -/*::-webkit-scrollbar { - width: 13px; -} - -::-webkit-scrollbar-track { - margin: 3px; - -webkit-border-radius: 5px; - border-radius: 5px; - background: none; -} - -::-webkit-scrollbar-thumb { - border: 3px solid rgba(0, 0, 0, 0); - background-clip: padding-box; - width: 7px; - border-radius: 8px; - background-color: rgba(0,0,0,0.2); - - &:hover { - background-color: rgba(0,0,0,0.25); - } -}*/ - -.question { - color: @gray-lightest; - font-size: 10px; -} - -.popover { - font-family: 'Clear Sans', sans-serif; - color: @gray-normal; - font-weight: 400; - font-size: 13px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.10); - border: 1px solid #ddd; -} - -.update-notification { - background-color: white; - opacity: 0.9; - position: fixed; - bottom: 0; - width: 259px; - padding: 10px; - //border-top: 1px solid darken(#FCF8E3, 5%); - color: @gray-normal; - font-size: 12px; - .text { - position: relative; - top: 3px; - } - .btn { - position: relative; - float: right; - } -} - -.update-padding { - position: relative; - height: 40px; -} - -@-webkit-keyframes spin { - from { - -webkit-transform: rotate(0deg); - } - to { - -webkit-transform: rotate(360deg); - } -} - -@-webkit-keyframes translatewave { - from { - -webkit-transform: translateX(0px); - } - to { - -webkit-transform: translateX(20px); - } -} - -@-webkit-keyframes translatedownload { - 0% { - -webkit-transform: translateY(6px); - opacity: 0; - } - 25% { - opacity: 1; - -webkit-transform: translateY(6px); - } - 50% { - opacity: 1; - -webkit-transform: translateY(20px); - } - 100% { - opacity: 1; - -webkit-transform: translateY(20px); - } -} diff --git a/styles/mixins.less b/styles/mixins.less new file mode 100644 index 0000000000..8bef7aaa83 --- /dev/null +++ b/styles/mixins.less @@ -0,0 +1,23 @@ +.traffic-light() { + box-sizing: border-box; + display: inline-block; + background: white; + margin-right: 9px; + height: 12px; + width: 12px; + border: 1px solid @traffic-light-gray-border; + border-radius: 6px; + box-shadow: 0px 1px 1px 0px rgba(234,234,234,0.50); + -webkit-app-region: no-drag; + &.enabled:hover { + box-shadow: 0px 1px 1px 0px rgba(195,198,201,0.50); + } + &.enabled:hover:active { + cursor: default; + -webkit-filter: brightness(92%); + } +} + +.brand-gradient() { + background-image: linear-gradient(-180deg, #24B8EB 4%, #24A3EB 100%); +} diff --git a/styles/new-container.less b/styles/new-container.less new file mode 100644 index 0000000000..cea9c89037 --- /dev/null +++ b/styles/new-container.less @@ -0,0 +1,247 @@ +.new-container { + display: flex; + flex: 1 auto; + flex-direction: column; + padding: 35px 20px 32px 25px; + .results { + display: flex; + flex-direction: column; + flex: 1 auto; + .no-results { + flex: 1 auto; + display: flex; + align-items: center; + .loader { + margin: 0 auto; + margin-top: -20%; + text-align: center; + width: 300px; + h2 { + margin-bottom: 20px; + } + } + h1 { + color: @gray-lightest; + font-size: 24px; + margin: 0 auto; + margin-top: -20%; + } + } + } + .new-container-header { + margin-bottom: 18px; + display: flex; + flex: 0 auto; + .text { + flex: 1 auto; + width: 50%; + font-size: 14px; + color: @gray-lighter; + } + .search { + flex: 1 auto; + margin-right: 30px; + .search-bar { + top: -7px; + position: relative; + .loading { + position: absolute; + left: 10px; + top: 7px; + width: 16px; + height: 16px; + -webkit-animation-name: spin; + -webkit-animation-duration: 1.8s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } + .search-icon { + font-size: 18px; + color: @gray-lighter; + position: absolute; + top: 5px; + left: 10px; + } + input { + border-radius: 20px; + font-size: 12px; + height: 30px; + padding: 4px 8px 4px 35px; + color: @gray-darkest; + margin-bottom: 3px; + border-color: @gray-lightest; + box-shadow: none; + + &:focus { + box-shadow: none; + border-color: @gray-lighter; + } + + &::-webkit-input-placeholder { + color: #CCC; + font-weight: 400; + } + } + } + } + } +} + +.result-grid { + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + margin-top: 10px; + overflow: auto; + .image-item { + display: flex; + width: 320px; + height: 166px; + border-radius: 4px; + border: 1px solid @gray-lightest; + background-color: white; + margin-right: 20px; + margin-bottom: 20px; + .tag-overlay { + z-index: 999; + background-color: rgba(0,0,0,0.8); + border-radius: 4px; + width: 320px; + height: 166px; + position: absolute; + color: white; + font-size: 13px; + display: none; + padding: 10px; + .tag-list { + display: flex; + flex-direction: row; + align-items: flex-start; + align-content: flex-start; + flex-flow: row wrap; + height: 140px; + overflow: auto; + .tag { + display: inline-block; + flex: 0 auto; + margin-right: 2px; + padding: 3px 5px; + &:hover { + background-color: rgba(255,255,255,0.2); + border-radius: 20px; + } + } + } + .tags-loading { + position: relative; + left: 42%; + top: 20%; + text-align: center; + margin: 14px auto; + -webkit-animation-name: spin; + -webkit-animation-duration: 1.8s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } + } + .logo { + flex: 1 auto; + min-width: 90px; + background-color: @brand-action; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + justify-content: center; + text-align: center; + img { + margin-top: 15px; + } + } + .card { + padding: 10px 20px 10px 20px; + .name { + font-size: 18px; + color: @gray-darkest; + margin-bottom: 5px; + width: 190px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + img { + margin-right: 7px; + position: relative; + top: -1px; + } + } + .description { + font-size: 12px; + color: @gray-normal; + height: 65px; + text-overflow: ellipsis; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 4; + display: -webkit-box; + word-wrap: break-word; + } + .actions { + width: 190px; + padding-top: 25px; + .stars { + height: 15px; + font-size: 10px; + color: @gray-darker; + border-right: 1px solid @gray-lightest; + padding-right: 10px; + .icon { + position: relative; + font-size: 16px; + margin-right: 3px; + top: -1px; + color: @gray-darkest; + } + .text { + position: relative; + top: -6px; + } + } + .tags { + height: 15px; + font-size: 10px; + color: @gray-darker; + padding-left: 10px; + .icon { + position: relative; + font-size: 11px; + margin-right: 2px; + top: 2px; + color: @gray-darkest; + } + .text { + position: relative; + top: 0px; + padding: 3px 5px; + text-decoration: underline; + &:hover { + background-color: @brand-action; + color: white; + border-radius: 20px; + } + } + } + .action { + flex: 1 auto; + .btn { + text-align: right; + position: relative; + float: right; + top: -7px; + } + } + display: flex; + flex-direaction: row; + position: relative; + bottom: 0px; + } + } + } +} diff --git a/styles/right-panel.less b/styles/right-panel.less new file mode 100644 index 0000000000..307739edf1 --- /dev/null +++ b/styles/right-panel.less @@ -0,0 +1,125 @@ +.details { + background-color: #F9F9F9; + margin: 0; + padding: 0; + box-sizing: border-box; + flex: 1; + display: flex; + flex-direction: column; + .details-subheader { + flex: 0 auto; + display: flex; + flex-direction: row; + position: relative; + border-bottom: 1px solid #DCE2E2; + background-color: white; + height: 57px; + padding: 6px 10px 10px 24px; + font-size: 13px; + color: @gray-normal; + .details-header-actions { + flex: 1 auto; + text-align: left; + margin-top: -12px; + .action { + display: inline-block; + &.disabled { + opacity: 0.3; + } + .action-icon { + color: @gray-normal; + font-size: 30px; + margin-right: 20px; + } + .btn-label { + position: relative; + top: 0px; + display: block; + color: @brand-action; + font-size: 10px; + &.run { + left: 8px; + } + &.restart { + left: 1px; + } + &.terminal { + left: -2px; + } + visibility: hidden; + } + } + } + .details-subheader-tabs { + flex: 1 auto; + text-align: right; + margin-right: 3px; + margin-top: 3px; + .tab { + margin-left: 16px; + padding: 6px 10px; + font-weight: 400; + &:hover { + border-radius: 40px; + background-color: #F9F9F9; + } + &.active { + border-radius: 40px; + color: white; + background-image: linear-gradient(-180deg, #24B8EB 4%, #24A3EB 100%); + } + &.disabled { + opacity: 0.5; + } + } + } + } + .details-header { + flex: 0 auto; + display: flex; + flex-direction: row; + padding: 31px 24px 18px 24px; + position: relative; + background-color: white; + height: 75px; + h1 { + margin: 0; + font-size: 20px; + font-weight: 400; + margin: 0; + color: @gray-darkest; + } + .status { + font-size: 10px; + font-weight: 500; + position: relative; + top: 8px; + left: 14px; + &.running { + color: @brand-positive; + } + &.paused { + color: @gray-lighter; + } + &.stopped { + color: @gray-lighter; + } + &.downloading { + color: @brand-action; + } + } + } + .details-progress { + margin: 20% auto 0; + text-align: center; + width: 300px; + h2 { + margin-bottom: 20px; + } + } + .details-panel { + flex: 1; + overflow: auto; + background-color: #FFF; + } +} diff --git a/styles/theme.less b/styles/theme.less index f575b111be..3e7988b705 100644 --- a/styles/theme.less +++ b/styles/theme.less @@ -22,17 +22,12 @@ h4 { } a { - transition: all 0.25s; + transition: color 0.25s; &:hover { text-decoration: none; } } -.popover-content { - color: @gray-normal; - font-size: 13px; -} - input[type="text"] { &.line { border: 0; diff --git a/styles/variables.less b/styles/variables.less index ba3833fa96..0e77223555 100644 --- a/styles/variables.less +++ b/styles/variables.less @@ -3,8 +3,19 @@ @brand-positive: #15CC35; @brand-negative: #FF5F52; +@traffic-light-green: @brand-positive; +@traffic-light-green-border: #17B230; +@traffic-light-red: @brand-negative; +@traffic-light-red-border: #E33E32; +@traffic-light-yellow: #FFBE05; +@traffic-light-yellow-border: #E2A100; +@traffic-light-gray: #DDDDDD; +@traffic-light-gray-border: #D3D3D3; + @gray-darkest: #253237; @gray-darker: #394C51; @gray-normal: #546C70; @gray-lighter: #7A9999; @gray-lightest: #C7D7D7; + +@divider-color: #DCE2E2;