From 542107db78d48f74488fc4b71934edfb98b2242d Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 4 Oct 2018 21:05:34 +0100 Subject: [PATCH 01/63] Changed Horizontal Split to be vertical + Whitespace to linebreak descriptions. --- client/scss/asset-display/_asset-display.scss | 4 ++++ client/src/containers/AssetInfo/view.jsx | 13 +++++++------ client/src/pages/ShowAssetDetails/view.jsx | 8 ++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 11d42c4c..b2650f75 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -20,3 +20,7 @@ .vertical-split .asset-display { height: 90vh; } + +.asset-description { + white-space: pre-line; +} diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index ccf88fbd..e684e266 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -12,6 +12,13 @@ class AssetInfo extends React.Component { const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props; return (
+ + {description && ( + +

{description}

+
+ )} + {channelName && ( - {description && ( - -

{description}

-
- )} -

Hosted via the LBRY blockchain diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index 98c09372..b50b3682 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PageLayout from '@components/PageLayout'; -import HorizontalSplit from '@components/HorizontalSplit'; +import VerticalSplit from '@components/VerticalSplit'; import AssetTitle from '@containers/AssetTitle'; import AssetDisplay from '@containers/AssetDisplay'; import AssetInfo from '@containers/AssetInfo'; @@ -18,9 +18,9 @@ class ShowAssetDetails extends React.Component { asset={asset} > - } - rightSide={} + } + bottom={} /> ); From 431757cea4c251fe680af245c71332d1cbec5cb5 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sat, 6 Oct 2018 18:24:55 +0100 Subject: [PATCH 02/63] Moving description into horizontal split + added brand color for links --- client/scss/variables/_variables.scss | 1 + client/src/containers/AssetInfo/view.jsx | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index 26f125d8..c1cb3289 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -5,6 +5,7 @@ $tertiary-color: #ccccc0; $interactive-color: blue; $success-color: green; $failure-color: red; +$brand-color: #ff725d; $primary-padding: 3em; $secondary-padding: 2em; diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index e684e266..71a26885 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -5,19 +5,24 @@ import RowLabeled from '@components/RowLabeled'; import Row from '@components/Row'; import SpaceBetween from '@components/SpaceBetween'; import AssetShareButtons from '@components/AssetShareButtons'; +import HorizontalSplit from '@components/HorizontalSplit'; import ClickToCopy from '@components/ClickToCopy'; class AssetInfo extends React.Component { render () { const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props; return ( -

- - {description && ( - -

{description}

-
- )} +
+ + {description && ( +

{description}

+ )} +
+ } + rightSide={''} + /> {channelName && ( From 81f97c133197d1b34b2b63d1d88d2fd3da4c318b Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sat, 6 Oct 2018 18:56:42 +0100 Subject: [PATCH 03/63] New row compontent to prevent it intefering with everything else + link colours changed --- client/src/components/RowLabeledAlt/index.jsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 client/src/components/RowLabeledAlt/index.jsx diff --git a/client/src/components/RowLabeledAlt/index.jsx b/client/src/components/RowLabeledAlt/index.jsx new file mode 100644 index 00000000..d5e2c7d0 --- /dev/null +++ b/client/src/components/RowLabeledAlt/index.jsx @@ -0,0 +1,14 @@ +import React from 'react'; + +class RowLabeledAlt extends React.Component { + render () { + return ( +
+
{this.props.label}
+
{this.props.content}
+
+ ); + } +} + +export default RowLabeledAlt; From e0b15691b9a11b3d35c4baa2ee5a93bc882a6aeb Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sat, 6 Oct 2018 18:57:11 +0100 Subject: [PATCH 04/63] Forgot to stage the rest of my code, thanks VS Code. --- client/scss/link/_link.scss | 4 + client/scss/row/_row.scss | 17 ++ client/src/containers/AssetInfo/view.jsx | 202 ++++++++++++----------- 3 files changed, 124 insertions(+), 99 deletions(-) diff --git a/client/scss/link/_link.scss b/client/scss/link/_link.scss index 4553605e..ee5cc8c7 100644 --- a/client/scss/link/_link.scss +++ b/client/scss/link/_link.scss @@ -6,6 +6,10 @@ a, a:visited { color: $interactive-color; } +.link--brand, .link--brand:visited { + color: $brand-color; +} + .link--secondary, .link--secondary:visited { margin: 0px; padding: 0.3em; diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index 3b731ac0..fb5f3534 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -18,6 +18,23 @@ width: 70%; } +.row-labeled-alt { + display: column; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; + + .row-labeled-label { + align-self: flex-start; + width: 100%; + } + + .row-labeled-content { + align-self: center; + width: 100%; + } +} + @media (max-width: $break-point-medium ) { diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 71a26885..63d8d669 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -12,7 +12,7 @@ class AssetInfo extends React.Component { render () { const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props; return ( -
+
@@ -21,106 +21,110 @@ class AssetInfo extends React.Component { )}
} - rightSide={''} + rightSide={ +
+ {channelName && ( + + + } + content={ + + {channelName} + + } + /> + + )} + + + + } + content={ + + } + /> + + + + + } + content={ + + } + /> + + + + + } + content={ +
+ {(contentType === 'video/mp4') ? ( + `} + /> + ) : ( + `} + /> + )} +
+ } + /> +
+ + + + + Direct Link + + + Download + + + Report + + + + + +

+ Hosted via the LBRY blockchain +

+
+ +
+ } /> - {channelName && ( - - - } - content={ - - {channelName} - - } - /> - - )} - - - - } - content={ - - } - /> - - - - - } - content={ - - } - /> - - - - - } - content={ -
- {(contentType === 'video/mp4') ? ( - `} - /> - ) : ( - `} - /> - )} -
- } - /> -
- - - - - Direct Link - - - Download - - - Report - - - - - -

- Hosted via the LBRY blockchain -

-
); From dba4d15a67fbebbd4eff7aebb9ae0af4e3977ca4 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 7 Oct 2018 17:38:49 +0100 Subject: [PATCH 05/63] New Row put to use + style changes to match design --- client/scss/asset-display/_asset-display.scss | 12 ++++++++++++ client/scss/click-to-copy/_click-to-copy.scss | 7 ++++++- client/scss/row/_row.scss | 2 ++ client/scss/variables/_variables.scss | 1 + client/src/containers/AssetDisplay/view.jsx | 3 +++ client/src/containers/AssetInfo/view.jsx | 10 +++++----- client/src/containers/AssetTitle/view.jsx | 7 +++---- client/src/pages/ShowAssetDetails/view.jsx | 4 ++-- 8 files changed, 34 insertions(+), 12 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index b2650f75..1e7c3c87 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -5,6 +5,18 @@ justify-content: center; } +.asset-title-wrap { + margin-top: 90px; + .asset-title { + font-weight: normal; + font-size: 26px; + color: #2E2F31; + letter-spacing: 0; + text-align: center; + line-height: 32px; + } +} + .asset-image, .asset-video { margin : 0; max-width: 100%; diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index a8dc776f..ac80cda3 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -1,9 +1,14 @@ .click-to-copy { cursor: pointer; - border: 1px solid black; + border: none; padding: 0.5em; margin: 0; color: black; background-color: white; width: calc(100% - 1em - 2px); + font-size: 14px; + color: #2E2F31; + letter-spacing: -0.6px; + line-height: 20px; + } diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index fb5f3534..1789f1d6 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -27,6 +27,8 @@ .row-labeled-label { align-self: flex-start; width: 100%; + color: $grey; + font-size: 12px; } .row-labeled-content { diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index c1cb3289..b33e1cfa 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -6,6 +6,7 @@ $interactive-color: blue; $success-color: green; $failure-color: red; $brand-color: #ff725d; +$grey: #a9adba; $primary-padding: 3em; $secondary-padding: 2em; diff --git a/client/src/containers/AssetDisplay/view.jsx b/client/src/containers/AssetDisplay/view.jsx index e07bfa78..4259719b 100644 --- a/client/src/containers/AssetDisplay/view.jsx +++ b/client/src/containers/AssetDisplay/view.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import AssetTitle from '@containers/AssetTitle'; import ProgressBar from '@components/ProgressBar'; import { LOCAL_CHECK, UNAVAILABLE, ERROR, AVAILABLE } from '../../constants/asset_display_states'; @@ -63,7 +64,9 @@ class AssetDisplay extends React.Component { } })() } +
+ ); } }; diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 63d8d669..5ba1f997 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; import Label from '@components/Label'; -import RowLabeled from '@components/RowLabeled'; +import RowLabeledAlt from '@components/RowLabeledAlt'; import Row from '@components/Row'; import SpaceBetween from '@components/SpaceBetween'; import AssetShareButtons from '@components/AssetShareButtons'; @@ -25,7 +25,7 @@ class AssetInfo extends React.Component {
{channelName && ( - } @@ -39,7 +39,7 @@ class AssetInfo extends React.Component { )} - } @@ -54,7 +54,7 @@ class AssetInfo extends React.Component { - } @@ -68,7 +68,7 @@ class AssetInfo extends React.Component { - } diff --git a/client/src/containers/AssetTitle/view.jsx b/client/src/containers/AssetTitle/view.jsx index a542c762..7821920a 100644 --- a/client/src/containers/AssetTitle/view.jsx +++ b/client/src/containers/AssetTitle/view.jsx @@ -1,11 +1,10 @@ import React from 'react'; -import Row from '@components/Row'; const AssetTitle = ({ title }) => { return ( - -

{title}

-
+
+

{title}

+
); }; diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index b50b3682..ed6bea8b 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PageLayout from '@components/PageLayout'; import VerticalSplit from '@components/VerticalSplit'; -import AssetTitle from '@containers/AssetTitle'; +// import AssetTitle from '@containers/AssetTitle'; import AssetDisplay from '@containers/AssetDisplay'; import AssetInfo from '@containers/AssetInfo'; import ErrorPage from '@pages/ErrorPage'; @@ -17,7 +17,7 @@ class ShowAssetDetails extends React.Component { pageTitle={`${name} - details`} asset={asset} > - + } bottom={} From 3023b25eb2333ef4f3e5b8148a7993d22b478589 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 7 Oct 2018 23:35:35 +0100 Subject: [PATCH 06/63] Clean up --- client/scss/asset-display/_asset-display.scss | 6 +++++- client/src/containers/AssetInfo/view.jsx | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 1e7c3c87..2afe4f16 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -33,6 +33,10 @@ height: 90vh; } -.asset-description { +p.asset-description { white-space: pre-line; + font-size: 14px; + color: #2E2F31; + letter-spacing: 0; + line-height: 18px; } diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 5ba1f997..d385b9c4 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -15,9 +15,9 @@ class AssetInfo extends React.Component {
+
{description && ( -

{description}

+

{description}

)}
} From 5f99629930b193b853998548ef3ae9bb54f37ab0 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 8 Oct 2018 20:51:09 +0100 Subject: [PATCH 07/63] Feather icons added, use click to copy, scss added to fit in icon + Lora font. --- client/scss/asset-display/_asset-display.scss | 24 +++++++++---- client/scss/click-to-copy/_click-to-copy.scss | 34 ++++++++++++------- client/scss/label/_label.scss | 1 + client/scss/text/_text.scss | 4 +-- client/src/components/ClickToCopy/index.jsx | 22 +++++++----- client/src/containers/AssetInfo/view.jsx | 1 - package-lock.json | 5 +++ package.json | 1 + server/render/renderFullPage.js | 2 ++ 9 files changed, 63 insertions(+), 31 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 2afe4f16..a3f84b26 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -33,10 +33,20 @@ height: 90vh; } -p.asset-description { - white-space: pre-line; - font-size: 14px; - color: #2E2F31; - letter-spacing: 0; - line-height: 18px; -} + +.asset-information-wrap { + max-width: 800px; + + p.asset-description { + white-space: pre-line; + font-size: 14px; + color: #2E2F31; + letter-spacing: 0; + line-height: 18px; + } + + .asset-information { + width: 320px; + } + +} \ No newline at end of file diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index ac80cda3..3c6bd191 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -1,14 +1,24 @@ -.click-to-copy { - cursor: pointer; - border: none; - padding: 0.5em; - margin: 0; - color: black; - background-color: white; - width: calc(100% - 1em - 2px); - font-size: 14px; - color: #2E2F31; - letter-spacing: -0.6px; - line-height: 20px; +.click-to-copy-wrap { + display: flex; + width: 100%; + justify-content: space-between; + .click-to-copy { + cursor: pointer; + border: none; + padding: 0.5em; + margin: 0; + color: black; + background-color: white; + width: calc(100% - 1em - 2px); + font-size: 14px; + color: #2E2F31; + letter-spacing: -0.6px; + line-height: 20px; + max-width: 200px; + } + svg { + stroke: $brand-color; + } } + diff --git a/client/scss/label/_label.scss b/client/scss/label/_label.scss index a801c8b6..c3d96ae3 100644 --- a/client/scss/label/_label.scss +++ b/client/scss/label/_label.scss @@ -2,6 +2,7 @@ padding-top: $thin-padding; padding-bottom: $thin-padding; display: inline-block; + font-size: 12px; } .label-radio { diff --git a/client/scss/text/_text.scss b/client/scss/text/_text.scss index cec1c28e..a8b72aa0 100644 --- a/client/scss/text/_text.scss +++ b/client/scss/text/_text.scss @@ -18,8 +18,8 @@ h3 { } p, body, button, input, textarea, label, select, option { - font-family: 'Lekton', monospace; - font-size: $text-large; + font-family: 'Lora', serif; + font-size: 16px; } .text--extra-large { diff --git a/client/src/components/ClickToCopy/index.jsx b/client/src/components/ClickToCopy/index.jsx index 35b7dba8..9c30d8be 100644 --- a/client/src/components/ClickToCopy/index.jsx +++ b/client/src/components/ClickToCopy/index.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import * as Icon from 'react-feather'; class ClickToCopy extends React.Component { constructor (props) { @@ -18,15 +19,18 @@ class ClickToCopy extends React.Component { render () { const {id, value} = this.props; return ( - +
+ + +
); } } diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index d385b9c4..b150b488 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -125,7 +125,6 @@ class AssetInfo extends React.Component { } /> -
); } diff --git a/package-lock.json b/package-lock.json index f45c2e93..db4b9a57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11090,6 +11090,11 @@ "prop-types": "15.6.2" } }, + "react-feather": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/react-feather/-/react-feather-1.1.3.tgz", + "integrity": "sha512-5+KHu7zp5qvc+zq6N0XjeZDhufl3NVEaQyocg486lXZ+ZwW9z66GO+HXABoZ74OCLjsqhBl48j4BS17VRfyjTQ==" + }, "react-ga": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-2.5.3.tgz", diff --git a/package.json b/package.json index 524db99f..04a557c6 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "prop-types": "^15.6.2", "react": "^16.4.2", "react-dom": "^16.4.2", + "react-feather": "^1.1.3", "react-ga": "^2.5.3", "react-helmet": "^5.2.0", "react-redux": "^5.0.6", diff --git a/server/render/renderFullPage.js b/server/render/renderFullPage.js index 0d3d0fc4..8f40e2b2 100644 --- a/server/render/renderFullPage.js +++ b/server/render/renderFullPage.js @@ -15,6 +15,7 @@ module.exports = (helmet, html, preloadedState) => { +
${html}
@@ -22,6 +23,7 @@ module.exports = (helmet, html, preloadedState) => { window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace(/ + `; From 57fab11316398dca09ebae7d3187a26dd1f64463 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Tue, 9 Oct 2018 20:55:59 +0100 Subject: [PATCH 08/63] Click to copy to work with entire div including icon --- client/scss/click-to-copy/_click-to-copy.scss | 2 +- client/src/components/ClickToCopy/index.jsx | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index 3c6bd191..ee630eac 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -2,8 +2,8 @@ display: flex; width: 100%; justify-content: space-between; + cursor: pointer; .click-to-copy { - cursor: pointer; border: none; padding: 0.5em; margin: 0; diff --git a/client/src/components/ClickToCopy/index.jsx b/client/src/components/ClickToCopy/index.jsx index 9c30d8be..832ce973 100644 --- a/client/src/components/ClickToCopy/index.jsx +++ b/client/src/components/ClickToCopy/index.jsx @@ -6,9 +6,10 @@ class ClickToCopy extends React.Component { super(props); this.copyToClipboard = this.copyToClipboard.bind(this); } - copyToClipboard (event) { - const elementToCopy = event.target.id; + copyToClipboard () { + const elementToCopy = this.props.id; const element = document.getElementById(elementToCopy); + console.log(elementToCopy); element.select(); try { document.execCommand('copy'); @@ -19,11 +20,13 @@ class ClickToCopy extends React.Component { render () { const {id, value} = this.props; return ( -
+
Date: Thu, 11 Oct 2018 20:51:34 +0100 Subject: [PATCH 09/63] Design cleanup --- client/scss/asset-display/_asset-display.scss | 39 +++++-- client/scss/page-layout/_page-layout.scss | 1 - .../VerticalCollapsibleSplit/index.jsx | 18 +++ client/src/containers/AssetDisplay/view.jsx | 104 +++++++++--------- client/src/pages/ShowAssetDetails/view.jsx | 6 +- 5 files changed, 106 insertions(+), 62 deletions(-) create mode 100644 client/src/components/VerticalCollapsibleSplit/index.jsx diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index a3f84b26..7887a0c8 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -3,11 +3,32 @@ flex: 1 0 auto; flex-direction: column; justify-content: center; + + background: #E9E8E8; + width: 100%; + position: relative; + &:before, + &:after { + content: ''; + position: absolute; + box-shadow: inset 0 1px 3px 2px rgba(169, 173, 186, 0.2); + width: 100%; + height: 1px; + background: transparent; + left: 0; + top: 0; + } + + &:after { + top: auto; + bottom: 0; + } + } -.asset-title-wrap { - margin-top: 90px; + .asset-title { + margin-top: 40px; font-weight: normal; font-size: 26px; color: #2E2F31; @@ -15,10 +36,9 @@ text-align: center; line-height: 32px; } -} .asset-image, .asset-video { - margin : 0; + margin : 60px 0; max-width: 100%; max-height: 100%; object-fit: contain; @@ -29,10 +49,15 @@ margin: 16px; padding: 6px; } -.vertical-split .asset-display { - height: 90vh; -} +// .vertical-split .asset-display { +// height: 90vh; +// } + +.visible-content { + width: 100%; + margin: 0 0 40px; +} .asset-information-wrap { max-width: 800px; diff --git a/client/scss/page-layout/_page-layout.scss b/client/scss/page-layout/_page-layout.scss index f94645a5..06f6dae7 100644 --- a/client/scss/page-layout/_page-layout.scss +++ b/client/scss/page-layout/_page-layout.scss @@ -7,6 +7,5 @@ display: flex; -webkit-flex-direction: column; flex-direction: column; - margin: $primary-padding; } } diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx new file mode 100644 index 00000000..a194f7c0 --- /dev/null +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -0,0 +1,18 @@ +import React from 'react'; + +class VerticalCollapsibleSplit extends React.Component { + render () { + return ( +
+
+ {this.props.top} +
+
+ {this.props.bottom} +
+
+ ); + } +} + +export default VerticalCollapsibleSplit; diff --git a/client/src/containers/AssetDisplay/view.jsx b/client/src/containers/AssetDisplay/view.jsx index 4259719b..4de29bb3 100644 --- a/client/src/containers/AssetDisplay/view.jsx +++ b/client/src/containers/AssetDisplay/view.jsx @@ -12,58 +12,60 @@ class AssetDisplay extends React.Component { const { status, error, asset: { claimData: { name, claimId, contentType, fileExt, thumbnail } } } = this.props; const sourceUrl = `/${claimId}/${name}.${fileExt}`; return ( -
- {(status === LOCAL_CHECK) && -
-

Checking to see if Spee.ch has your asset locally...

-
- } - {(status === UNAVAILABLE) && -
-

Sit tight, we're searching the LBRY blockchain for your asset!

- -

Curious what magic is happening here? Learn more.

-
- } - {(status === ERROR) && -
-

Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the below error message in the LBRY discord.

-

{error}

-
- } - {(status === AVAILABLE) && - (() => { - switch (contentType) { - case 'image/jpeg': - case 'image/jpg': - case 'image/png': - case 'image/gif': - return ( - {name} - ); - case 'video/mp4': - return ( - - ); - default: - return ( -

Unsupported content type

- ); +
+
+ {(status === LOCAL_CHECK) && +
+

Checking to see if Spee.ch has your asset locally...

+
} - })() - } + {(status === UNAVAILABLE) && +
+

Sit tight, we're searching the LBRY blockchain for your asset!

+ +

Curious what magic is happening here? Learn more.

+
+ } + {(status === ERROR) && +
+

Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the below error message in the LBRY discord.

+

{error}

+
+ } + {(status === AVAILABLE) && + (() => { + switch (contentType) { + case 'image/jpeg': + case 'image/jpg': + case 'image/png': + case 'image/gif': + return ( + {name} + ); + case 'video/mp4': + return ( + + ); + default: + return ( +

Unsupported content type

+ ); + } + })() + } +
diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index ed6bea8b..f3eef3c8 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -1,7 +1,8 @@ import React from 'react'; import PageLayout from '@components/PageLayout'; -import VerticalSplit from '@components/VerticalSplit'; +import VerticalCollapsibleSplit from '@components/VerticalCollapsibleSplit'; +// import VerticalSplit from '@components/VerticalSplit'; // import AssetTitle from '@containers/AssetTitle'; import AssetDisplay from '@containers/AssetDisplay'; import AssetInfo from '@containers/AssetInfo'; @@ -17,8 +18,7 @@ class ShowAssetDetails extends React.Component { pageTitle={`${name} - details`} asset={asset} > - - } bottom={} /> From b3d05c7b82997f18600aeba7ad0b61ffb2cfecd4 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 11 Oct 2018 21:36:16 +0100 Subject: [PATCH 10/63] Collapse Logic and styling in place --- client/scss/asset-display/_asset-display.scss | 3 +-- .../scss/vertical-split/_vertical-split.scss | 17 +++++++++++++++ .../VerticalCollapsibleSplit/index.jsx | 21 ++++++++++++++++--- client/src/pages/ShowAssetDetails/view.jsx | 1 + 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 7887a0c8..b756ccbd 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -61,15 +61,14 @@ .asset-information-wrap { max-width: 800px; - p.asset-description { white-space: pre-line; font-size: 14px; color: #2E2F31; letter-spacing: 0; line-height: 18px; + width: 360px; } - .asset-information { width: 320px; } diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index ac100b08..665e4c80 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -5,3 +5,20 @@ justify-content: space-between; align-items : center; }; + +.collapse-content.hidden{ + display: none; +} + +.collapse-button { + outline: none; + background: none; + border: none; + display: block; + margin: 15px auto 0; + width: 24px; + height: 24px; + svg { + stroke: $brand-color; + } +} \ No newline at end of file diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index a194f7c0..6602b108 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -1,18 +1,33 @@ import React from 'react'; - +import * as Icon from 'react-feather'; class VerticalCollapsibleSplit extends React.Component { + + constructor (props) { + super(props); + this.collapse = this.collapse.bind(this); + this.state = { open: true }; + } + + collapse () { + this.setState({ open: !this.state.open }); + document.getElementById(this.props.name).classList.toggle('hidden'); + } + render () { return (
{this.props.top} +
-
+
{this.props.bottom}
); } -} +}; export default VerticalCollapsibleSplit; diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index f3eef3c8..9a7d7739 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -19,6 +19,7 @@ class ShowAssetDetails extends React.Component { asset={asset} > } bottom={} /> From 8759bcfdd6e7925a03b19902f58d01c98e1172c8 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 11 Oct 2018 21:51:33 +0100 Subject: [PATCH 11/63] New sharing icons --- client/scss/all.scss | 1 + client/scss/share-buttons/_share-buttons.scss | 9 +++++++++ client/src/components/AssetShareButtons/index.js | 13 ++++++------- public/assets/img/icn_facebook.svg | 14 ++++++++++++++ public/assets/img/icn_reddit.svg | 14 ++++++++++++++ public/assets/img/icn_tumblr.svg | 14 ++++++++++++++ public/assets/img/icn_twitter.svg | 14 ++++++++++++++ 7 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 client/scss/share-buttons/_share-buttons.scss create mode 100644 public/assets/img/icn_facebook.svg create mode 100644 public/assets/img/icn_reddit.svg create mode 100644 public/assets/img/icn_tumblr.svg create mode 100644 public/assets/img/icn_twitter.svg diff --git a/client/scss/all.scss b/client/scss/all.scss index 716e893b..bf6bb0b6 100644 --- a/client/scss/all.scss +++ b/client/scss/all.scss @@ -30,6 +30,7 @@ @import '~page-content/_page-content'; @import '~progress-bar/_progress-bar'; @import '~publish-preview/_publish-preview'; +@import '~share-buttons/_share-buttons'; @import '~space-between/_space-between'; @import '~space-around/_space-around'; @import '~row/_row'; diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/share-buttons/_share-buttons.scss new file mode 100644 index 00000000..8c429596 --- /dev/null +++ b/client/scss/share-buttons/_share-buttons.scss @@ -0,0 +1,9 @@ +.share-buttons { + display: flex; + align-items: center; + + a { + display: block; + margin: 0 7px; + } +} diff --git a/client/src/components/AssetShareButtons/index.js b/client/src/components/AssetShareButtons/index.js index dfb0c0b9..6c9a165d 100644 --- a/client/src/components/AssetShareButtons/index.js +++ b/client/src/components/AssetShareButtons/index.js @@ -1,38 +1,37 @@ import React from 'react'; -import SpaceBetween from '@components/SpaceBetween'; const AssetShareButtons = ({ host, name, shortId }) => { return ( - + ); }; diff --git a/public/assets/img/icn_facebook.svg b/public/assets/img/icn_facebook.svg new file mode 100644 index 00000000..6e94795e --- /dev/null +++ b/public/assets/img/icn_facebook.svg @@ -0,0 +1,14 @@ + + + + icn_facebook + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/assets/img/icn_reddit.svg b/public/assets/img/icn_reddit.svg new file mode 100644 index 00000000..950939fc --- /dev/null +++ b/public/assets/img/icn_reddit.svg @@ -0,0 +1,14 @@ + + + + icn_reddit + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/assets/img/icn_tumblr.svg b/public/assets/img/icn_tumblr.svg new file mode 100644 index 00000000..04fd2ef8 --- /dev/null +++ b/public/assets/img/icn_tumblr.svg @@ -0,0 +1,14 @@ + + + + icn_tumblr + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/assets/img/icn_twitter.svg b/public/assets/img/icn_twitter.svg new file mode 100644 index 00000000..1ae7d9c0 --- /dev/null +++ b/public/assets/img/icn_twitter.svg @@ -0,0 +1,14 @@ + + + + icn_twitter + Created with Sketch. + + + + + + + + + \ No newline at end of file From de27ae81a86aa4257df1331ffa099d071756141c Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 14 Oct 2018 19:42:47 +0100 Subject: [PATCH 12/63] Added border left on asset information + variable change on collapse component --- client/scss/asset-display/_asset-display.scss | 21 ++++++++++++++++++- .../scss/vertical-split/_vertical-split.scss | 2 +- .../VerticalCollapsibleSplit/index.jsx | 12 +++++------ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index b756ccbd..d9367cde 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -57,10 +57,29 @@ .visible-content { width: 100%; margin: 0 0 40px; + padding-bottom: 25px; + box-shadow: 0 1px 3px 2px rgba(169, 173, 186, 0.2); + &.closed { + box-shadow: none; + } } .asset-information-wrap { max-width: 800px; + + .horizontal-split { + justify-content: center; + .column { + &:first-child { + padding-right: 40px; + } + &:last-child { + padding-left: 40px; + border-left: 1px solid #A9ADBA; + } + } + } + p.asset-description { white-space: pre-line; font-size: 14px; @@ -70,7 +89,7 @@ width: 360px; } .asset-information { - width: 320px; + width: 341px; } } \ No newline at end of file diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 665e4c80..1271c83b 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -6,7 +6,7 @@ align-items : center; }; -.collapse-content.hidden{ +.collapse-content.closed{ display: none; } diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index 6602b108..57cae21d 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -5,24 +5,24 @@ class VerticalCollapsibleSplit extends React.Component { constructor (props) { super(props); this.collapse = this.collapse.bind(this); - this.state = { open: true }; + this.state = { closed: false }; } collapse () { - this.setState({ open: !this.state.open }); - document.getElementById(this.props.name).classList.toggle('hidden'); + this.setState({ closed: !this.state.closed }); + document.querySelectorAll(`[data-name='${this.props.name}']`).forEach(el => el.classList.toggle('closed')); } render () { return (
-
+
{this.props.top}
-
+
{this.props.bottom}
From 160fefb4178e89033e65ee0f9c089ab9f0c8bcf8 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Wed, 17 Oct 2018 00:03:05 +0100 Subject: [PATCH 13/63] Added Circular Font --- client/scss/font/Circular/CircularStd-Bold.ttf | Bin 0 -> 86368 bytes client/scss/font/Circular/CircularStd-Book.ttf | Bin 0 -> 82860 bytes client/scss/font/_font.scss | 13 +++++++++++++ client/scss/text/_text.scss | 2 +- ...td-Bold-5b43235344fe2aee5bbbbe836e3acc7d.ttf | Bin 0 -> 86368 bytes ...td-Book-5dfcf720810d073aff5add284e733c18.ttf | Bin 0 -> 82860 bytes 6 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 client/scss/font/Circular/CircularStd-Bold.ttf create mode 100644 client/scss/font/Circular/CircularStd-Book.ttf create mode 100644 public/bundle/CircularStd-Bold-5b43235344fe2aee5bbbbe836e3acc7d.ttf create mode 100644 public/bundle/CircularStd-Book-5dfcf720810d073aff5add284e733c18.ttf diff --git a/client/scss/font/Circular/CircularStd-Bold.ttf b/client/scss/font/Circular/CircularStd-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..76eda84c9e7b22c8c32fb3b2f75ee33dabe84d99 GIT binary patch literal 86368 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 G%>M;lA(5Q` literal 0 HcmV?d00001 diff --git a/client/scss/font/Circular/CircularStd-Book.ttf b/client/scss/font/Circular/CircularStd-Book.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0bac769f171b4eb32558a8bb8bf640bae432f08 GIT binary patch literal 82860 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 G%>M;lA(5Q` literal 0 HcmV?d00001 diff --git a/public/bundle/CircularStd-Book-5dfcf720810d073aff5add284e733c18.ttf b/public/bundle/CircularStd-Book-5dfcf720810d073aff5add284e733c18.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0bac769f171b4eb32558a8bb8bf640bae432f08 GIT binary patch literal 82860 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 Date: Sun, 21 Oct 2018 20:52:10 +0100 Subject: [PATCH 14/63] Style changes --- client/scss/asset-display/_asset-display.scss | 4 ++-- client/scss/nav-bar/_nav-bar.scss | 2 +- client/scss/row/_row.scss | 7 ++++++- client/scss/variables/_variables.scss | 5 +++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index d9367cde..38416d60 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -4,14 +4,14 @@ flex-direction: column; justify-content: center; - background: #E9E8E8; + background: #F6F6F6; width: 100%; position: relative; &:before, &:after { content: ''; position: absolute; - box-shadow: inset 0 1px 3px 2px rgba(169, 173, 186, 0.2); + box-shadow: inset 0 1px 2px 2px rgba(169, 173, 186, 0.2); width: 100%; height: 1px; background: transparent; diff --git a/client/scss/nav-bar/_nav-bar.scss b/client/scss/nav-bar/_nav-bar.scss index 8d5e3f37..e1bbdde4 100644 --- a/client/scss/nav-bar/_nav-bar.scss +++ b/client/scss/nav-bar/_nav-bar.scss @@ -1,7 +1,7 @@ .nav-bar { padding-left: $primary-padding; padding-right: $primary-padding; - border-bottom: 0.5px solid $tertiary-color; + // border-bottom: 0.5px solid $tertiary-color; .select--arrow { padding: 0 1.5em 0 $input-padding; } diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index 1789f1d6..ef404e50 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -28,7 +28,12 @@ align-self: flex-start; width: 100%; color: $grey; - font-size: 12px; + .label { + text-transform: uppercase; + font-size: 18px; + letter-spacing: 0.4px; + line-height: 18px; + } } .row-labeled-content { diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index b33e1cfa..f7ad0ce9 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -5,8 +5,9 @@ $tertiary-color: #ccccc0; $interactive-color: blue; $success-color: green; $failure-color: red; -$brand-color: #ff725d; -$grey: #a9adba; +// $brand-color: #ff725d; +$brand-color: #1944F9; +$grey: #9095A5; $primary-padding: 3em; $secondary-padding: 2em; From 293a2ccfad0dd9a7fbb58a4e78257c5c8f2deff8 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 20:59:43 +0100 Subject: [PATCH 15/63] Icon changed to circle --- client/scss/asset-display/_asset-display.scss | 2 +- client/scss/click-to-copy/_click-to-copy.scss | 2 ++ client/src/components/VerticalCollapsibleSplit/index.jsx | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 38416d60..e9823933 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -75,7 +75,7 @@ } &:last-child { padding-left: 40px; - border-left: 1px solid #A9ADBA; + border-left: 1px solid #9095a54d; } } } diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index ee630eac..f408978a 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -15,6 +15,8 @@ letter-spacing: -0.6px; line-height: 20px; max-width: 200px; + letter-spacing: 0; + font-family: monospace; } svg { stroke: $brand-color; diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index 57cae21d..64807af7 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -19,7 +19,7 @@ class VerticalCollapsibleSplit extends React.Component {
{this.props.top}
From 6a02d7d169b52ecc51dd5721058458d6b1ad1bfa Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 21:05:38 +0100 Subject: [PATCH 16/63] label font changes --- client/scss/row/_row.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index ef404e50..dcf3e3a8 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -29,8 +29,9 @@ width: 100%; color: $grey; .label { + font-weight: bold; text-transform: uppercase; - font-size: 18px; + font-size: 13px; letter-spacing: 0.4px; line-height: 18px; } From ba9dc3df5376690abbe6e125f34e4ee14feedf20 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 21:35:45 +0100 Subject: [PATCH 17/63] Style clean up for click to copy --- client/scss/click-to-copy/_click-to-copy.scss | 24 ++++++++++++++----- client/scss/share-buttons/_share-buttons.scss | 2 +- client/scss/variables/_variables.scss | 1 + .../scss/vertical-split/_vertical-split.scss | 7 ++++++ client/src/components/ClickToCopy/index.jsx | 4 +++- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index f408978a..16b6996f 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -2,25 +2,37 @@ display: flex; width: 100%; justify-content: space-between; + align-items: center; cursor: pointer; + border: 1px solid $grey-alt; + border-radius: 6px; + max-width: 280px; .click-to-copy { border: none; - padding: 0.5em; + padding: 0.36em 0.5em; margin: 0; color: black; - background-color: white; + background-color: transparent; width: calc(100% - 1em - 2px); font-size: 14px; color: #2E2F31; letter-spacing: -0.6px; line-height: 20px; - max-width: 200px; + max-width: 236px; letter-spacing: 0; font-family: monospace; + border-right: 1px solid #9095a54d; } - svg { - stroke: $brand-color; - + .icon-wrap { + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + svg { + stroke: $brand-color; + width: 12px; + height: 12px; + } } } diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/share-buttons/_share-buttons.scss index 8c429596..26be33a1 100644 --- a/client/scss/share-buttons/_share-buttons.scss +++ b/client/scss/share-buttons/_share-buttons.scss @@ -1,7 +1,7 @@ .share-buttons { display: flex; align-items: center; - + margin: 0 -7px; a { display: block; margin: 0 7px; diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index f7ad0ce9..5f19ce0e 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -8,6 +8,7 @@ $failure-color: red; // $brand-color: #ff725d; $brand-color: #1944F9; $grey: #9095A5; +$grey-alt: #9095a54d; $primary-padding: 3em; $secondary-padding: 2em; diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 1271c83b..ebccf388 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -10,6 +10,13 @@ display: none; } +.collapse-content { + padding-bottom: 80px; + @media (max-width: $break-point-medium) { + padding-bottom: 60px; + } +} + .collapse-button { outline: none; background: none; diff --git a/client/src/components/ClickToCopy/index.jsx b/client/src/components/ClickToCopy/index.jsx index 832ce973..8bc4d3cb 100644 --- a/client/src/components/ClickToCopy/index.jsx +++ b/client/src/components/ClickToCopy/index.jsx @@ -32,7 +32,9 @@ class ClickToCopy extends React.Component { readOnly spellCheck='false' /> - +
+ +
); } From 58b52a4e9ccbf1ef7050ec8549dd7e82f2b435b0 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 22:24:34 +0100 Subject: [PATCH 18/63] Icon changes + claim address placeholder + image size change. --- client/scss/asset-display/_asset-display.scss | 28 +++++++----- client/scss/body/_body.scss | 2 +- client/scss/click-to-copy/_click-to-copy.scss | 8 ++-- client/scss/link/_link.scss | 31 +++++++++++++ client/src/containers/AssetInfo/view.jsx | 45 ++++++++++++++----- 5 files changed, 86 insertions(+), 28 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index e9823933..e8eeced3 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -26,20 +26,19 @@ } - - .asset-title { - margin-top: 40px; - font-weight: normal; - font-size: 26px; - color: #2E2F31; - letter-spacing: 0; - text-align: center; - line-height: 32px; - } +.asset-title { + margin-top: 40px; + font-weight: normal; + font-size: 26px; + color: #2E2F31; + letter-spacing: 0; + text-align: center; + line-height: 32px; +} .asset-image, .asset-video { - margin : 60px 0; - max-width: 100%; + margin: 60px auto; + max-width: 60vh; max-height: 100%; object-fit: contain; object-position: center; @@ -92,4 +91,9 @@ width: 341px; } +} + +.asset-footer { + padding-top: 30px; + border-top: 1px solid $grey-alt; } \ No newline at end of file diff --git a/client/scss/body/_body.scss b/client/scss/body/_body.scss index 90f22258..6072cbd4 100644 --- a/client/scss/body/_body.scss +++ b/client/scss/body/_body.scss @@ -7,4 +7,4 @@ body { display: flex; -webkit-flex-direction: column; flex-direction: column; -} +} \ No newline at end of file diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index 16b6996f..c5d1fd3d 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -21,17 +21,17 @@ max-width: 236px; letter-spacing: 0; font-family: monospace; - border-right: 1px solid #9095a54d; + border-right: 1px solid $grey-alt; } .icon-wrap { width: 30px; height: 30px; - line-height: 30px; + line-height: 34px; text-align: center; svg { stroke: $brand-color; - width: 12px; - height: 12px; + width: 16px; + height: 16px; } } } diff --git a/client/scss/link/_link.scss b/client/scss/link/_link.scss index ee5cc8c7..4fbc92ef 100644 --- a/client/scss/link/_link.scss +++ b/client/scss/link/_link.scss @@ -29,3 +29,34 @@ a, a:visited { color: $interactive-color; border-bottom: 2px solid $interactive-color; } + + +.link--icon, .link--icon:visited { + display: flex; + .link-text { + padding-bottom: 2px; + border-bottom: 1px solid transparent; + transition: all 0.2s ease; + } + .icon-wrap { + margin-left: 5px; + padding-top: 3px; + align-items: center; + svg { + width: 16px; + height: 16px; + stroke-width: 1.2px; + stroke: $grey-alt; + transition: all 0.2s ease; + } + } + &:hover { + .link-text { + border-bottom: 1px solid $brand-color; + } + svg { + stroke: $brand-color; + } + } +} + diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index b150b488..30a366bc 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -7,6 +7,7 @@ import SpaceBetween from '@components/SpaceBetween'; import AssetShareButtons from '@components/AssetShareButtons'; import HorizontalSplit from '@components/HorizontalSplit'; import ClickToCopy from '@components/ClickToCopy'; +import * as Icon from 'react-feather'; class AssetInfo extends React.Component { render () { @@ -93,33 +94,55 @@ class AssetInfo extends React.Component { - Direct Link +
Direct Link
+
+ +
+
- Download +
Download
+
+ +
- Report +
Report
+
+ +
- -

- Hosted via the LBRY blockchain -

-
+
+ +

+ Hosted via the LBRY blockchain +

+
+
+ + } + content={ + Place Claim Address Here + } + /> +
+
} From 034bedac103689bf3f070495e80f24480de8982d Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 22:28:18 +0100 Subject: [PATCH 19/63] Icon color changes for download, direct, report icons. --- client/scss/link/_link.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/scss/link/_link.scss b/client/scss/link/_link.scss index 4fbc92ef..fa81a1da 100644 --- a/client/scss/link/_link.scss +++ b/client/scss/link/_link.scss @@ -45,8 +45,7 @@ a, a:visited { svg { width: 16px; height: 16px; - stroke-width: 1.2px; - stroke: $grey-alt; + stroke: $grey; transition: all 0.2s ease; } } From a188adc311cde2b52d17ae7a1383e52517bd57ff Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 22:38:27 +0100 Subject: [PATCH 20/63] Link underlines for @channel + claim address + lbry url --- client/scss/asset-display/_asset-display.scss | 4 ++-- client/scss/link/_link.scss | 11 +++++++++++ client/src/containers/AssetInfo/view.jsx | 6 +++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index e8eeced3..a4c6f1f9 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -73,7 +73,7 @@ padding-right: 40px; } &:last-child { - padding-left: 40px; + padding-left: 60px; border-left: 1px solid #9095a54d; } } @@ -88,7 +88,7 @@ width: 360px; } .asset-information { - width: 341px; + width: 320px; } } diff --git a/client/scss/link/_link.scss b/client/scss/link/_link.scss index fa81a1da..59b189be 100644 --- a/client/scss/link/_link.scss +++ b/client/scss/link/_link.scss @@ -59,3 +59,14 @@ a, a:visited { } } + +.link--hover { + display: inline-block; + padding-bottom: 2px; + border-bottom: 1px solid transparent; + transition: all 0.2s ease; + &:hover { + border-bottom: 1px solid $brand-color; + } +} + diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 30a366bc..71bfea1f 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -32,7 +32,7 @@ class AssetInfo extends React.Component { } content={ - {channelName} + {channelName} } /> @@ -129,7 +129,7 @@ class AssetInfo extends React.Component {

- Hosted via the LBRY blockchain + Hosted via the LBRY blockchain

@@ -138,7 +138,7 @@ class AssetInfo extends React.Component {
From a3c44b805c15461697a230828c9ddd1fa42eb92e Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 23:09:02 +0100 Subject: [PATCH 21/63] Border Clean up + moved padding to individuals columns --- client/scss/asset-display/_asset-display.scss | 15 ++++++++-- .../horizontal-split/_horizontal-split.scss | 4 +-- client/scss/share-buttons/_share-buttons.scss | 29 +++++++++++++++++++ client/scss/variables/_variables.scss | 2 +- .../scss/vertical-split/_vertical-split.scss | 7 ----- .../src/components/AssetShareButtons/index.js | 16 +++++----- public/assets/img/facebook.svg | 19 ++++++++++++ public/assets/img/reddit.svg | 19 ++++++++++++ public/assets/img/tumblr.svg | 19 ++++++++++++ public/assets/img/twitter.svg | 19 ++++++++++++ 10 files changed, 129 insertions(+), 20 deletions(-) create mode 100644 public/assets/img/facebook.svg create mode 100644 public/assets/img/reddit.svg create mode 100644 public/assets/img/tumblr.svg create mode 100644 public/assets/img/twitter.svg diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index a4c6f1f9..b06bccb7 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -55,7 +55,7 @@ .visible-content { width: 100%; - margin: 0 0 40px; + margin: 0; padding-bottom: 25px; box-shadow: 0 1px 3px 2px rgba(169, 173, 186, 0.2); &.closed { @@ -69,12 +69,15 @@ .horizontal-split { justify-content: center; .column { + padding-top: 40px; &:first-child { padding-right: 40px; + margin-right: -1px; + border-right: 1px solid $grey-alt; } &:last-child { padding-left: 60px; - border-left: 1px solid #9095a54d; + border-left: 1px solid $grey-alt; } } } @@ -86,6 +89,10 @@ letter-spacing: 0; line-height: 18px; width: 360px; + padding-bottom: 80px; + @media (max-width: $break-point-medium) { + padding-bottom: 60px; + } } .asset-information { width: 320px; @@ -96,4 +103,8 @@ .asset-footer { padding-top: 30px; border-top: 1px solid $grey-alt; + padding-bottom: 80px; + @media (max-width: $break-point-medium) { + padding-bottom: 60px; + } } \ No newline at end of file diff --git a/client/scss/horizontal-split/_horizontal-split.scss b/client/scss/horizontal-split/_horizontal-split.scss index bd304c3c..c6be788f 100644 --- a/client/scss/horizontal-split/_horizontal-split.scss +++ b/client/scss/horizontal-split/_horizontal-split.scss @@ -2,7 +2,7 @@ display : flex; flex-direction : row; justify-content: space-between; - align-items : flex-start; + .column { width: 50%; } @@ -16,7 +16,7 @@ display : flex; flex-direction : column; justify-content: space-between; - align-items : flex-start; + .column { width: 100%; padding-left: 0; diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/share-buttons/_share-buttons.scss index 26be33a1..d74c263b 100644 --- a/client/scss/share-buttons/_share-buttons.scss +++ b/client/scss/share-buttons/_share-buttons.scss @@ -4,6 +4,35 @@ margin: 0 -7px; a { display: block; + width: 30px; + height: 30px; margin: 0 7px; + border-radius: 100%; + line-height: 30px; + text-align: center; + &.twitter { + background:#4DC2FE + } + + &.facebook { + background: #5487DE; + img { + margin-top: 6px; + } + } + + &.tumblr { + background: #274061; + img { + margin-top: 7px; + } + } + + &.reddit { + background: #FF4500; + img { + margin-top: 7px; + } + } } } diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index 5f19ce0e..efabfaa7 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -8,7 +8,7 @@ $failure-color: red; // $brand-color: #ff725d; $brand-color: #1944F9; $grey: #9095A5; -$grey-alt: #9095a54d; +$grey-alt: #DDDFE4; $primary-padding: 3em; $secondary-padding: 2em; diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index ebccf388..1271c83b 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -10,13 +10,6 @@ display: none; } -.collapse-content { - padding-bottom: 80px; - @media (max-width: $break-point-medium) { - padding-bottom: 60px; - } -} - .collapse-button { outline: none; background: none; diff --git a/client/src/components/AssetShareButtons/index.js b/client/src/components/AssetShareButtons/index.js index 6c9a165d..8e093bdc 100644 --- a/client/src/components/AssetShareButtons/index.js +++ b/client/src/components/AssetShareButtons/index.js @@ -4,32 +4,32 @@ const AssetShareButtons = ({ host, name, shortId }) => { return ( ); diff --git a/public/assets/img/facebook.svg b/public/assets/img/facebook.svg new file mode 100644 index 00000000..a8a55384 --- /dev/null +++ b/public/assets/img/facebook.svg @@ -0,0 +1,19 @@ + + + + facebook + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/img/reddit.svg b/public/assets/img/reddit.svg new file mode 100644 index 00000000..4291cd7e --- /dev/null +++ b/public/assets/img/reddit.svg @@ -0,0 +1,19 @@ + + + + reddit + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/img/tumblr.svg b/public/assets/img/tumblr.svg new file mode 100644 index 00000000..7cbb240e --- /dev/null +++ b/public/assets/img/tumblr.svg @@ -0,0 +1,19 @@ + + + + tumblr + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/img/twitter.svg b/public/assets/img/twitter.svg new file mode 100644 index 00000000..1325869f --- /dev/null +++ b/public/assets/img/twitter.svg @@ -0,0 +1,19 @@ + + + + twitter + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file From 3461443a1095dc1064b92c1fc4d725cc2d031f3f Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 23:12:10 +0100 Subject: [PATCH 22/63] Row padding change. --- client/scss/row/_row.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index dcf3e3a8..786fb884 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -1,5 +1,5 @@ .row { - padding-bottom: 2em; + padding-bottom: 1.2em; } .row-labeled { From 8d3b03fd26c712d8c349ec6f6592fe63aacb1df9 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 23:13:37 +0100 Subject: [PATCH 23/63] visible content padding change --- client/scss/asset-display/_asset-display.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index b06bccb7..44b03264 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -56,7 +56,7 @@ .visible-content { width: 100%; margin: 0; - padding-bottom: 25px; + padding-bottom: 30px; box-shadow: 0 1px 3px 2px rgba(169, 173, 186, 0.2); &.closed { box-shadow: none; From b8466722138f8ba55cd12067401333261c615592 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 23:29:04 +0100 Subject: [PATCH 24/63] Twitter icon fix --- client/scss/share-buttons/_share-buttons.scss | 11 ++++++++++- public/assets/img/twitter.svg | 9 ++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/share-buttons/_share-buttons.scss index d74c263b..38f0ed23 100644 --- a/client/scss/share-buttons/_share-buttons.scss +++ b/client/scss/share-buttons/_share-buttons.scss @@ -10,8 +10,13 @@ border-radius: 100%; line-height: 30px; text-align: center; + transition: all 0.2s ease; &.twitter { - background:#4DC2FE + background:#4DC2FE; + img { + margin-top: 8px; + margin-left: 2px; + } } &.facebook { @@ -34,5 +39,9 @@ margin-top: 7px; } } + + &:hover { + background: $brand-color; + } } } diff --git a/public/assets/img/twitter.svg b/public/assets/img/twitter.svg index 1325869f..85f01535 100644 --- a/public/assets/img/twitter.svg +++ b/public/assets/img/twitter.svg @@ -1,15 +1,18 @@ - + twitter Created with Sketch. - + - + + + + From a3b826fa87ad007da0f4a60af209cfbd4ea1c9fb Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 23:38:04 +0100 Subject: [PATCH 25/63] Rotate added. --- client/scss/vertical-split/_vertical-split.scss | 10 ++++++++++ .../src/components/VerticalCollapsibleSplit/index.jsx | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 1271c83b..3fd72e90 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -20,5 +20,15 @@ height: 24px; svg { stroke: $brand-color; + &.plus-icon { + transform: rotate(0); + transition: all 0.4s ease; + } + } + + &:hover { + .plus-icon { + transform: rotate(-180deg); + } } } \ No newline at end of file diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index 64807af7..3a2aa29e 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -19,7 +19,7 @@ class VerticalCollapsibleSplit extends React.Component {
{this.props.top}
From 907604f7a4c2615afc282d01b513c9ffadb88352 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Sun, 21 Oct 2018 23:43:07 +0100 Subject: [PATCH 26/63] Click to copy width change. --- client/scss/click-to-copy/_click-to-copy.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index c5d1fd3d..b0bb6ccd 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -6,7 +6,6 @@ cursor: pointer; border: 1px solid $grey-alt; border-radius: 6px; - max-width: 280px; .click-to-copy { border: none; padding: 0.36em 0.5em; @@ -18,7 +17,6 @@ color: #2E2F31; letter-spacing: -0.6px; line-height: 20px; - max-width: 236px; letter-spacing: 0; font-family: monospace; border-right: 1px solid $grey-alt; From 24432af4545e9e1508411846ac8038326970bc4d Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 20:51:27 +0100 Subject: [PATCH 27/63] responsive WIP --- client/scss/asset-display/_asset-display.scss | 25 ++++++++++++++++--- client/scss/link/_link.scss | 4 +++ .../scss/vertical-split/_vertical-split.scss | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 44b03264..ae8e9405 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -74,11 +74,23 @@ padding-right: 40px; margin-right: -1px; border-right: 1px solid $grey-alt; + @media (max-width: $break-point-large) { + order: 2; + border: none; + padding: 0; + margin: 0; + } } &:last-child { padding-left: 60px; border-left: 1px solid $grey-alt; + @media (max-width: $break-point-large) { + border: none; + padding: 40px 0 0 0; + margin: 0; + } } + } } @@ -90,12 +102,19 @@ line-height: 18px; width: 360px; padding-bottom: 80px; - @media (max-width: $break-point-medium) { - padding-bottom: 60px; + @media (max-width: $break-point-large) { + padding: 0; + width: 100%; + margin-bottom: 60px; } } .asset-information { width: 320px; + @media (max-width: $break-point-large) { + min-width: 320px; + width: 100%; + } + } } @@ -104,7 +123,7 @@ padding-top: 30px; border-top: 1px solid $grey-alt; padding-bottom: 80px; - @media (max-width: $break-point-medium) { + @media (max-width: $break-point-large) { padding-bottom: 60px; } } \ No newline at end of file diff --git a/client/scss/link/_link.scss b/client/scss/link/_link.scss index 59b189be..320e848f 100644 --- a/client/scss/link/_link.scss +++ b/client/scss/link/_link.scss @@ -48,6 +48,10 @@ a, a:visited { stroke: $grey; transition: all 0.2s ease; } + + @media (max-width: $break-point-x-small) { + padding-top: 0; + } } &:hover { .link-text { diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 3fd72e90..0857c491 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -18,6 +18,7 @@ margin: 15px auto 0; width: 24px; height: 24px; + padding: 0; svg { stroke: $brand-color; &.plus-icon { From 33ed0e8f592bcdee4dce34fe1e19a45461c00e91 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 21:26:19 +0100 Subject: [PATCH 28/63] Responsive tidy up --- client/scss/asset-display/_asset-display.scss | 27 ++++++++++++++----- .../horizontal-split/_horizontal-split.scss | 2 +- client/scss/share-buttons/_share-buttons.scss | 5 +++- client/scss/variables/_variables.scss | 2 ++ .../scss/vertical-split/_vertical-split.scss | 7 +++++ 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index ae8e9405..4e1e1515 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -42,6 +42,9 @@ max-height: 100%; object-fit: contain; object-position: center; + @media (max-width: $break-point-small) { + max-width: calc(100% - 30px); + } } .asset-video { border: 1px solid #d0d0d0; @@ -65,6 +68,15 @@ .asset-information-wrap { max-width: 800px; + @media (max-width: $break-point-tablet) { + max-width: 100%; + margin: 0px auto; + width: calc(100% - 80px); + } + + @media (max-width: $break-point-phone) { + width: calc(100% - 30px); + } .horizontal-split { justify-content: center; @@ -74,7 +86,7 @@ padding-right: 40px; margin-right: -1px; border-right: 1px solid $grey-alt; - @media (max-width: $break-point-large) { + @media (max-width: $break-point-tablet) { order: 2; border: none; padding: 0; @@ -84,7 +96,7 @@ &:last-child { padding-left: 60px; border-left: 1px solid $grey-alt; - @media (max-width: $break-point-large) { + @media (max-width: $break-point-tablet) { border: none; padding: 40px 0 0 0; margin: 0; @@ -102,7 +114,7 @@ line-height: 18px; width: 360px; padding-bottom: 80px; - @media (max-width: $break-point-large) { + @media (max-width: $break-point-tablet) { padding: 0; width: 100%; margin-bottom: 60px; @@ -110,9 +122,10 @@ } .asset-information { width: 320px; - @media (max-width: $break-point-large) { - min-width: 320px; + @media (max-width: $break-point-tablet) { + min-width: 100%; width: 100%; + margin-bottom: 60px; } } @@ -123,7 +136,7 @@ padding-top: 30px; border-top: 1px solid $grey-alt; padding-bottom: 80px; - @media (max-width: $break-point-large) { - padding-bottom: 60px; + @media (max-width: $break-point-tablet) { + padding: 0; } } \ No newline at end of file diff --git a/client/scss/horizontal-split/_horizontal-split.scss b/client/scss/horizontal-split/_horizontal-split.scss index c6be788f..52034731 100644 --- a/client/scss/horizontal-split/_horizontal-split.scss +++ b/client/scss/horizontal-split/_horizontal-split.scss @@ -10,7 +10,7 @@ -@media (max-width: $break-point-large ) { +@media (max-width: $break-point-tablet) { .horizontal-split { display : flex; diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/share-buttons/_share-buttons.scss index 38f0ed23..05711d47 100644 --- a/client/scss/share-buttons/_share-buttons.scss +++ b/client/scss/share-buttons/_share-buttons.scss @@ -1,7 +1,6 @@ .share-buttons { display: flex; align-items: center; - margin: 0 -7px; a { display: block; width: 30px; @@ -40,6 +39,10 @@ } } + &:first-child{ + margin-left: 0px; + } + &:hover { background: $brand-color; } diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index efabfaa7..0ff975ba 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -36,7 +36,9 @@ $text-x-small: small; $break-point-xx-large: 1400px; $break-point-x-large: 1290px; $break-point-large: 1000px; +$break-point-tablet: 900px; $break-point-medium: 800px; +$break-point-phone: 640px; $break-point-small: 500px; $break-point-x-small: 400px; diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 0857c491..81f7119d 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -6,6 +6,13 @@ align-items : center; }; +.collapse-content { + @media (max-width: $break-point-tablet) { + max-width: 100%; + width: 100%; + } +} + .collapse-content.closed{ display: none; } From 954bc189d72e90d0b870ddbb5fbd9afa9c687c72 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 21:36:37 +0100 Subject: [PATCH 29/63] Padding on title + asset display spacing fixed + removed unused feather.js call in fullpage --- client/scss/asset-display/_asset-display.scss | 10 +++++----- client/scss/text/_text.scss | 4 ++-- server/render/renderFullPage.js | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 4e1e1515..7b3daf7e 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -34,6 +34,10 @@ letter-spacing: 0; text-align: center; line-height: 32px; + + @media (max-width: $break-point-tablet) { + padding: 0 20px; + } } .asset-image, .asset-video { @@ -52,10 +56,6 @@ padding: 6px; } -// .vertical-split .asset-display { -// height: 90vh; -// } - .visible-content { width: 100%; margin: 0; @@ -137,6 +137,6 @@ border-top: 1px solid $grey-alt; padding-bottom: 80px; @media (max-width: $break-point-tablet) { - padding: 0; + padding-bottom: 0; } } \ No newline at end of file diff --git a/client/scss/text/_text.scss b/client/scss/text/_text.scss index 331eaff7..0c5b6140 100644 --- a/client/scss/text/_text.scss +++ b/client/scss/text/_text.scss @@ -116,7 +116,7 @@ p, body, button, input, textarea, label, select, option { } p, body, button, input, textarea, label, select, option { - font-size: $text-small; + font-size: 15px; } .text--extra-large { @@ -146,7 +146,7 @@ p, body, button, input, textarea, label, select, option { } p, body, button, input, textarea, label, select, option { - font-size: $text-x-small; + font-size: 15px; } .text--extra-large { diff --git a/server/render/renderFullPage.js b/server/render/renderFullPage.js index 8f40e2b2..12e39214 100644 --- a/server/render/renderFullPage.js +++ b/server/render/renderFullPage.js @@ -23,7 +23,6 @@ module.exports = (helmet, html, preloadedState) => { window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace(/ - `; From 22a5b2581dd52b0118fb333fa74cf807176b3fc0 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 21:57:39 +0100 Subject: [PATCH 30/63] Moved inline row into a new class inside row.scss and applied same rule for channel and share --- client/scss/click-to-copy/_click-to-copy.scss | 1 - client/scss/row/_row.scss | 22 ++++ client/src/containers/AssetInfo/view.jsx | 117 +++++++++--------- 3 files changed, 82 insertions(+), 58 deletions(-) diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index b0bb6ccd..f66a571e 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -33,4 +33,3 @@ } } } - diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index 786fb884..d0df008d 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -58,3 +58,25 @@ } } + + +@media (max-width: $break-point-tablet) and (min-width: $break-point-phone) { + .tablet-inline-row { + display: flex; + justify-content: space-between; + width: 100%; + + >.row { + flex: 1; + margin: 0 15px; + + &:first-child { + margin-left: 0; + } + + &:last-child { + margin-right: 0; + } + } + } +} diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 71bfea1f..93d6db95 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -24,72 +24,75 @@ class AssetInfo extends React.Component { } rightSide={
- {channelName && ( +
+ {channelName && ( + + + } + content={ + + {channelName} + + } + /> + + )} + + +
+
+ + + } + content={ + } /> - )} - - - } - content={ - - } - /> - - - - - } - content={ - - } - /> - - - - - } - content={ -
- {(contentType === 'video/mp4') ? ( - `} - /> - ) : ( - `} - /> - )} -
- } - /> -
+ + + } + content={ +
+ {(contentType === 'video/mp4') ? ( + `} + /> + ) : ( + `} + /> + )} +
+ } + /> +
+
From 7c31510b83dd2e24ea47d212a07a23809ce99784 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 22:15:53 +0100 Subject: [PATCH 31/63] collapse button fix, line added on description --- client/scss/asset-display/_asset-display.scss | 8 ++++++-- client/scss/vertical-split/_vertical-split.scss | 1 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 7b3daf7e..7b354ba1 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -115,9 +115,12 @@ width: 360px; padding-bottom: 80px; @media (max-width: $break-point-tablet) { - padding: 0; + padding: 22px 0 0; width: 100%; + max-width: 600px; + margin: 0px auto 60px; margin-bottom: 60px; + border-top: 1px solid $grey-alt; } } .asset-information { @@ -125,7 +128,7 @@ @media (max-width: $break-point-tablet) { min-width: 100%; width: 100%; - margin-bottom: 60px; + margin-bottom: 30px; } } @@ -137,6 +140,7 @@ border-top: 1px solid $grey-alt; padding-bottom: 80px; @media (max-width: $break-point-tablet) { + padding-top: 22px; padding-bottom: 0; } } \ No newline at end of file diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 81f7119d..13d7ca93 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -25,7 +25,6 @@ margin: 15px auto 0; width: 24px; height: 24px; - padding: 0; svg { stroke: $brand-color; &.plus-icon { From 6efff66267b52dbdb5345a0b9b2450398651f343 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 22:25:55 +0100 Subject: [PATCH 32/63] Grey line changes --- client/scss/asset-display/_asset-display.scss | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 7b354ba1..5f69ebf9 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -115,12 +115,10 @@ width: 360px; padding-bottom: 80px; @media (max-width: $break-point-tablet) { - padding: 22px 0 0; + padding: 0; width: 100%; max-width: 600px; - margin: 0px auto 60px; - margin-bottom: 60px; - border-top: 1px solid $grey-alt; + margin: 22px 0 60px; } } .asset-information { @@ -128,7 +126,8 @@ @media (max-width: $break-point-tablet) { min-width: 100%; width: 100%; - margin-bottom: 30px; + padding-bottom: 30px; + border-bottom: 1px solid $grey-alt; } } From e9a8b5288e90cb4b63be8973a5c913b239b68d4d Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 22:29:44 +0100 Subject: [PATCH 33/63] row change for tablet --- client/scss/row/_row.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index d0df008d..787d5161 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -61,6 +61,10 @@ @media (max-width: $break-point-tablet) and (min-width: $break-point-phone) { + .row { + margin-bottom: 1.4em; + } + .tablet-inline-row { display: flex; justify-content: space-between; @@ -68,7 +72,7 @@ >.row { flex: 1; - margin: 0 15px; + margin: 0 15px 1.4em; &:first-child { margin-left: 0; From 585e7dada38cc7276db9a1f61121c85835816bda Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 22:38:28 +0100 Subject: [PATCH 34/63] Navbar font-size change. --- client/scss/nav-bar/_nav-bar.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/scss/nav-bar/_nav-bar.scss b/client/scss/nav-bar/_nav-bar.scss index e1bbdde4..54757fbd 100644 --- a/client/scss/nav-bar/_nav-bar.scss +++ b/client/scss/nav-bar/_nav-bar.scss @@ -4,12 +4,14 @@ // border-bottom: 0.5px solid $tertiary-color; .select--arrow { padding: 0 1.5em 0 $input-padding; + font-size: 14px; } } .nav-bar-link { padding: calc(1em - 2px); display: inline-block; + font-size: 14px; } .nav-bar-logo { From 7e51a56388c25c09a639ae5278ae3fc4e85d785c Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Mon, 22 Oct 2018 23:23:18 +0100 Subject: [PATCH 35/63] Swapped Icons, site description removed + navbar uppercase. Box shadow fix. --- client/scss/asset-display/_asset-display.scss | 8 ++++++++ client/scss/nav-bar/_nav-bar.scss | 11 +++++++++++ client/src/components/NavBar/index.jsx | 1 - .../src/components/VerticalCollapsibleSplit/index.jsx | 2 +- client/src/containers/AssetInfo/view.jsx | 2 +- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 5f69ebf9..4a802e06 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -64,6 +64,14 @@ &.closed { box-shadow: none; } + &:before{ + content: ''; + width: 100%; + height: 100px; + position: absolute; + z-index: 100; + box-shadow: inset 0px 2px 3px 2px rgba(169, 173, 186, 0.2); + } } .asset-information-wrap { diff --git a/client/scss/nav-bar/_nav-bar.scss b/client/scss/nav-bar/_nav-bar.scss index 54757fbd..2d10a8fc 100644 --- a/client/scss/nav-bar/_nav-bar.scss +++ b/client/scss/nav-bar/_nav-bar.scss @@ -1,10 +1,17 @@ .nav-bar { padding-left: $primary-padding; padding-right: $primary-padding; + + @media (max-width: $break-point-phone) { + padding-left: 15px; + padding-right: 15px; + } + // border-bottom: 0.5px solid $tertiary-color; .select--arrow { padding: 0 1.5em 0 $input-padding; font-size: 14px; + text-transform: uppercase; } } @@ -12,6 +19,7 @@ padding: calc(1em - 2px); display: inline-block; font-size: 14px; + text-transform: uppercase; } .nav-bar-logo { @@ -25,6 +33,7 @@ padding-bottom: calc(1em - 2px); padding-left: 1em; } + } @media (max-width: $break-point-small ) { @@ -35,3 +44,5 @@ padding-left: 0.5em; } } + + diff --git a/client/src/components/NavBar/index.jsx b/client/src/components/NavBar/index.jsx index bd1028a3..c58aa22d 100644 --- a/client/src/components/NavBar/index.jsx +++ b/client/src/components/NavBar/index.jsx @@ -10,7 +10,6 @@ class NavBar extends React.Component {
-
diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index 3a2aa29e..9d197417 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -19,7 +19,7 @@ class VerticalCollapsibleSplit extends React.Component {
{this.props.top}
diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 93d6db95..201fa25e 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -11,7 +11,7 @@ import * as Icon from 'react-feather'; class AssetInfo extends React.Component { render () { - const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props; + const { asset: { shortId, claimData: { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props; return (
Date: Tue, 23 Oct 2018 22:01:28 +0100 Subject: [PATCH 36/63] Box shadow fix --- client/scss/asset-display/_asset-display.scss | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 4a802e06..855f6bc7 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -60,9 +60,12 @@ width: 100%; margin: 0; padding-bottom: 30px; - box-shadow: 0 1px 3px 2px rgba(169, 173, 186, 0.2); + position: relative; &.closed { box-shadow: none; + &:after { + box-shadow: none; + } } &:before{ content: ''; @@ -70,8 +73,18 @@ height: 100px; position: absolute; z-index: 100; - box-shadow: inset 0px 2px 3px 2px rgba(169, 173, 186, 0.2); - } + box-shadow: inset 2px 3px 3px 2px rgba(169, 173, 186, 0.2); + } + &:after { + content: ''; + width: 100%; + height: 0; + top: 100%; + position: absolute; + z-index: 100; + box-shadow: 0px 2px 3px 2px rgba(169, 173, 186, 0.2); + } + } .asset-information-wrap { From 35d0da670cf6468247bc3770935425bf33fa9c6f Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Tue, 23 Oct 2018 22:26:49 +0100 Subject: [PATCH 37/63] Claim added --- client/scss/asset-display/_asset-display.scss | 10 +++++++- client/src/containers/AssetInfo/view.jsx | 24 ++++++++++--------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 855f6bc7..88223cd6 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -150,7 +150,6 @@ padding-bottom: 30px; border-bottom: 1px solid $grey-alt; } - } } @@ -163,4 +162,13 @@ padding-top: 22px; padding-bottom: 0; } + + .claim-address { + .link--brand { + font-size: 12px; + font-weight: 300; + line-height: 18px; + } + } + } \ No newline at end of file diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 201fa25e..08618d3b 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -11,7 +11,7 @@ import * as Icon from 'react-feather'; class AssetInfo extends React.Component { render () { - const { asset: { shortId, claimData: { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props; + const { asset: { shortId, claimData: { channelName, certificateId, description, name, address, claimId, fileExt, contentType, thumbnail, host } } } = this.props; return (
LBRY blockchain

-
- - } - content={ - Place Claim Address Here - } - /> -
+ {address && ( +
+ + } + content={ + {address} + } + /> +
+ )}
From 7373365ad88d68074b3793829c82184702a7d764 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Tue, 23 Oct 2018 22:52:01 +0100 Subject: [PATCH 38/63] shadow removal + claim address font size + new dropdown icon --- client/scss/asset-display/_asset-display.scss | 8 +------- client/scss/icon/chevron-down.svg | 9 +++++++++ client/scss/nav-bar/_nav-bar.scss | 2 ++ client/scss/select/_select.scss | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 client/scss/icon/chevron-down.svg diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 88223cd6..d6f950ca 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -7,7 +7,6 @@ background: #F6F6F6; width: 100%; position: relative; - &:before, &:after { content: ''; position: absolute; @@ -16,14 +15,9 @@ height: 1px; background: transparent; left: 0; - top: 0; - } - - &:after { top: auto; bottom: 0; } - } .asset-title { @@ -165,7 +159,7 @@ .claim-address { .link--brand { - font-size: 12px; + font-size: 14px; font-weight: 300; line-height: 18px; } diff --git a/client/scss/icon/chevron-down.svg b/client/scss/icon/chevron-down.svg new file mode 100644 index 00000000..9144704e --- /dev/null +++ b/client/scss/icon/chevron-down.svg @@ -0,0 +1,9 @@ + + + + chevron-down + Created with Sketch. + + + + \ No newline at end of file diff --git a/client/scss/nav-bar/_nav-bar.scss b/client/scss/nav-bar/_nav-bar.scss index 2d10a8fc..41415546 100644 --- a/client/scss/nav-bar/_nav-bar.scss +++ b/client/scss/nav-bar/_nav-bar.scss @@ -11,6 +11,7 @@ .select--arrow { padding: 0 1.5em 0 $input-padding; font-size: 14px; + letter-spacing: 0.4px; text-transform: uppercase; } } @@ -19,6 +20,7 @@ padding: calc(1em - 2px); display: inline-block; font-size: 14px; + letter-spacing: 0.4px; text-transform: uppercase; } diff --git a/client/scss/select/_select.scss b/client/scss/select/_select.scss index df03a09e..7142f40c 100644 --- a/client/scss/select/_select.scss +++ b/client/scss/select/_select.scss @@ -10,7 +10,7 @@ select { .select--arrow { -moz-appearance:none; -webkit-appearance: none; - background: url('./icon/downArrow.svg') no-repeat right; + background: url('./icon/chevron-down.svg') no-repeat right; cursor: pointer; padding-right: 1.5em; padding-left: $input-padding From 8ade24f501f61b19667524455712e9d40168c733 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 25 Oct 2018 19:53:43 +0100 Subject: [PATCH 39/63] Added Line break before `:after` pseudo element. --- client/scss/asset-display/_asset-display.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index d6f950ca..e1b3f847 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -3,10 +3,10 @@ flex: 1 0 auto; flex-direction: column; justify-content: center; - background: #F6F6F6; width: 100%; position: relative; + &:after { content: ''; position: absolute; From fe2bc7de6974a4e2f102a12d8b27fa0c1c2ce89a Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 25 Oct 2018 19:57:54 +0100 Subject: [PATCH 40/63] Added spacing between selectors. --- client/scss/asset-display/_asset-display.scss | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index e1b3f847..7eb001e1 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -40,6 +40,7 @@ max-height: 100%; object-fit: contain; object-position: center; + @media (max-width: $break-point-small) { max-width: calc(100% - 30px); } @@ -55,12 +56,15 @@ margin: 0; padding-bottom: 30px; position: relative; + &.closed { box-shadow: none; + &:after { box-shadow: none; } } + &:before{ content: ''; width: 100%; @@ -69,6 +73,7 @@ z-index: 100; box-shadow: inset 2px 3px 3px 2px rgba(169, 173, 186, 0.2); } + &:after { content: ''; width: 100%; @@ -78,11 +83,11 @@ z-index: 100; box-shadow: 0px 2px 3px 2px rgba(169, 173, 186, 0.2); } - } .asset-information-wrap { max-width: 800px; + @media (max-width: $break-point-tablet) { max-width: 100%; margin: 0px auto; @@ -95,12 +100,15 @@ .horizontal-split { justify-content: center; + .column { padding-top: 40px; + &:first-child { padding-right: 40px; margin-right: -1px; border-right: 1px solid $grey-alt; + @media (max-width: $break-point-tablet) { order: 2; border: none; @@ -108,16 +116,17 @@ margin: 0; } } + &:last-child { padding-left: 60px; border-left: 1px solid $grey-alt; + @media (max-width: $break-point-tablet) { border: none; padding: 40px 0 0 0; margin: 0; } } - } } @@ -129,6 +138,7 @@ line-height: 18px; width: 360px; padding-bottom: 80px; + @media (max-width: $break-point-tablet) { padding: 0; width: 100%; @@ -136,8 +146,10 @@ margin: 22px 0 60px; } } + .asset-information { width: 320px; + @media (max-width: $break-point-tablet) { min-width: 100%; width: 100%; @@ -152,12 +164,14 @@ padding-top: 30px; border-top: 1px solid $grey-alt; padding-bottom: 80px; + @media (max-width: $break-point-tablet) { padding-top: 22px; padding-bottom: 0; } .claim-address { + .link--brand { font-size: 14px; font-weight: 300; From 696d39e6c7e4f5589dab006e1f642efe547ee3fd Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 25 Oct 2018 19:59:08 +0100 Subject: [PATCH 41/63] Shadow color moved to variable. --- client/scss/asset-display/_asset-display.scss | 8 ++++---- client/scss/variables/_variables.scss | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 7eb001e1..22919cb9 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -10,7 +10,7 @@ &:after { content: ''; position: absolute; - box-shadow: inset 0 1px 2px 2px rgba(169, 173, 186, 0.2); + box-shadow: inset 0 1px 2px 2px $shadow-color; width: 100%; height: 1px; background: transparent; @@ -71,7 +71,7 @@ height: 100px; position: absolute; z-index: 100; - box-shadow: inset 2px 3px 3px 2px rgba(169, 173, 186, 0.2); + box-shadow: inset 2px 3px 3px 2px $shadow-color; } &:after { @@ -81,7 +81,7 @@ top: 100%; position: absolute; z-index: 100; - box-shadow: 0px 2px 3px 2px rgba(169, 173, 186, 0.2); + box-shadow: 0px 2px 3px 2px $shadow-color; } } @@ -146,7 +146,7 @@ margin: 22px 0 60px; } } - + .asset-information { width: 320px; diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index 0ff975ba..7698081e 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -9,6 +9,7 @@ $failure-color: red; $brand-color: #1944F9; $grey: #9095A5; $grey-alt: #DDDFE4; +$shadow-color: rgba(169, 173, 186, 0.2); $primary-padding: 3em; $secondary-padding: 2em; From 5c1e8cd808ad9f9cfc628020919cc39f68f203b9 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 25 Oct 2018 20:04:16 +0100 Subject: [PATCH 42/63] Fixed Indentation --- client/scss/share-buttons/_share-buttons.scss | 95 ++++++++++--------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/share-buttons/_share-buttons.scss index 05711d47..010ef268 100644 --- a/client/scss/share-buttons/_share-buttons.scss +++ b/client/scss/share-buttons/_share-buttons.scss @@ -1,50 +1,51 @@ .share-buttons { - display: flex; - align-items: center; - a { - display: block; - width: 30px; - height: 30px; - margin: 0 7px; - border-radius: 100%; - line-height: 30px; - text-align: center; - transition: all 0.2s ease; - &.twitter { - background:#4DC2FE; - img { - margin-top: 8px; - margin-left: 2px; - } - } - - &.facebook { - background: #5487DE; - img { - margin-top: 6px; - } - } - - &.tumblr { - background: #274061; - img { - margin-top: 7px; - } - } - - &.reddit { - background: #FF4500; - img { - margin-top: 7px; - } - } - - &:first-child{ - margin-left: 0px; - } - - &:hover { - background: $brand-color; - } + display: flex; + align-items: center; + + a { + display: block; + width: 30px; + height: 30px; + margin: 0 7px; + border-radius: 100%; + line-height: 30px; + text-align: center; + transition: all 0.2s ease; + &.twitter { + background:#4DC2FE; + img { + margin-top: 8px; + margin-left: 2px; + } } + + &.facebook { + background: #5487DE; + img { + margin-top: 6px; + } + } + + &.tumblr { + background: #274061; + img { + margin-top: 7px; + } + } + + &.reddit { + background: #FF4500; + img { + margin-top: 7px; + } + } + + &:first-child{ + margin-left: 0px; + } + + &:hover { + background: $brand-color; + } + } } From be2d3cb3da2e03ff343b68b5583933e91a243e3d Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 25 Oct 2018 20:07:41 +0100 Subject: [PATCH 43/63] Removed unused components --- client/src/pages/ShowAssetDetails/view.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index 9a7d7739..628dc5bc 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -2,8 +2,6 @@ import React from 'react'; import PageLayout from '@components/PageLayout'; import VerticalCollapsibleSplit from '@components/VerticalCollapsibleSplit'; -// import VerticalSplit from '@components/VerticalSplit'; -// import AssetTitle from '@containers/AssetTitle'; import AssetDisplay from '@containers/AssetDisplay'; import AssetInfo from '@containers/AssetInfo'; import ErrorPage from '@pages/ErrorPage'; From e6f634cf9dd437559fe8f91210748f38b0a0be26 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 25 Oct 2018 20:16:38 +0100 Subject: [PATCH 44/63] Faster lookup --- client/src/components/VerticalCollapsibleSplit/index.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index 9d197417..f58b2a20 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -14,6 +14,12 @@ class VerticalCollapsibleSplit extends React.Component { } render () { + let { + props, + state, + collapse, + } = this; + return (
From 9b210d3ad89476700714f3af3a1a38b097d46c14 Mon Sep 17 00:00:00 2001 From: Minesh Mitha Date: Thu, 25 Oct 2018 20:23:05 +0100 Subject: [PATCH 45/63] Sorted styles alphabettically --- client/scss/asset-display/_asset-display.scss | 85 ++++++++++--------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 22919cb9..1ebac34b 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -1,33 +1,33 @@ .asset-display { - display: flex; - flex: 1 0 auto; - flex-direction: column; - justify-content: center; background: #F6F6F6; - width: 100%; + display: flex; + flex-direction: column; + flex: 1 0 auto; + justify-content: center; position: relative; + width: 100%; &:after { - content: ''; - position: absolute; - box-shadow: inset 0 1px 2px 2px $shadow-color; - width: 100%; - height: 1px; background: transparent; - left: 0; - top: auto; bottom: 0; + box-shadow: inset 0 1px 2px 2px $shadow-color; + content: ''; + height: 1px; + left: 0; + position: absolute; + top: auto; + width: 100%; } } .asset-title { - margin-top: 40px; - font-weight: normal; - font-size: 26px; color: #2E2F31; + font-size: 26px; + font-weight: normal; letter-spacing: 0; - text-align: center; line-height: 32px; + margin-top: 40px; + text-align: center; @media (max-width: $break-point-tablet) { padding: 0 20px; @@ -36,8 +36,8 @@ .asset-image, .asset-video { margin: 60px auto; - max-width: 60vh; max-height: 100%; + max-width: 60vh; object-fit: contain; object-position: center; @@ -45,6 +45,7 @@ max-width: calc(100% - 30px); } } + .asset-video { border: 1px solid #d0d0d0; margin: 16px; @@ -52,10 +53,10 @@ } .visible-content { - width: 100%; margin: 0; padding-bottom: 30px; position: relative; + width: 100%; &.closed { box-shadow: none; @@ -66,22 +67,22 @@ } &:before{ + box-shadow: inset 2px 3px 3px 2px $shadow-color; content: ''; - width: 100%; height: 100px; position: absolute; + width: 100%; z-index: 100; - box-shadow: inset 2px 3px 3px 2px $shadow-color; } &:after { - content: ''; - width: 100%; - height: 0; - top: 100%; - position: absolute; - z-index: 100; box-shadow: 0px 2px 3px 2px $shadow-color; + content: ''; + height: 0; + position: absolute; + top: 100%; + width: 100%; + z-index: 100; } } @@ -89,8 +90,8 @@ max-width: 800px; @media (max-width: $break-point-tablet) { - max-width: 100%; margin: 0px auto; + max-width: 100%; width: calc(100% - 80px); } @@ -105,45 +106,45 @@ padding-top: 40px; &:first-child { - padding-right: 40px; - margin-right: -1px; border-right: 1px solid $grey-alt; + margin-right: -1px; + padding-right: 40px; @media (max-width: $break-point-tablet) { - order: 2; border: none; - padding: 0; margin: 0; + order: 2; + padding: 0; } } &:last-child { - padding-left: 60px; border-left: 1px solid $grey-alt; + padding-left: 60px; @media (max-width: $break-point-tablet) { border: none; - padding: 40px 0 0 0; margin: 0; + padding: 40px 0 0 0; } } } } p.asset-description { - white-space: pre-line; - font-size: 14px; color: #2E2F31; + font-size: 14px; letter-spacing: 0; line-height: 18px; - width: 360px; padding-bottom: 80px; + white-space: pre-line; + width: 360px; @media (max-width: $break-point-tablet) { + margin: 22px 0 60px; + max-width: 600px; padding: 0; width: 100%; - max-width: 600px; - margin: 22px 0 60px; } } @@ -151,19 +152,19 @@ width: 320px; @media (max-width: $break-point-tablet) { - min-width: 100%; - width: 100%; - padding-bottom: 30px; border-bottom: 1px solid $grey-alt; + min-width: 100%; + padding-bottom: 30px; + width: 100%; } } } .asset-footer { - padding-top: 30px; border-top: 1px solid $grey-alt; padding-bottom: 80px; + padding-top: 30px; @media (max-width: $break-point-tablet) { padding-top: 22px; From 51bd1ba0701006d7540993a793d47ad87fd9c38e Mon Sep 17 00:00:00 2001 From: Sania Date: Thu, 25 Oct 2018 22:50:35 +0100 Subject: [PATCH 46/63] svg files cleaned up --- public/assets/img/facebook.svg | 3 --- public/assets/img/icn_facebook.svg | 3 --- public/assets/img/icn_reddit.svg | 3 --- public/assets/img/icn_tumblr.svg | 3 --- public/assets/img/icn_twitter.svg | 3 --- public/assets/img/reddit.svg | 3 --- public/assets/img/tumblr.svg | 3 --- public/assets/img/twitter.svg | 3 --- 8 files changed, 24 deletions(-) diff --git a/public/assets/img/facebook.svg b/public/assets/img/facebook.svg index a8a55384..f86df4fc 100644 --- a/public/assets/img/facebook.svg +++ b/public/assets/img/facebook.svg @@ -1,8 +1,5 @@ - - facebook - Created with Sketch. diff --git a/public/assets/img/icn_facebook.svg b/public/assets/img/icn_facebook.svg index 6e94795e..0b38fb12 100644 --- a/public/assets/img/icn_facebook.svg +++ b/public/assets/img/icn_facebook.svg @@ -1,8 +1,5 @@ - - icn_facebook - Created with Sketch. diff --git a/public/assets/img/icn_reddit.svg b/public/assets/img/icn_reddit.svg index 950939fc..8e9cc967 100644 --- a/public/assets/img/icn_reddit.svg +++ b/public/assets/img/icn_reddit.svg @@ -1,8 +1,5 @@ - - icn_reddit - Created with Sketch. diff --git a/public/assets/img/icn_tumblr.svg b/public/assets/img/icn_tumblr.svg index 04fd2ef8..b1bd0dcf 100644 --- a/public/assets/img/icn_tumblr.svg +++ b/public/assets/img/icn_tumblr.svg @@ -1,8 +1,5 @@ - - icn_tumblr - Created with Sketch. diff --git a/public/assets/img/icn_twitter.svg b/public/assets/img/icn_twitter.svg index 1ae7d9c0..bd21672c 100644 --- a/public/assets/img/icn_twitter.svg +++ b/public/assets/img/icn_twitter.svg @@ -1,8 +1,5 @@ - - icn_twitter - Created with Sketch. diff --git a/public/assets/img/reddit.svg b/public/assets/img/reddit.svg index 4291cd7e..77c166e1 100644 --- a/public/assets/img/reddit.svg +++ b/public/assets/img/reddit.svg @@ -1,8 +1,5 @@ - - reddit - Created with Sketch. diff --git a/public/assets/img/tumblr.svg b/public/assets/img/tumblr.svg index 7cbb240e..8c6e20be 100644 --- a/public/assets/img/tumblr.svg +++ b/public/assets/img/tumblr.svg @@ -1,8 +1,5 @@ - - tumblr - Created with Sketch. diff --git a/public/assets/img/twitter.svg b/public/assets/img/twitter.svg index 85f01535..e0f30445 100644 --- a/public/assets/img/twitter.svg +++ b/public/assets/img/twitter.svg @@ -1,8 +1,5 @@ - - twitter - Created with Sketch. From 7b0c7bfee835c2ae83e1fc6afeb084607a33649c Mon Sep 17 00:00:00 2001 From: Minesh Date: Fri, 26 Oct 2018 18:19:55 +0100 Subject: [PATCH 47/63] Potential video centre fix. --- client/scss/asset-display/_asset-display.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 1ebac34b..1267501c 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -47,8 +47,9 @@ } .asset-video { - border: 1px solid #d0d0d0; - margin: 16px; + border: none; + margin: 0px auto; + width: 100%; padding: 6px; } From 68bbf95dcf82a3c44f7eb33cb1b023347b1e2d2f Mon Sep 17 00:00:00 2001 From: Minesh Date: Fri, 26 Oct 2018 18:30:01 +0100 Subject: [PATCH 48/63] Collapse Button offset Fix. --- client/scss/vertical-split/_vertical-split.scss | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 13d7ca93..3d6a15fc 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -23,14 +23,23 @@ border: none; display: block; margin: 15px auto 0; - width: 24px; - height: 24px; + width: 25px; + height: 25px; + text-align: center; + padding: 0px; + padding-left: 10px; + + @media (max-width: $break-point-tablet) { + padding: 0; + } + svg { stroke: $brand-color; &.plus-icon { transform: rotate(0); transition: all 0.4s ease; } + } &:hover { From 92a9ad2febb7688d8e6ad32ffee233ee8dfdfdca Mon Sep 17 00:00:00 2001 From: Minesh Date: Fri, 26 Oct 2018 18:40:48 +0100 Subject: [PATCH 49/63] Icon Alignment fix. --- client/scss/link/_link.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/scss/link/_link.scss b/client/scss/link/_link.scss index 320e848f..064c03f2 100644 --- a/client/scss/link/_link.scss +++ b/client/scss/link/_link.scss @@ -33,6 +33,8 @@ a, a:visited { .link--icon, .link--icon:visited { display: flex; + align-items: center; + .link-text { padding-bottom: 2px; border-bottom: 1px solid transparent; @@ -40,7 +42,7 @@ a, a:visited { } .icon-wrap { margin-left: 5px; - padding-top: 3px; + padding-top: 0px; align-items: center; svg { width: 16px; From 41d7f6e56f58ed6cbe60a98c60c391f120daf9f4 Mon Sep 17 00:00:00 2001 From: Minesh Date: Fri, 26 Oct 2018 18:44:45 +0100 Subject: [PATCH 50/63] Using deconstructors for faster rendering --- .../src/components/VerticalCollapsibleSplit/index.jsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index f58b2a20..1dcaca48 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -17,19 +17,18 @@ class VerticalCollapsibleSplit extends React.Component { let { props, state, - collapse, } = this; return (
-
- {this.props.top} +
+ {props.top}
-
- {this.props.bottom} +
+ {props.bottom}
); From b33c7b93a93b4b6468f4b01b427d2f72f1647e7f Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 7 Nov 2018 17:21:35 -0500 Subject: [PATCH 51/63] properer merge --- client/src/containers/AssetDisplay/view.jsx | 2 +- client/src/containers/AssetInfo/view.jsx | 223 ++++++++++---------- 2 files changed, 115 insertions(+), 110 deletions(-) diff --git a/client/src/containers/AssetDisplay/view.jsx b/client/src/containers/AssetDisplay/view.jsx index be124f08..71137e81 100644 --- a/client/src/containers/AssetDisplay/view.jsx +++ b/client/src/containers/AssetDisplay/view.jsx @@ -71,8 +71,8 @@ class AssetDisplay extends React.Component { } })() } -
+
); } diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index a9f35fd4..b3ff10fc 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -6,6 +6,7 @@ import Row from '@components/Row'; import SpaceBetween from '@components/SpaceBetween'; import AssetShareButtons from '@components/AssetShareButtons'; import ClickToCopy from '@components/ClickToCopy'; +import HorizontalSplit from '@components/HorizontalSplit'; import siteConfig from '@config/siteConfig.json'; const { details: { host } } = siteConfig; @@ -28,125 +29,129 @@ class AssetInfo extends React.Component { channelCanonicalUrl = `${createCanonicalLink({channel})}`; } return ( -
- {channelName && ( - - - } - content={ - - {channelName} - - } - /> - - )} - - {claimViews ? ( - - - } - content={ - - {claimViews} - - } - /> - - ) : null} - - - - } - content={ - - } - /> - - - - - } - content={ - - } - /> - - - - - } - content={ -
- {(contentType === 'video/mp4') ? ( - `} +
+ +

{description}

+ + ) + } + rightSide={ +
+ {channelName && ( + + + } + content={ + + {channelName} + + } /> - ) : ( - `} + + )} + + {claimViews ? ( + + + } + content={ + + {claimViews} + + } /> - )} -
- } - /> - + + ) : null} - - - - Direct Link - - - Download - - - Report - - - + + + } + content={ + + } + /> + - {description && ( - -

{description}

-
- )} + + + } + content={ + + } + /> + + + + } + content={ +
+ {(contentType === 'video/mp4') ? ( + `} + /> + ) : ( + `} + /> + )} +
+ } + /> +
+ + + + + Direct Link + + + Download + + + Report + + + +
+ } />

Hosted via the LBRY blockchain

-
); } From 61b8cd9fcfbaf9b99389653381267134b3c10049 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Thu, 8 Nov 2018 19:44:59 -0500 Subject: [PATCH 52/63] strip it down --- client/scss/all.scss | 3 - client/scss/asset-display/_asset-display.scss | 94 +++------ .../scss/button-primary/_button-primary.scss | 36 +--- .../button-secondary/_button-secondary.scss | 22 +- .../button-tertiary/_button-tertiary.scss | 14 -- client/scss/button/_button.scss | 18 ++ client/scss/click-to-copy/_click-to-copy.scss | 8 +- client/scss/column/_column.scss | 4 - client/scss/dropzone/_dropzone.scss | 10 + .../_horizontal-quad-split.scss | 53 ----- .../horizontal-split/_horizontal-split.scss | 35 ++-- client/scss/input/_input.scss | 1 - client/scss/label/_label.scss | 2 +- client/scss/link/_link.scss | 73 +------ client/scss/media-queries/_media-queries.scss | 19 +- client/scss/nav-bar/_nav-bar.scss | 15 +- client/scss/page-layout/_page-layout.scss | 16 ++ client/scss/progress-bar/_progress-bar.scss | 2 +- .../publish-preview/_publish-preview.scss | 6 + .../publish-url-input/_publish-url-input.scss | 2 +- client/scss/reset/_reset.scss | 4 + client/scss/row/_row.scss | 67 +----- client/scss/select/_select.scss | 4 - client/scss/share-buttons/_share-buttons.scss | 2 +- .../social-share-link/_social-share-link.scss | 1 - client/scss/text/_text.scss | 32 +-- client/scss/textarea/_textarea.scss | 4 - client/scss/variables/_variables.scss | 31 ++- .../scss/vertical-split/_vertical-split.scss | 11 +- .../components/AboutSpeechDetails/index.jsx | 4 +- .../components/AboutSpeechOverview/index.jsx | 18 +- .../src/components/AssetInfoFooter/index.js | 14 ++ .../src/components/AssetShareButtons/index.js | 40 ++-- client/src/components/ButtonPrimary/index.jsx | 2 +- .../components/ButtonPrimaryJumbo/index.jsx | 2 +- .../src/components/ButtonTertiary/index.jsx | 14 -- client/src/components/ChannelAbout/index.jsx | 5 +- client/src/components/Column/index.jsx | 13 -- .../DropzoneDropItDisplay/index.jsx | 2 +- .../DropzoneInstructionsDisplay/index.jsx | 8 +- .../components/FormFeedbackDisplay/index.jsx | 6 +- .../components/HorizontalQuadSplit/index.jsx | 37 ---- .../src/components/HorizontalSplit/index.jsx | 4 +- .../src/components/PublishPreview/index.jsx | 12 +- client/src/components/RowLabeledAlt/index.jsx | 14 -- .../VerticalCollapsibleSplit/index.jsx | 9 +- client/src/containers/AssetInfo/view.jsx | 193 ++++++++---------- .../src/containers/ChannelCreateForm/view.jsx | 2 +- client/src/containers/ChannelTools/view.jsx | 4 +- client/src/containers/PublishDetails/view.jsx | 4 +- .../containers/PublishMetadataInputs/view.jsx | 33 +-- .../containers/PublishThumbnailInput/view.jsx | 2 +- client/src/pages/ShowAssetDetails/view.jsx | 17 +- 53 files changed, 385 insertions(+), 663 deletions(-) delete mode 100644 client/scss/button-tertiary/_button-tertiary.scss delete mode 100644 client/scss/column/_column.scss delete mode 100644 client/scss/horizontal-quad-split/_horizontal-quad-split.scss create mode 100644 client/src/components/AssetInfoFooter/index.js delete mode 100644 client/src/components/ButtonTertiary/index.jsx delete mode 100644 client/src/components/Column/index.jsx delete mode 100644 client/src/components/HorizontalQuadSplit/index.jsx delete mode 100644 client/src/components/RowLabeledAlt/index.jsx diff --git a/client/scss/all.scss b/client/scss/all.scss index 4d12e3b5..c21d276c 100644 --- a/client/scss/all.scss +++ b/client/scss/all.scss @@ -17,11 +17,8 @@ @import '~button/_button'; @import '~button-primary/_button-primary'; @import '~button-secondary/_button-secondary'; -@import '~button-tertiary/_button-tertiary'; @import '~click-to-copy/_click-to-copy'; -@import '~column/_column'; @import '~form-feedback/_form-feedback'; -@import '~horizontal-quad-split/_horizontal-quad-split'; @import '~horizontal-split/_horizontal-split'; @import '~label/_label'; @import '~nav-bar/_nav-bar'; diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 1267501c..29397d33 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -1,57 +1,39 @@ .asset-display { - background: #F6F6F6; display: flex; flex-direction: column; flex: 1 0 auto; justify-content: center; position: relative; width: 100%; - - &:after { - background: transparent; - bottom: 0; - box-shadow: inset 0 1px 2px 2px $shadow-color; - content: ''; - height: 1px; - left: 0; - position: absolute; - top: auto; - width: 100%; - } + $height-delta: 43 / 16 + ($primary-padding * 2); //fix 43!!! nav height + //max-height: calc(100vh - #{$height-delta}); + height: calc(100vh - #{$height-delta}); + overflow: hidden; } .asset-title { color: #2E2F31; - font-size: 26px; + font-size: $text-x-large; font-weight: normal; letter-spacing: 0; - line-height: 32px; - margin-top: 40px; + margin-top: $primary-padding; text-align: center; @media (max-width: $break-point-tablet) { - padding: 0 20px; + padding: 0 $tertiary-padding; } } .asset-image, .asset-video { - margin: 60px auto; max-height: 100%; - max-width: 60vh; + max-width: 100%; + margin-left: auto; + margin-right: auto; object-fit: contain; object-position: center; - - @media (max-width: $break-point-small) { - max-width: calc(100% - 30px); - } } -.asset-video { - border: none; - margin: 0px auto; - width: 100%; - padding: 6px; -} +/*below must die if this is intended to be shareable component! it also probably doesn't need to be*/ .visible-content { margin: 0; @@ -67,15 +49,6 @@ } } - &:before{ - box-shadow: inset 2px 3px 3px 2px $shadow-color; - content: ''; - height: 100px; - position: absolute; - width: 100%; - z-index: 100; - } - &:after { box-shadow: 0px 2px 3px 2px $shadow-color; content: ''; @@ -87,16 +60,17 @@ } } -.asset-information-wrap { - max-width: 800px; +.asset-info { + $asset-info-width: 1000px; + max-width: $asset-info-width; - @media (max-width: $break-point-tablet) { + @media (max-width: $asset-info-width) { margin: 0px auto; max-width: 100%; width: calc(100% - 80px); } - @media (max-width: $break-point-phone) { + @media (max-width: $break-point-tablet) { width: calc(100% - 30px); } @@ -104,10 +78,17 @@ justify-content: center; .column { - padding-top: 40px; + padding-top: $primary-padding; + padding-bottom: $primary-padding; + + .row-labeled + { + margin-bottom: $secondary-padding; + &:last-child { margin-bottom: 0; } + } &:first-child { - border-right: 1px solid $grey-alt; + border-right: 1px solid $grey-border; margin-right: -1px; padding-right: 40px; @@ -120,7 +101,7 @@ } &:last-child { - border-left: 1px solid $grey-alt; + border-left: 1px solid $grey-border; padding-left: 60px; @media (max-width: $break-point-tablet) { @@ -153,7 +134,7 @@ width: 320px; @media (max-width: $break-point-tablet) { - border-bottom: 1px solid $grey-alt; + border-bottom: 1px solid $grey-border; min-width: 100%; padding-bottom: 30px; width: 100%; @@ -163,22 +144,7 @@ } .asset-footer { - border-top: 1px solid $grey-alt; - padding-bottom: 80px; - padding-top: 30px; - - @media (max-width: $break-point-tablet) { - padding-top: 22px; - padding-bottom: 0; - } - - .claim-address { - - .link--brand { - font-size: 14px; - font-weight: 300; - line-height: 18px; - } - } - + border-top: 1px solid $grey-border; + padding: $tertiary-padding $primary-padding; + color: $grey; } \ No newline at end of file diff --git a/client/scss/button-primary/_button-primary.scss b/client/scss/button-primary/_button-primary.scss index ce2ac526..37c0a6e4 100644 --- a/client/scss/button-primary/_button-primary.scss +++ b/client/scss/button-primary/_button-primary.scss @@ -1,34 +1,16 @@ -.button-primary, .button-primary:focus, .button-primary:active { - border: $button-border-width $button-border-strength $primary-color; - margin-top: $thin-padding; - margin-bottom: $thin-padding; - padding: $thin-padding; +.button--primary, .button--primary:focus, .button--primary:active { + border-color: $primary-color; color: $primary-color; background-color: $background-color; - outline: 0; } -.button-primary:focus { - border-color: $secondary-color; - background-color: $tertiary-color; -} - - -.button-primary:hover { - border-color: $interactive-color; +.button--primary:hover { color: $background-color; - background-color: $interactive-color; + background-color: $primary-color; } -.button-primary:active{ - border-color: $background-color; - color: $secondary-color; - background-color: $tertiary-color; -} - -.button-primary--jumbo, .button-primary--jumbo:focus, .button-primary--jumbo:active { - width: $button-full-width; - padding-top: $secondary-padding; - padding-bottom: $secondary-padding; - font-size: x-large; -} +.button--primary:active { + $color: darken($primary-color, 10%); + border-color: $color; + background-color: $color; +} \ No newline at end of file diff --git a/client/scss/button-secondary/_button-secondary.scss b/client/scss/button-secondary/_button-secondary.scss index 29463cc9..c43dfda6 100644 --- a/client/scss/button-secondary/_button-secondary.scss +++ b/client/scss/button-secondary/_button-secondary.scss @@ -1,21 +1,11 @@ -.button--secondary, .button--secondary:focus { - border: 0; - border-bottom: $button-border-width $button-border-strength $primary-color; - padding: 0.5em; - color: $primary-color; +.button--secondary, .button--secondary:focus, .button--secondary:active { + border-bottom-color: $secondary-color; + color: $secondary-color; background-color: $background-color; - outline: 0; -} - -.button--secondary:focus{ - border-color: $secondary-color; - background-color: $tertiary-color; -} - -.button--secondary:hover { - color: $interactive-color; } .button--secondary:active { - color: $background-color; + $color: darken($secondary-color, 10%); + color: $color; + border-bottom-color: $color; } diff --git a/client/scss/button-tertiary/_button-tertiary.scss b/client/scss/button-tertiary/_button-tertiary.scss deleted file mode 100644 index 63bb23c3..00000000 --- a/client/scss/button-tertiary/_button-tertiary.scss +++ /dev/null @@ -1,14 +0,0 @@ -.button--tertiary, .button--tertiary:focus, .button--tertiary:active { - border: 0; - color: $secondary-color; - background-color: $background-color; -} - -.button--tertiary:hover { - color: $primary-color; -} - -.button--tertiary:active, .button--tertiary:focus { - color: $secondary-color; - background-color: $tertiary-color; -} diff --git a/client/scss/button/_button.scss b/client/scss/button/_button.scss index 6bb49061..7c7ba925 100644 --- a/client/scss/button/_button.scss +++ b/client/scss/button/_button.scss @@ -1,3 +1,21 @@ button { cursor: pointer; + &:active + { + outline: 0; + } +} + +.button--primary, .button--secondary +{ + border-width: $button-border-width; + border-style: $button-border-strength; + border-color: transparent; + padding: $thin-padding; +} + + +.button--jumbo, .button--jumbo:focus, .button--jumbo:active { + width: $button-full-width; + font-size: x-large; } diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/click-to-copy/_click-to-copy.scss index f66a571e..e279677a 100644 --- a/client/scss/click-to-copy/_click-to-copy.scss +++ b/client/scss/click-to-copy/_click-to-copy.scss @@ -4,22 +4,20 @@ justify-content: space-between; align-items: center; cursor: pointer; - border: 1px solid $grey-alt; + border: 1px solid $grey-border; border-radius: 6px; .click-to-copy { border: none; padding: 0.36em 0.5em; margin: 0; - color: black; background-color: transparent; width: calc(100% - 1em - 2px); font-size: 14px; - color: #2E2F31; letter-spacing: -0.6px; line-height: 20px; letter-spacing: 0; font-family: monospace; - border-right: 1px solid $grey-alt; + border-right: 1px solid $grey-border; } .icon-wrap { width: 30px; @@ -27,7 +25,7 @@ line-height: 34px; text-align: center; svg { - stroke: $brand-color; + stroke: $primary-color; width: 16px; height: 16px; } diff --git a/client/scss/column/_column.scss b/client/scss/column/_column.scss deleted file mode 100644 index 9aa9b403..00000000 --- a/client/scss/column/_column.scss +++ /dev/null @@ -1,4 +0,0 @@ -.column { - padding-left: $primary-padding; - padding-right: $primary-padding; -} diff --git a/client/scss/dropzone/_dropzone.scss b/client/scss/dropzone/_dropzone.scss index e5fb9cad..09b8b1bc 100644 --- a/client/scss/dropzone/_dropzone.scss +++ b/client/scss/dropzone/_dropzone.scss @@ -16,6 +16,7 @@ flex-direction: column; justify-content: center; align-items: center; + user-select: none; } .dropzone:hover, .dropzone--active { @@ -28,6 +29,11 @@ text-align: center; } +.dropzone-dropit-display +{ + color: $primary-color; +} + .dropzone-preview-wrapper { position: relative; width: 100%; @@ -49,3 +55,7 @@ padding: 1em; width: calc(100% - 2em); } + +.dropzone-instructions-display__chooser-label { + text-decoration: underline; +} diff --git a/client/scss/horizontal-quad-split/_horizontal-quad-split.scss b/client/scss/horizontal-quad-split/_horizontal-quad-split.scss deleted file mode 100644 index a13b7941..00000000 --- a/client/scss/horizontal-quad-split/_horizontal-quad-split.scss +++ /dev/null @@ -1,53 +0,0 @@ -.horizontal-quad-split { - display : flex; - flex-direction : row; - justify-content: space-between; - align-items : flex-start; - .left-side, .right-side { - width : 50%; - display : flex; - flex-direction : row; - justify-content: space-between; - align-items : flex-start; - .column-a, .column-b, .column-c, .column-d { - width: 50%; - }; - .column-a, .column-b, .column-c { - padding-right: $secondary-padding; - }; - }; -}; - - - -@media (max-width: $break-point-large ) { - - .horizontal-quad-split { - flex-direction : column; - .left-side, .right-side { - width : 100%; - .column-a, .column-b, .column-c, .column-d { - width: 50%; - }; - .column-b { - padding-right: 0; - } - } - }; - -} - -@media (max-width: $break-point-medium ) { - - .horizontal-quad-split { - flex-direction : column; - .left-side, .right-side { - flex-direction : column; - .column-a, .column-b, .column-c, .column-d { - width: 100%; - padding: 0; - }; - } - }; - -} diff --git a/client/scss/horizontal-split/_horizontal-split.scss b/client/scss/horizontal-split/_horizontal-split.scss index 52034731..cb1fad35 100644 --- a/client/scss/horizontal-split/_horizontal-split.scss +++ b/client/scss/horizontal-split/_horizontal-split.scss @@ -1,28 +1,39 @@ .horizontal-split { + max-width: $width-content-constrained; + width: 100%; + margin-left: auto; + margin-right: auto; display : flex; flex-direction : row; justify-content: space-between; - - .column { - width: 50%; - } }; +.horizontal-split__column { + width: 50%; + flex: 1 0 auto; + box-sizing: border-box; +} +.horizontal-split__column--left { + padding-right: $primary-padding; +} + +.horizontal-split__column--right { + padding-left: $primary-padding; +} @media (max-width: $break-point-tablet) { - .horizontal-split { + .horizontal-split__column { display : flex; flex-direction : column; justify-content: space-between; - - .column { - width: 100%; - padding-left: 0; - padding-right: 0; - padding-bottom: $secondary-padding; - } }; + .column { + width: 100%; + padding-left: 0; + padding-right: 0; + padding-bottom: $secondary-padding; + } } diff --git a/client/scss/input/_input.scss b/client/scss/input/_input.scss index be4bfb3c..c0249968 100644 --- a/client/scss/input/_input.scss +++ b/client/scss/input/_input.scss @@ -4,7 +4,6 @@ input:-webkit-autofill { input { margin: 0; - outline: none; padding: $input-padding; border: 0; background-color: $background-color; diff --git a/client/scss/label/_label.scss b/client/scss/label/_label.scss index c3d96ae3..2e92784a 100644 --- a/client/scss/label/_label.scss +++ b/client/scss/label/_label.scss @@ -11,7 +11,7 @@ cursor: pointer; } -@media (max-width: $break-point-medium ) { +@media (max-width: $break-point-tablet ) { // note: bolding break point lines up with row-label break point .label, .label-radio { diff --git a/client/scss/link/_link.scss b/client/scss/link/_link.scss index 064c03f2..bda60bc7 100644 --- a/client/scss/link/_link.scss +++ b/client/scss/link/_link.scss @@ -3,76 +3,19 @@ a, a:visited { } .link--primary, .link--primary:visited { - color: $interactive-color; -} - -.link--brand, .link--brand:visited { - color: $brand-color; -} - -.link--secondary, .link--secondary:visited { - margin: 0px; - padding: 0.3em; - color: $secondary-color; + color: $primary-color; + &:hover { text-decoration: underline; } } .link--nav { - color: $primary-color; + color: $text-color; border-bottom: 2px solid white; + &:hover { + color: $primary-color; + } } -.link--nav:hover { - color: $interactive-color; -} .link--nav-active { - color: $interactive-color; - border-bottom: 2px solid $interactive-color; -} - - -.link--icon, .link--icon:visited { - display: flex; - align-items: center; - - .link-text { - padding-bottom: 2px; - border-bottom: 1px solid transparent; - transition: all 0.2s ease; - } - .icon-wrap { - margin-left: 5px; - padding-top: 0px; - align-items: center; - svg { - width: 16px; - height: 16px; - stroke: $grey; - transition: all 0.2s ease; - } - - @media (max-width: $break-point-x-small) { - padding-top: 0; - } - } - &:hover { - .link-text { - border-bottom: 1px solid $brand-color; - } - svg { - stroke: $brand-color; - } - } -} - - -.link--hover { - display: inline-block; - padding-bottom: 2px; - border-bottom: 1px solid transparent; - transition: all 0.2s ease; - &:hover { - border-bottom: 1px solid $brand-color; - } -} - + border-bottom: 2px solid $primary-color; +} \ No newline at end of file diff --git a/client/scss/media-queries/_media-queries.scss b/client/scss/media-queries/_media-queries.scss index 638d4b67..bb9de378 100644 --- a/client/scss/media-queries/_media-queries.scss +++ b/client/scss/media-queries/_media-queries.scss @@ -4,21 +4,4 @@ display: none; } -} - -@media (max-width: $break-point-large ) { - -} - -@media (max-width: $break-point-medium) { - - -} - -@media (max-width: $break-point-small) { - -} - -@media (max-width: $break-point-x-small ) { - -} +} \ No newline at end of file diff --git a/client/scss/nav-bar/_nav-bar.scss b/client/scss/nav-bar/_nav-bar.scss index 41415546..43a85bc1 100644 --- a/client/scss/nav-bar/_nav-bar.scss +++ b/client/scss/nav-bar/_nav-bar.scss @@ -1,13 +1,12 @@ .nav-bar { - padding-left: $primary-padding; - padding-right: $primary-padding; + margin-left: $primary-padding; + margin-right: $primary-padding; - @media (max-width: $break-point-phone) { - padding-left: 15px; - padding-right: 15px; + @media (max-width: $break-point-mobile) { + margin-left: 15px; + margin-right: 15px; } - // border-bottom: 0.5px solid $tertiary-color; .select--arrow { padding: 0 1.5em 0 $input-padding; font-size: 14px; @@ -28,7 +27,7 @@ cursor: pointer; } -@media (max-width: $break-point-medium ) { +@media (max-width: $break-point-tablet ) { .nav-bar-link { padding-top: calc(1em - 2px); padding-right: 1em; @@ -38,7 +37,7 @@ } -@media (max-width: $break-point-small ) { +@media (max-width: $break-point-mobile ) { .nav-bar-link { padding-top: calc(0.5em - 2px); padding-right: 0.5em; diff --git a/client/scss/page-layout/_page-layout.scss b/client/scss/page-layout/_page-layout.scss index 06f6dae7..0c51319a 100644 --- a/client/scss/page-layout/_page-layout.scss +++ b/client/scss/page-layout/_page-layout.scss @@ -7,5 +7,21 @@ display: flex; -webkit-flex-direction: column; flex-direction: column; + margin: $secondary-padding; } } + +@media (max-width: $break-point-tablet) { + .page-layout .content { margin: $thin-padding; } +} + +@media (max-width: $break-point-mobile) { + max-width: calc(100% - 30px); +} + +//below should take some styles from _text.scss and probably elsewhere and become "markdown" or "rich" styles +.page-layout { + p { + margin-bottom: $tertiary-padding; + } +} \ No newline at end of file diff --git a/client/scss/progress-bar/_progress-bar.scss b/client/scss/progress-bar/_progress-bar.scss index c4ef6c52..7a6f7e6d 100644 --- a/client/scss/progress-bar/_progress-bar.scss +++ b/client/scss/progress-bar/_progress-bar.scss @@ -1,5 +1,5 @@ .progress-bar--inactive { - color: $secondary-color; + color: $grey; } .progress-bar--active { diff --git a/client/scss/publish-preview/_publish-preview.scss b/client/scss/publish-preview/_publish-preview.scss index b1938c70..af3aa131 100644 --- a/client/scss/publish-preview/_publish-preview.scss +++ b/client/scss/publish-preview/_publish-preview.scss @@ -1,3 +1,9 @@ +.publish-form__title { + max-width: $width-content-constrained; + margin-left: auto; + margin-right: auto; +} + .publish-preview-dim { opacity: 0.2; } diff --git a/client/scss/publish-url-input/_publish-url-input.scss b/client/scss/publish-url-input/_publish-url-input.scss index 70436e4e..41673a1e 100644 --- a/client/scss/publish-url-input/_publish-url-input.scss +++ b/client/scss/publish-url-input/_publish-url-input.scss @@ -17,5 +17,5 @@ .publish-url-text { margin: 0; padding: 0; - color: $secondary-color; + color: $help-color; } diff --git a/client/scss/reset/_reset.scss b/client/scss/reset/_reset.scss index e69de29b..85cb60d3 100644 --- a/client/scss/reset/_reset.scss +++ b/client/scss/reset/_reset.scss @@ -0,0 +1,4 @@ +button, input, textarea, label, select, option { + font-family: inherit; + font-size: inherit; +} \ No newline at end of file diff --git a/client/scss/row/_row.scss b/client/scss/row/_row.scss index 787d5161..bbf63453 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/row/_row.scss @@ -1,5 +1,5 @@ .row { - padding-bottom: 1.2em; + margin-bottom: 1.2em; } .row-labeled { @@ -10,77 +10,26 @@ } .row-labeled-label { - align-self: flex-start; width: 30%; + display: flex; + align-items: center; + flex: 1; + //bad, fix this + .label { padding-top: 0; padding-bottom: 0; } } .row-labeled-content { align-self: center; width: 70%; } -.row-labeled-alt { - display: column; - flex-direction: row; - flex-wrap: nowrap; - justify-content: flex-start; - - .row-labeled-label { - align-self: flex-start; - width: 100%; - color: $grey; - .label { - font-weight: bold; - text-transform: uppercase; - font-size: 13px; - letter-spacing: 0.4px; - line-height: 18px; - } - } - - .row-labeled-content { - align-self: center; - width: 100%; - } -} - - -@media (max-width: $break-point-medium ) { - +@media (max-width: $break-point-tablet ) { .row-labeled { flex-direction: column; } - .row-labeled-label { width: 100%; } .row-labeled-content { width: 100%; } - -} - - -@media (max-width: $break-point-tablet) and (min-width: $break-point-phone) { - .row { - margin-bottom: 1.4em; - } - - .tablet-inline-row { - display: flex; - justify-content: space-between; - width: 100%; - - >.row { - flex: 1; - margin: 0 15px 1.4em; - - &:first-child { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } - } - } -} +} \ No newline at end of file diff --git a/client/scss/select/_select.scss b/client/scss/select/_select.scss index 7142f40c..6c1154c3 100644 --- a/client/scss/select/_select.scss +++ b/client/scss/select/_select.scss @@ -1,9 +1,5 @@ select { margin: 0; - outline: none; - padding: $input-padding; - border: 0; - background-color: $background-color; display: inline-block; } diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/share-buttons/_share-buttons.scss index 010ef268..ab4234d0 100644 --- a/client/scss/share-buttons/_share-buttons.scss +++ b/client/scss/share-buttons/_share-buttons.scss @@ -45,7 +45,7 @@ } &:hover { - background: $brand-color; + background: $primary-color; } } } diff --git a/client/scss/social-share-link/_social-share-link.scss b/client/scss/social-share-link/_social-share-link.scss index 58973667..c1fa2946 100644 --- a/client/scss/social-share-link/_social-share-link.scss +++ b/client/scss/social-share-link/_social-share-link.scss @@ -7,5 +7,4 @@ .social-share-link > a{ padding-right:0.5em; padding-left:0.5em; - padding-bottom:0.3em; } \ No newline at end of file diff --git a/client/scss/text/_text.scss b/client/scss/text/_text.scss index 0c5b6140..125afe67 100644 --- a/client/scss/text/_text.scss +++ b/client/scss/text/_text.scss @@ -4,6 +4,12 @@ h1, h2, h3, h4, p { margin: 0; } +body { + color: $text-color; + font-family: 'Circular', serif; + font-size: 16px; +} + h1 { font-size: $text-xx-large; } @@ -14,12 +20,6 @@ h2 { h3 { font-size: $text-large; - font-weight: bold; -} - -p, body, button, input, textarea, label, select, option { - font-family: 'Circular', serif; - font-size: 16px; } .text--extra-large { @@ -42,24 +42,12 @@ p, body, button, input, textarea, label, select, option { font-size: $text-x-small; } -.text--underline { - text-decoration: underline; -} - -.text--primary { - color: $primary-color; -} - .text--secondary { - color: $secondary-color; -} - -.text--tertiary { - color: $tertiary-color; + color: $help-color; } .text--interactive { - color: $interactive-color; + color: $primary-color; } .text--failure { @@ -101,7 +89,7 @@ p, body, button, input, textarea, label, select, option { } -@media (max-width: $break-point-medium) { +@media (max-width: $break-point-tablet) { h1 { font-size: $text-large; @@ -134,7 +122,7 @@ p, body, button, input, textarea, label, select, option { } -@media (max-width: $break-point-x-small) { +@media (max-width: $break-point-mobile) { h1 { font-size: $text-medium; diff --git a/client/scss/textarea/_textarea.scss b/client/scss/textarea/_textarea.scss index 4f07b83e..e72bf554 100644 --- a/client/scss/textarea/_textarea.scss +++ b/client/scss/textarea/_textarea.scss @@ -1,10 +1,6 @@ textarea { margin: 0; - outline: none; padding: $input-padding; - border: 0; - border-bottom: 1px solid $secondary-color; - background-color: $background-color; display: inline-block; width: $input-full-width; } diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index 7698081e..fa86f99e 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -1,14 +1,11 @@ $base-color: white; -$primary-color: black; -$secondary-color: #9b9b9b; -$tertiary-color: #ccccc0; -$interactive-color: blue; +$primary-color: #005da0; +$secondary-color: $primary-color; $success-color: green; $failure-color: red; -// $brand-color: #ff725d; -$brand-color: #1944F9; $grey: #9095A5; -$grey-alt: #DDDFE4; +$help-color: $grey; +$grey-border: #DDDFE4; $shadow-color: rgba(169, 173, 186, 0.2); $primary-padding: 3em; @@ -17,8 +14,10 @@ $tertiary-padding: 1em; $thin-padding: 0.3em; $full-width-thin-padding: calc(100% - 0.6em); +$width-content-constrained: 1000px; + $background-color: $base-color; -$font-color: $primary-color; +$text-color: #333; $button-border-width: 1px; $button-border-strength: solid; @@ -28,18 +27,14 @@ $input-padding: 0.3em; $input-full-width: calc(100% - 0.6em); $text-xx-large: 2.5em; -$text-x-large: xx-large; -$text-large: x-large; -$text-medium: large; -$text-small: medium; +$text-x-large: x-large; +$text-large: large; +$text-medium: medium; +$text-small: small; $text-x-small: small; $break-point-xx-large: 1400px; $break-point-x-large: 1290px; $break-point-large: 1000px; -$break-point-tablet: 900px; -$break-point-medium: 800px; -$break-point-phone: 640px; -$break-point-small: 500px; -$break-point-x-small: 400px; - +$break-point-tablet: 800px; +$break-point-mobile: 500px; \ No newline at end of file diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss index 3d6a15fc..2aacc773 100644 --- a/client/scss/vertical-split/_vertical-split.scss +++ b/client/scss/vertical-split/_vertical-split.scss @@ -1,4 +1,4 @@ -.vertical-split { +.vertical-split, .visible-content { flex : 1 0 auto; display : flex; flex-direction : column; @@ -6,7 +6,13 @@ align-items : center; }; +.asset-display-wrap +{ + flex-grow: 1; +} + .collapse-content { + flex-grow: 0; @media (max-width: $break-point-tablet) { max-width: 100%; width: 100%; @@ -18,7 +24,6 @@ } .collapse-button { - outline: none; background: none; border: none; display: block; @@ -34,7 +39,7 @@ } svg { - stroke: $brand-color; + stroke: $primary-color; &.plus-icon { transform: rotate(0); transition: all 0.4s ease; diff --git a/client/src/components/AboutSpeechDetails/index.jsx b/client/src/components/AboutSpeechDetails/index.jsx index 98962e91..8a1e2532 100644 --- a/client/src/components/AboutSpeechDetails/index.jsx +++ b/client/src/components/AboutSpeechDetails/index.jsx @@ -7,9 +7,9 @@ const AboutSpeechDetails = () => {

- Terms of Service + Terms of Service
- Frequently Asked Questions + Frequently Asked Questions

diff --git a/client/src/components/AboutSpeechOverview/index.jsx b/client/src/components/AboutSpeechOverview/index.jsx index 08190424..ef53812f 100644 --- a/client/src/components/AboutSpeechOverview/index.jsx +++ b/client/src/components/AboutSpeechOverview/index.jsx @@ -8,18 +8,12 @@ const AboutSpeechOverview = () => {

Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.

-

- TWITTER -

-

- GITHUB -

-

- DISCORD CHANNEL -

-

- DOCUMENTATION -

+
); diff --git a/client/src/components/AssetInfoFooter/index.js b/client/src/components/AssetInfoFooter/index.js new file mode 100644 index 00000000..a059f670 --- /dev/null +++ b/client/src/components/AssetInfoFooter/index.js @@ -0,0 +1,14 @@ +import React from 'react'; +import Row from '@components/Row'; + +const AssetInfoFooter = ({ assetUrl, name }) => { + return ( +
+

+ Hosted via the LBRY blockchain +

+
+ ); +}; + +export default AssetInfoFooter; diff --git a/client/src/components/AssetShareButtons/index.js b/client/src/components/AssetShareButtons/index.js index 3aeada29..e733b460 100644 --- a/client/src/components/AssetShareButtons/index.js +++ b/client/src/components/AssetShareButtons/index.js @@ -9,45 +9,49 @@ const AssetShareButtons = ({ assetUrl, name }) => { target='_blank' href={`https://twitter.com/intent/tweet?text=${assetUrl}`} > - + - + - + - - - - mastodon - - - diaspora + ); }; +// +// Additional icons disabled. If you want to add additional icons, you have to solve +// https://github.com/lbryio/spee.ch/issues/687 +// +// +// mastodon +// +// +// diaspora +// export default AssetShareButtons; diff --git a/client/src/components/ButtonPrimary/index.jsx b/client/src/components/ButtonPrimary/index.jsx index 6b8230d3..30082cd4 100644 --- a/client/src/components/ButtonPrimary/index.jsx +++ b/client/src/components/ButtonPrimary/index.jsx @@ -4,7 +4,7 @@ const ButtonPrimary = ({ value, onClickHandler, type = 'button' }) => { return ( - ); -}; - -export default ButtonTertiary; diff --git a/client/src/components/ChannelAbout/index.jsx b/client/src/components/ChannelAbout/index.jsx index 2e04f18f..2d2a8f46 100644 --- a/client/src/components/ChannelAbout/index.jsx +++ b/client/src/components/ChannelAbout/index.jsx @@ -2,8 +2,9 @@ import React from 'react'; const ChannelAbout = () => { return ( -
-

Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you're documenting important events, or making a public repository for cat gifs (password: '1234'), try creating a channel for it!

+
+

Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends.

+

You can create 1 channel, or 100, so whether you're documenting important events, or making a public repository for cat gifs (password: '1234'), try creating a channel for it!

); }; diff --git a/client/src/components/Column/index.jsx b/client/src/components/Column/index.jsx deleted file mode 100644 index dcd2e2bc..00000000 --- a/client/src/components/Column/index.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -class Column extends React.Component { - render () { - return ( -
- {this.props.children} -
- ); - } -} - -export default Column; diff --git a/client/src/components/DropzoneDropItDisplay/index.jsx b/client/src/components/DropzoneDropItDisplay/index.jsx index beaf820b..e6798093 100644 --- a/client/src/components/DropzoneDropItDisplay/index.jsx +++ b/client/src/components/DropzoneDropItDisplay/index.jsx @@ -3,7 +3,7 @@ import React from 'react'; const DropzoneDropItDisplay = () => { return (
-

Drop it.

+ Drop it.
); } diff --git a/client/src/components/DropzoneInstructionsDisplay/index.jsx b/client/src/components/DropzoneInstructionsDisplay/index.jsx index 3f13c69f..65320e7e 100644 --- a/client/src/components/DropzoneInstructionsDisplay/index.jsx +++ b/client/src/components/DropzoneInstructionsDisplay/index.jsx @@ -6,15 +6,15 @@ const DropzoneInstructionsDisplay = ({fileError}) => { return (
-

Drag & drop image or video here to publish

+ Drag & drop image or video here to publish
-

OR

+ OR
{ fileError ? (
-

CHOOSE FILE

+ CHOOSE FILE
{ />
) : ( -

CHOOSE FILE

+ CHOOSE FILE )}
); diff --git a/client/src/components/FormFeedbackDisplay/index.jsx b/client/src/components/FormFeedbackDisplay/index.jsx index 7dd62d7e..c324c7f0 100644 --- a/client/src/components/FormFeedbackDisplay/index.jsx +++ b/client/src/components/FormFeedbackDisplay/index.jsx @@ -4,13 +4,13 @@ const FormFeedbackDisplay = ({ errorMessage, defaultMessage }) => { return (
{ errorMessage ? ( -

{errorMessage}

+ {errorMessage} ) : (
{ defaultMessage ? ( -

{defaultMessage}

+ {defaultMessage} ) : ( -

 

+   )}
)} diff --git a/client/src/components/HorizontalQuadSplit/index.jsx b/client/src/components/HorizontalQuadSplit/index.jsx deleted file mode 100644 index 1bbbc319..00000000 --- a/client/src/components/HorizontalQuadSplit/index.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import Row from '@components/Row'; - -class HorizontalTriSplit extends React.Component { - render () { - return ( -
-
-
- - {this.props.columnA} - -
-
- - {this.props.columnB} - -
-
-
-
- - {this.props.columnC} - -
-
- - {this.props.columnD} - -
-
-
- ); - } -} - -export default HorizontalTriSplit; diff --git a/client/src/components/HorizontalSplit/index.jsx b/client/src/components/HorizontalSplit/index.jsx index c5151fa3..7b82a2c1 100644 --- a/client/src/components/HorizontalSplit/index.jsx +++ b/client/src/components/HorizontalSplit/index.jsx @@ -4,10 +4,10 @@ class HorizontalSplit extends React.Component { render () { return (
-
+
{this.props.leftSide}
-
+
{this.props.rightSide}
diff --git a/client/src/components/PublishPreview/index.jsx b/client/src/components/PublishPreview/index.jsx index 9f7240cf..512eb310 100644 --- a/client/src/components/PublishPreview/index.jsx +++ b/client/src/components/PublishPreview/index.jsx @@ -5,13 +5,17 @@ import PublishDetails from '@containers/PublishDetails'; import PublishTitleInput from '@containers/PublishTitleInput'; import Row from '@components/Row'; +// this class seems more like PublishForm and should probably be renamed + class PublishPreview extends React.Component { render () { return ( -
- - - +
+
+ + + +
} rightSide={} diff --git a/client/src/components/RowLabeledAlt/index.jsx b/client/src/components/RowLabeledAlt/index.jsx deleted file mode 100644 index d5e2c7d0..00000000 --- a/client/src/components/RowLabeledAlt/index.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -class RowLabeledAlt extends React.Component { - render () { - return ( -
-
{this.props.label}
-
{this.props.content}
-
- ); - } -} - -export default RowLabeledAlt; diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx index 1dcaca48..d670b6e8 100644 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ b/client/src/components/VerticalCollapsibleSplit/index.jsx @@ -5,11 +5,18 @@ class VerticalCollapsibleSplit extends React.Component { constructor (props) { super(props); this.collapse = this.collapse.bind(this); - this.state = { closed: false }; + this.storageKey = 'vert-split-state-' + this.props.name; + // const closed = window && window.localStorage + // ? !!window.localStorage.getItem(this.storageKey) : false; + const closed = false; + this.state = { closed: closed }; } collapse () { this.setState({ closed: !this.state.closed }); + // if (window && window.localStorage) { + // window.localStorage.setItem(this.storageKey, !this.state.closed); + // } document.querySelectorAll(`[data-name='${this.props.name}']`).forEach(el => el.classList.toggle('closed')); } diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index b3ff10fc..581c61fb 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -11,6 +11,7 @@ import HorizontalSplit from '@components/HorizontalSplit'; import siteConfig from '@config/siteConfig.json'; const { details: { host } } = siteConfig; import createCanonicalLink from '../../../../utils/createCanonicalLink'; +import AssetInfoFooter from '../../components/AssetInfoFooter/index'; class AssetInfo extends React.Component { render () { @@ -29,129 +30,111 @@ class AssetInfo extends React.Component { channelCanonicalUrl = `${createCanonicalLink({channel})}`; } return ( -
+
-

{description}

- +

{description}

) } rightSide={
{channelName && ( - - - } - content={ - - {channelName} - - } - /> - + + } + content={ + + {channelName} + + } + /> )} {claimViews ? ( - - - } - content={ - - {claimViews} - - } - /> - + + } + content={ + + {claimViews} + + } + /> ) : null} - - - } - content={ - - } - /> - + + } + content={ + + } + /> - - - } - content={ - - } - /> - + + } + content={ + + } + /> - - - } - content={ -
- {(contentType === 'video/mp4') ? ( - `} - /> - ) : ( - `} - /> - )} -
- } - /> -
+ + } + content={ +
+ {(contentType === 'video/mp4') ? ( + `} + /> + ) : ( + `} + /> + )} +
+ } + /> - - - - Direct Link - - - Download - - - Report - - - + + + Direct Link + + + Download + + + Report + +
} /> - -

- Hosted via the LBRY blockchain -

-
+
); } diff --git a/client/src/containers/ChannelCreateForm/view.jsx b/client/src/containers/ChannelCreateForm/view.jsx index bda30e12..2d175ce2 100644 --- a/client/src/containers/ChannelCreateForm/view.jsx +++ b/client/src/containers/ChannelCreateForm/view.jsx @@ -81,7 +81,7 @@ class ChannelCreateForm extends React.Component { ) : (
-

{status}

+ {status}
)} diff --git a/client/src/containers/ChannelTools/view.jsx b/client/src/containers/ChannelTools/view.jsx index 0be7bef0..455b6d26 100644 --- a/client/src/containers/ChannelTools/view.jsx +++ b/client/src/containers/ChannelTools/view.jsx @@ -8,11 +8,11 @@ class ChannelTools extends React.Component { return (
-

Log in to an existing channel:

+

Log in to existing channel

{!this.props.closedRegistration && ( -

Create a brand new channel:

+

Create new channel

)}
diff --git a/client/src/containers/PublishDetails/view.jsx b/client/src/containers/PublishDetails/view.jsx index ac55e226..7590e66f 100644 --- a/client/src/containers/PublishDetails/view.jsx +++ b/client/src/containers/PublishDetails/view.jsx @@ -6,7 +6,7 @@ import PublishMetadataInputs from '@containers/PublishMetadataInputs'; import ChannelSelect from '@containers/ChannelSelect'; import Row from '@components/Row'; import ButtonPrimaryJumbo from '@components/ButtonPrimaryJumbo'; -import ButtonTertiary from '@components/ButtonTertiary'; +import ButtonSecondary from '@components/ButtonSecondary'; import SpaceAround from '@components/SpaceAround'; import PublishFinePrint from '@components/PublishFinePrint'; @@ -48,7 +48,7 @@ class PublishDetails extends React.Component { - diff --git a/client/src/containers/PublishMetadataInputs/view.jsx b/client/src/containers/PublishMetadataInputs/view.jsx index 10d8a793..ec5d2a59 100644 --- a/client/src/containers/PublishMetadataInputs/view.jsx +++ b/client/src/containers/PublishMetadataInputs/view.jsx @@ -3,6 +3,7 @@ import PublishDescriptionInput from '@components/PublishDescriptionInput'; import PublishLicenseInput from '@components/PublishLicenseInput'; import PublishNsfwInput from '@components/PublishNsfwInput'; import ButtonSecondary from '@components/ButtonSecondary'; +import Row from '@components/Row'; class PublishMetadataInputs extends React.Component { constructor (props) { @@ -29,19 +30,25 @@ class PublishMetadataInputs extends React.Component { return (
{this.props.showMetadataInputs && ( -
- - - -
+ + + + + + + + + + + )}
) : ( -

loading...

+ loading... ) } } + /> + + */ + class ShowAssetDetails extends React.Component { render () { const { asset } = this.props; @@ -16,11 +26,8 @@ class ShowAssetDetails extends React.Component { pageTitle={`${name} - details`} asset={asset} > - } - bottom={} - /> + + ); } From 33cf063fbb7015d521a0ffd6fce68d29c1983544 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Fri, 9 Nov 2018 13:02:28 -0500 Subject: [PATCH 53/63] fix unterminated div --- client/src/containers/AssetDisplay/view.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/containers/AssetDisplay/view.jsx b/client/src/containers/AssetDisplay/view.jsx index eef963df..6e5079f3 100644 --- a/client/src/containers/AssetDisplay/view.jsx +++ b/client/src/containers/AssetDisplay/view.jsx @@ -89,6 +89,7 @@ class AssetDisplay extends React.Component { thumbnail={thumbnail} /> } +
From 44b5c27ef59184ec2c9f706cef4eae52242d0106 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Fri, 9 Nov 2018 13:55:53 -0500 Subject: [PATCH 54/63] css destroying --- client/scss/all.scss | 1 - client/scss/asset-display/_asset-display.scss | 69 +++++++++++--- client/scss/body/_body.scss | 2 +- client/scss/nav-bar/_nav-bar.scss | 3 +- client/scss/page-layout/_page-layout.scss | 2 +- client/scss/text/_text.scss | 94 ------------------- client/scss/variables/_variables.scss | 10 +- .../scss/vertical-split/_vertical-split.scss | 55 ----------- .../VerticalCollapsibleSplit/index.jsx | 45 --------- client/src/containers/AssetDisplay/view.jsx | 66 ++++++------- client/src/containers/AssetTitle/view.jsx | 4 +- client/src/pages/ShowAssetDetails/view.jsx | 39 +++++--- 12 files changed, 123 insertions(+), 267 deletions(-) delete mode 100644 client/scss/vertical-split/_vertical-split.scss delete mode 100644 client/src/components/VerticalCollapsibleSplit/index.jsx diff --git a/client/scss/all.scss b/client/scss/all.scss index c21d276c..6629e7d1 100644 --- a/client/scss/all.scss +++ b/client/scss/all.scss @@ -31,7 +31,6 @@ @import '~space-between/_space-between'; @import '~space-around/_space-around'; @import '~row/_row'; -@import '~vertical-split/_vertical-split'; @import '~tooltip/_tooltip'; @import '~social-share-link/_social-share-link'; diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/asset-display/_asset-display.scss index 29397d33..40800f02 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/asset-display/_asset-display.scss @@ -5,23 +5,12 @@ justify-content: center; position: relative; width: 100%; - $height-delta: 43 / 16 + ($primary-padding * 2); //fix 43!!! nav height - //max-height: calc(100vh - #{$height-delta}); - height: calc(100vh - #{$height-delta}); overflow: hidden; + align-items: center; } .asset-title { - color: #2E2F31; - font-size: $text-x-large; - font-weight: normal; - letter-spacing: 0; - margin-top: $primary-padding; - text-align: center; - - @media (max-width: $break-point-tablet) { - padding: 0 $tertiary-padding; - } + padding-top: $secondary-padding; } .asset-image, .asset-video { @@ -31,6 +20,7 @@ margin-right: auto; object-fit: contain; object-position: center; + background: black; } /*below must die if this is intended to be shareable component! it also probably doesn't need to be*/ @@ -60,6 +50,59 @@ } } +/* +.vertical-split, .visible-content { + flex : 1 0 auto; + display : flex; + flex-direction : column; + justify-content: space-between; + align-items : center; +}; + +.collapse-content { + flex-grow: 0; + @media (max-width: $break-point-tablet) { + max-width: 100%; + width: 100%; + } +} + +.collapse-content.closed{ + display: none; +} + +.collapse-button { + background: none; + border: none; + display: block; + margin: 15px auto 0; + width: 25px; + height: 25px; + text-align: center; + padding: 0px; + padding-left: 10px; + + @media (max-width: $break-point-tablet) { + padding: 0; + } + + svg { + stroke: $primary-color; + &.plus-icon { + transform: rotate(0); + transition: all 0.4s ease; + } + + } + + &:hover { + .plus-icon { + transform: rotate(-180deg); + } + } +} + */ + .asset-info { $asset-info-width: 1000px; max-width: $asset-info-width; diff --git a/client/scss/body/_body.scss b/client/scss/body/_body.scss index 6072cbd4..0c1b55b5 100644 --- a/client/scss/body/_body.scss +++ b/client/scss/body/_body.scss @@ -1,7 +1,7 @@ body { margin: 0; padding: 0; - height: 100%; + min-height: 100%; word-wrap: break-word; display: -webkit-flex; display: flex; diff --git a/client/scss/nav-bar/_nav-bar.scss b/client/scss/nav-bar/_nav-bar.scss index 43a85bc1..f817e781 100644 --- a/client/scss/nav-bar/_nav-bar.scss +++ b/client/scss/nav-bar/_nav-bar.scss @@ -1,4 +1,5 @@ .nav-bar { + margin-top: $thin-padding; margin-left: $primary-padding; margin-right: $primary-padding; @@ -18,7 +19,7 @@ .nav-bar-link { padding: calc(1em - 2px); display: inline-block; - font-size: 14px; + font-size: $text-medium; letter-spacing: 0.4px; text-transform: uppercase; } diff --git a/client/scss/page-layout/_page-layout.scss b/client/scss/page-layout/_page-layout.scss index 0c51319a..e3092a65 100644 --- a/client/scss/page-layout/_page-layout.scss +++ b/client/scss/page-layout/_page-layout.scss @@ -12,7 +12,7 @@ } @media (max-width: $break-point-tablet) { - .page-layout .content { margin: $thin-padding; } + .page-layout .content { margin: $tertiary-padding; } } @media (max-width: $break-point-mobile) { diff --git a/client/scss/text/_text.scss b/client/scss/text/_text.scss index 125afe67..357099f2 100644 --- a/client/scss/text/_text.scss +++ b/client/scss/text/_text.scss @@ -57,97 +57,3 @@ h3 { .text--success { color: $success-color; } - -@media (max-width: $break-point-x-large ) { - h1 { - font-size: $text-x-large; - } - - h2 { - font-size: $text-large; - } - - h3 { - font-size: $text-medium; - } - - p, body, button, input, textarea, label, select, option { - font-size: $text-medium; - } - - .text--extra-large { - font-size: $text-x-large; - } - - .text--large { - font-size: $text-medium; - } - - .text--medium { - font-size: $text-small; - } - -} - -@media (max-width: $break-point-tablet) { - - h1 { - font-size: $text-large; - } - - h2 { - font-size: $text-medium; - } - - h3 { - font-size: $text-small; - } - - p, body, button, input, textarea, label, select, option { - font-size: 15px; - } - - .text--extra-large { - font-size: $text-large; - } - - .text--large { - font-size: $text-medium; - } - - .text--small { - font-size: $text-x-small; - } - - -} - -@media (max-width: $break-point-mobile) { - - h1 { - font-size: $text-medium; - font-weight: bold; - } - - h2 { - font-size: $text-small; - } - - p, body, button, input, textarea, label, select, option { - font-size: 15px; - } - - .text--extra-large { - font-size: $text-x-small; - font-weight: bold; - } - - .text--large { - font-size: $text-x-small; - } - - .text--medium { - font-size: $text-x-small; - } - -} diff --git a/client/scss/variables/_variables.scss b/client/scss/variables/_variables.scss index fa86f99e..a9835c98 100644 --- a/client/scss/variables/_variables.scss +++ b/client/scss/variables/_variables.scss @@ -27,11 +27,11 @@ $input-padding: 0.3em; $input-full-width: calc(100% - 0.6em); $text-xx-large: 2.5em; -$text-x-large: x-large; -$text-large: large; -$text-medium: medium; -$text-small: small; -$text-x-small: small; +$text-x-large: 2.0em; +$text-large: 1.5em; +$text-medium: 1.0em; +$text-small: 0.9em; +$text-x-small: 0.8em; $break-point-xx-large: 1400px; $break-point-x-large: 1290px; diff --git a/client/scss/vertical-split/_vertical-split.scss b/client/scss/vertical-split/_vertical-split.scss deleted file mode 100644 index 2aacc773..00000000 --- a/client/scss/vertical-split/_vertical-split.scss +++ /dev/null @@ -1,55 +0,0 @@ -.vertical-split, .visible-content { - flex : 1 0 auto; - display : flex; - flex-direction : column; - justify-content: space-between; - align-items : center; -}; - -.asset-display-wrap -{ - flex-grow: 1; -} - -.collapse-content { - flex-grow: 0; - @media (max-width: $break-point-tablet) { - max-width: 100%; - width: 100%; - } -} - -.collapse-content.closed{ - display: none; -} - -.collapse-button { - background: none; - border: none; - display: block; - margin: 15px auto 0; - width: 25px; - height: 25px; - text-align: center; - padding: 0px; - padding-left: 10px; - - @media (max-width: $break-point-tablet) { - padding: 0; - } - - svg { - stroke: $primary-color; - &.plus-icon { - transform: rotate(0); - transition: all 0.4s ease; - } - - } - - &:hover { - .plus-icon { - transform: rotate(-180deg); - } - } -} \ No newline at end of file diff --git a/client/src/components/VerticalCollapsibleSplit/index.jsx b/client/src/components/VerticalCollapsibleSplit/index.jsx deleted file mode 100644 index d670b6e8..00000000 --- a/client/src/components/VerticalCollapsibleSplit/index.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import * as Icon from 'react-feather'; -class VerticalCollapsibleSplit extends React.Component { - - constructor (props) { - super(props); - this.collapse = this.collapse.bind(this); - this.storageKey = 'vert-split-state-' + this.props.name; - // const closed = window && window.localStorage - // ? !!window.localStorage.getItem(this.storageKey) : false; - const closed = false; - this.state = { closed: closed }; - } - - collapse () { - this.setState({ closed: !this.state.closed }); - // if (window && window.localStorage) { - // window.localStorage.setItem(this.storageKey, !this.state.closed); - // } - document.querySelectorAll(`[data-name='${this.props.name}']`).forEach(el => el.classList.toggle('closed')); - } - - render () { - let { - props, - state, - } = this; - - return ( -
-
- {props.top} - -
-
- {props.bottom} -
-
- ); - } -}; - -export default VerticalCollapsibleSplit; diff --git a/client/src/containers/AssetDisplay/view.jsx b/client/src/containers/AssetDisplay/view.jsx index 6e5079f3..98a78366 100644 --- a/client/src/containers/AssetDisplay/view.jsx +++ b/client/src/containers/AssetDisplay/view.jsx @@ -1,6 +1,5 @@ import React from 'react'; import Row from '@components/Row'; -import AssetTitle from '@containers/AssetTitle'; import ProgressBar from '@components/ProgressBar'; import { LOCAL_CHECK, UNAVAILABLE, ERROR, AVAILABLE } from '../../constants/asset_display_states'; import createCanonicalLink from '../../../../utils/createCanonicalLink'; @@ -56,42 +55,37 @@ class AssetDisplay extends React.Component { } const sourceUrl = `${createCanonicalLink({ asset: asset.claimData })}.${fileExt}?${outpoint}`; return ( -
-
-
- {(status === LOCAL_CHECK) && -
-

Checking to see if Spee.ch has your asset locally...

-
- } - {(status === UNAVAILABLE) && -
-

Sit tight, we're searching the LBRY blockchain for your asset!

- -

Curious what magic is happening here? Learn more.

-
- } - {(status === ERROR) && -
- -

Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the following error message in the LBRY discord.

-
- -

{error}

-
-
- } - {(status === AVAILABLE) && - - } -
+
+ {(status === LOCAL_CHECK) && +
+

Checking to see if Spee.ch has your asset locally...

- + } + {(status === UNAVAILABLE) && +
+

Sit tight, we're searching the LBRY blockchain for your asset!

+ +

Curious what magic is happening here? Learn more.

+
+ } + {(status === ERROR) && +
+ +

Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the following error message in the LBRY discord.

+
+ +

{error}

+
+
+ } + {(status === AVAILABLE) && + + }
); } diff --git a/client/src/containers/AssetTitle/view.jsx b/client/src/containers/AssetTitle/view.jsx index 7821920a..eaf3d6d4 100644 --- a/client/src/containers/AssetTitle/view.jsx +++ b/client/src/containers/AssetTitle/view.jsx @@ -2,9 +2,7 @@ import React from 'react'; const AssetTitle = ({ title }) => { return ( -
-

{title}

-
+

{title}

); }; diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index 323a45b3..87cce975 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -1,20 +1,31 @@ import React from 'react'; import PageLayout from '@components/PageLayout'; -import VerticalCollapsibleSplit from '@components/VerticalCollapsibleSplit'; +import * as Icon from 'react-feather'; import AssetDisplay from '@containers/AssetDisplay'; +import AssetInfo from '@containers/AssetInfo'; import ErrorPage from '@pages/ErrorPage'; - -/* - - } - /> - - */ +import AssetTitle from '@containers/AssetTitle'; class ShowAssetDetails extends React.Component { + + constructor (props) { + super(props); + this.collapse = this.collapse.bind(this); + // this.storageKey = 'vert-split-state-' + this.props.name; + // const closed = window && window.localStorage + // ? !!window.localStorage.getItem(this.storageKey) : false; + const closed = false; + this.state = { closed: closed }; + } + + collapse () { + this.setState({ closed: !this.state.closed }); + // if (window && window.localStorage) { + // window.localStorage.setItem(this.storageKey, !this.state.closed); + // } + // document.querySelectorAll(`[data-name='${this.props.name}']`).forEach(el => el.classList.toggle('closed')); + } + render () { const { asset } = this.props; if (asset) { @@ -25,7 +36,11 @@ class ShowAssetDetails extends React.Component { asset={asset} > - + + + { !this.state.closed && } ); } From 3bbe2582e5349f1bcc9849893d348008e208d30c Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Sat, 10 Nov 2018 14:59:53 -0500 Subject: [PATCH 55/63] moar cleanup --- .../{asset-display => }/_asset-display.scss | 105 +++++------------- .../{asset-preview => }/_asset-preview.scss | 0 client/scss/{body => }/_body.scss | 0 .../{button-primary => }/_button-primary.scss | 0 .../_button-secondary.scss | 0 client/scss/{button => }/_button.scss | 0 .../_channel-claims-display.scss | 0 .../{click-to-copy => }/_click-to-copy.scss | 0 client/scss/{dropzone => }/_dropzone.scss | 0 .../{form-feedback => }/_form-feedback.scss | 0 client/scss/_form.scss | 7 ++ .../_horizontal-split.scss | 23 ++++ client/scss/{html => }/_html.scss | 0 client/scss/{input => }/_input.scss | 8 +- client/scss/{label => }/_label.scss | 0 client/scss/{link => }/_link.scss | 0 .../{media-queries => }/_media-queries.scss | 0 client/scss/{nav-bar => }/_nav-bar.scss | 13 +-- .../{page-content => }/_page-content.scss | 0 .../_page-layout-show-lite.scss | 0 .../scss/{page-layout => }/_page-layout.scss | 0 .../{progress-bar => }/_progress-bar.scss | 5 + .../_publish-disabled-message.scss | 0 .../_publish-preview.scss | 4 + .../{publish-status => }/_publish-status.scss | 0 .../_publish-url-input.scss | 0 client/scss/{react-app => }/_react-app.scss | 0 client/scss/{reset => }/_reset.scss | 0 client/scss/{row => }/_row.scss | 5 +- client/scss/_select.scss | 4 + .../{share-buttons => }/_share-buttons.scss | 0 .../_social-share-link.scss | 0 .../{space-around => }/_space-around.scss | 0 .../{space-between => }/_space-between.scss | 0 client/scss/{text => }/_text.scss | 0 client/scss/{textarea => }/_textarea.scss | 0 client/scss/{tooltip => }/_tooltip.scss | 0 client/scss/{variables => }/_variables.scss | 0 client/scss/{video => }/_video.scss | 0 client/scss/all.scss | 81 +++++++------- client/scss/select/_select.scss | 13 --- .../ChannelSelectDropdown/index.jsx | 1 - .../components/FormFeedbackDisplay/index.jsx | 4 +- .../src/components/HorizontalSplit/index.jsx | 19 +++- .../NavBarChannelOptionsDropdown/index.jsx | 1 - client/src/components/ProgressBar/index.jsx | 2 +- .../components/PublishLicenseInput/index.jsx | 1 - .../src/components/PublishPreview/index.jsx | 1 + .../src/containers/ChannelCreateForm/view.jsx | 7 +- .../src/containers/ChannelLoginForm/view.jsx | 7 +- client/src/containers/ChannelSelect/view.jsx | 8 +- client/src/containers/ChannelTools/view.jsx | 16 +-- client/src/containers/Dropzone/view.jsx | 4 +- client/src/containers/PublishDetails/view.jsx | 8 +- .../containers/PublishMetadataInputs/view.jsx | 28 ++--- client/src/pages/AboutPage/index.jsx | 1 + client/src/pages/LoginPage/view.jsx | 1 + client/src/pages/ShowAssetDetails/view.jsx | 17 +-- deployment-config.json | 10 ++ 59 files changed, 190 insertions(+), 214 deletions(-) rename client/scss/{asset-display => }/_asset-display.scss (53%) rename client/scss/{asset-preview => }/_asset-preview.scss (100%) rename client/scss/{body => }/_body.scss (100%) rename client/scss/{button-primary => }/_button-primary.scss (100%) rename client/scss/{button-secondary => }/_button-secondary.scss (100%) rename client/scss/{button => }/_button.scss (100%) rename client/scss/{channel-claims-display => }/_channel-claims-display.scss (100%) rename client/scss/{click-to-copy => }/_click-to-copy.scss (100%) rename client/scss/{dropzone => }/_dropzone.scss (100%) rename client/scss/{form-feedback => }/_form-feedback.scss (100%) create mode 100644 client/scss/_form.scss rename client/scss/{horizontal-split => }/_horizontal-split.scss (60%) rename client/scss/{html => }/_html.scss (100%) rename client/scss/{input => }/_input.scss (92%) rename client/scss/{label => }/_label.scss (100%) rename client/scss/{link => }/_link.scss (100%) rename client/scss/{media-queries => }/_media-queries.scss (100%) rename client/scss/{nav-bar => }/_nav-bar.scss (84%) rename client/scss/{page-content => }/_page-content.scss (100%) rename client/scss/{page-layout-show-lite => }/_page-layout-show-lite.scss (100%) rename client/scss/{page-layout => }/_page-layout.scss (100%) rename client/scss/{progress-bar => }/_progress-bar.scss (50%) rename client/scss/{publish-disabled-message => }/_publish-disabled-message.scss (100%) rename client/scss/{publish-preview => }/_publish-preview.scss (68%) rename client/scss/{publish-status => }/_publish-status.scss (100%) rename client/scss/{publish-url-input => }/_publish-url-input.scss (100%) rename client/scss/{react-app => }/_react-app.scss (100%) rename client/scss/{reset => }/_reset.scss (100%) rename client/scss/{row => }/_row.scss (87%) create mode 100644 client/scss/_select.scss rename client/scss/{share-buttons => }/_share-buttons.scss (100%) rename client/scss/{social-share-link => }/_social-share-link.scss (100%) rename client/scss/{space-around => }/_space-around.scss (100%) rename client/scss/{space-between => }/_space-between.scss (100%) rename client/scss/{text => }/_text.scss (100%) rename client/scss/{textarea => }/_textarea.scss (100%) rename client/scss/{tooltip => }/_tooltip.scss (100%) rename client/scss/{variables => }/_variables.scss (100%) rename client/scss/{video => }/_video.scss (100%) delete mode 100644 client/scss/select/_select.scss create mode 100644 deployment-config.json diff --git a/client/scss/asset-display/_asset-display.scss b/client/scss/_asset-display.scss similarity index 53% rename from client/scss/asset-display/_asset-display.scss rename to client/scss/_asset-display.scss index 40800f02..2350f29f 100644 --- a/client/scss/asset-display/_asset-display.scss +++ b/client/scss/_asset-display.scss @@ -1,16 +1,30 @@ +.asset-main { + height: 80vh; + display: flex; + flex-direction: column; + align-items: space-between; + align-items: center; +} + .asset-display { display: flex; flex-direction: column; - flex: 1 0 auto; + flex: 1 1 auto; justify-content: center; position: relative; width: 100%; overflow: hidden; align-items: center; + min-height: 50vh; } .asset-title { - padding-top: $secondary-padding; + padding-bottom: $thin-padding; + text-align: center; + + @media (min-width: $break-point-mobile) { + padding-top: $secondary-padding; + } } .asset-image, .asset-video { @@ -50,7 +64,7 @@ } } -/* + .vertical-split, .visible-content { flex : 1 0 auto; display : flex; @@ -80,7 +94,6 @@ height: 25px; text-align: center; padding: 0px; - padding-left: 10px; @media (max-width: $break-point-tablet) { padding: 0; @@ -101,93 +114,25 @@ } } } - */ .asset-info { $asset-info-width: 1000px; max-width: $asset-info-width; - - @media (max-width: $asset-info-width) { - margin: 0px auto; - max-width: 100%; - width: calc(100% - 80px); - } + margin: $primary-padding; + max-width: 100%; @media (max-width: $break-point-tablet) { - width: calc(100% - 30px); + margin: $primary-padding $secondary-padding; } - .horizontal-split { - justify-content: center; - - .column { - padding-top: $primary-padding; - padding-bottom: $primary-padding; - - .row-labeled - { - margin-bottom: $secondary-padding; - &:last-child { margin-bottom: 0; } - } - - &:first-child { - border-right: 1px solid $grey-border; - margin-right: -1px; - padding-right: 40px; - - @media (max-width: $break-point-tablet) { - border: none; - margin: 0; - order: 2; - padding: 0; - } - } - - &:last-child { - border-left: 1px solid $grey-border; - padding-left: 60px; - - @media (max-width: $break-point-tablet) { - border: none; - margin: 0; - padding: 40px 0 0 0; - } - } - } + @media (max-width: $break-point-mobile) { + margin: $primary-padding 0; } - - p.asset-description { - color: #2E2F31; - font-size: 14px; - letter-spacing: 0; - line-height: 18px; - padding-bottom: 80px; - white-space: pre-line; - width: 360px; - - @media (max-width: $break-point-tablet) { - margin: 22px 0 60px; - max-width: 600px; - padding: 0; - width: 100%; - } - } - - .asset-information { - width: 320px; - - @media (max-width: $break-point-tablet) { - border-bottom: 1px solid $grey-border; - min-width: 100%; - padding-bottom: 30px; - width: 100%; - } - } - } .asset-footer { border-top: 1px solid $grey-border; - padding: $tertiary-padding $primary-padding; + padding-top: $primary-padding; + margin-top: $primary-padding; color: $grey; -} \ No newline at end of file +} diff --git a/client/scss/asset-preview/_asset-preview.scss b/client/scss/_asset-preview.scss similarity index 100% rename from client/scss/asset-preview/_asset-preview.scss rename to client/scss/_asset-preview.scss diff --git a/client/scss/body/_body.scss b/client/scss/_body.scss similarity index 100% rename from client/scss/body/_body.scss rename to client/scss/_body.scss diff --git a/client/scss/button-primary/_button-primary.scss b/client/scss/_button-primary.scss similarity index 100% rename from client/scss/button-primary/_button-primary.scss rename to client/scss/_button-primary.scss diff --git a/client/scss/button-secondary/_button-secondary.scss b/client/scss/_button-secondary.scss similarity index 100% rename from client/scss/button-secondary/_button-secondary.scss rename to client/scss/_button-secondary.scss diff --git a/client/scss/button/_button.scss b/client/scss/_button.scss similarity index 100% rename from client/scss/button/_button.scss rename to client/scss/_button.scss diff --git a/client/scss/channel-claims-display/_channel-claims-display.scss b/client/scss/_channel-claims-display.scss similarity index 100% rename from client/scss/channel-claims-display/_channel-claims-display.scss rename to client/scss/_channel-claims-display.scss diff --git a/client/scss/click-to-copy/_click-to-copy.scss b/client/scss/_click-to-copy.scss similarity index 100% rename from client/scss/click-to-copy/_click-to-copy.scss rename to client/scss/_click-to-copy.scss diff --git a/client/scss/dropzone/_dropzone.scss b/client/scss/_dropzone.scss similarity index 100% rename from client/scss/dropzone/_dropzone.scss rename to client/scss/_dropzone.scss diff --git a/client/scss/form-feedback/_form-feedback.scss b/client/scss/_form-feedback.scss similarity index 100% rename from client/scss/form-feedback/_form-feedback.scss rename to client/scss/_form-feedback.scss diff --git a/client/scss/_form.scss b/client/scss/_form.scss new file mode 100644 index 00000000..16603923 --- /dev/null +++ b/client/scss/_form.scss @@ -0,0 +1,7 @@ +.form-group { + padding-bottom: $secondary-padding; +} + +.form-title { + padding-bottom: $secondary-padding; +} diff --git a/client/scss/horizontal-split/_horizontal-split.scss b/client/scss/_horizontal-split.scss similarity index 60% rename from client/scss/horizontal-split/_horizontal-split.scss rename to client/scss/_horizontal-split.scss index cb1fad35..0cf4fc87 100644 --- a/client/scss/horizontal-split/_horizontal-split.scss +++ b/client/scss/_horizontal-split.scss @@ -6,6 +6,21 @@ display : flex; flex-direction : row; justify-content: space-between; + + &.horizontal-split--mobile-collapse { + @media (max-width: $break-point-mobile) { + flex-direction: column; + + .horizontal-split__column { + width: 100%; + } + + .horizontal-split__column--right { + padding-left: 0; + padding-top: $secondary-padding; + } + } + } }; .horizontal-split__column { @@ -16,10 +31,18 @@ .horizontal-split__column--left { padding-right: $primary-padding; + + @media (max-width: $break-point-mobile) { + padding-right: $thin-padding; + } } .horizontal-split__column--right { padding-left: $primary-padding; + + @media (max-width: $break-point-mobile) { + padding-left: $thin-padding; + } } @media (max-width: $break-point-tablet) { diff --git a/client/scss/html/_html.scss b/client/scss/_html.scss similarity index 100% rename from client/scss/html/_html.scss rename to client/scss/_html.scss diff --git a/client/scss/input/_input.scss b/client/scss/_input.scss similarity index 92% rename from client/scss/input/_input.scss rename to client/scss/_input.scss index c0249968..8cfedf4b 100644 --- a/client/scss/input/_input.scss +++ b/client/scss/_input.scss @@ -10,10 +10,6 @@ input { display: inline-block; } -.input-text { - -} - .input-slider { width: 100% } @@ -42,6 +38,10 @@ input { border-bottom: 1px solid $secondary-color; } +.form-group { + padding-bottom: $secondary-padding; +} + // modifiers .input--full-width { diff --git a/client/scss/label/_label.scss b/client/scss/_label.scss similarity index 100% rename from client/scss/label/_label.scss rename to client/scss/_label.scss diff --git a/client/scss/link/_link.scss b/client/scss/_link.scss similarity index 100% rename from client/scss/link/_link.scss rename to client/scss/_link.scss diff --git a/client/scss/media-queries/_media-queries.scss b/client/scss/_media-queries.scss similarity index 100% rename from client/scss/media-queries/_media-queries.scss rename to client/scss/_media-queries.scss diff --git a/client/scss/nav-bar/_nav-bar.scss b/client/scss/_nav-bar.scss similarity index 84% rename from client/scss/nav-bar/_nav-bar.scss rename to client/scss/_nav-bar.scss index f817e781..038ebf57 100644 --- a/client/scss/nav-bar/_nav-bar.scss +++ b/client/scss/_nav-bar.scss @@ -2,18 +2,11 @@ margin-top: $thin-padding; margin-left: $primary-padding; margin-right: $primary-padding; - + @media (max-width: $break-point-mobile) { margin-left: 15px; margin-right: 15px; } - - .select--arrow { - padding: 0 1.5em 0 $input-padding; - font-size: 14px; - letter-spacing: 0.4px; - text-transform: uppercase; - } } .nav-bar-link { @@ -35,7 +28,7 @@ padding-bottom: calc(1em - 2px); padding-left: 1em; } - + } @media (max-width: $break-point-mobile ) { @@ -46,5 +39,3 @@ padding-left: 0.5em; } } - - diff --git a/client/scss/page-content/_page-content.scss b/client/scss/_page-content.scss similarity index 100% rename from client/scss/page-content/_page-content.scss rename to client/scss/_page-content.scss diff --git a/client/scss/page-layout-show-lite/_page-layout-show-lite.scss b/client/scss/_page-layout-show-lite.scss similarity index 100% rename from client/scss/page-layout-show-lite/_page-layout-show-lite.scss rename to client/scss/_page-layout-show-lite.scss diff --git a/client/scss/page-layout/_page-layout.scss b/client/scss/_page-layout.scss similarity index 100% rename from client/scss/page-layout/_page-layout.scss rename to client/scss/_page-layout.scss diff --git a/client/scss/progress-bar/_progress-bar.scss b/client/scss/_progress-bar.scss similarity index 50% rename from client/scss/progress-bar/_progress-bar.scss rename to client/scss/_progress-bar.scss index 7a6f7e6d..6a8979a6 100644 --- a/client/scss/progress-bar/_progress-bar.scss +++ b/client/scss/_progress-bar.scss @@ -1,3 +1,8 @@ +.progress-bar__wrapper { + display: flex; + align-items: center; + justify-content: center; +} .progress-bar--inactive { color: $grey; } diff --git a/client/scss/publish-disabled-message/_publish-disabled-message.scss b/client/scss/_publish-disabled-message.scss similarity index 100% rename from client/scss/publish-disabled-message/_publish-disabled-message.scss rename to client/scss/_publish-disabled-message.scss diff --git a/client/scss/publish-preview/_publish-preview.scss b/client/scss/_publish-preview.scss similarity index 68% rename from client/scss/publish-preview/_publish-preview.scss rename to client/scss/_publish-preview.scss index af3aa131..e275e9b2 100644 --- a/client/scss/publish-preview/_publish-preview.scss +++ b/client/scss/_publish-preview.scss @@ -2,6 +2,10 @@ max-width: $width-content-constrained; margin-left: auto; margin-right: auto; + + @media (max-width: $break-point-mobile) { + font-size: .8em; + } } .publish-preview-dim { diff --git a/client/scss/publish-status/_publish-status.scss b/client/scss/_publish-status.scss similarity index 100% rename from client/scss/publish-status/_publish-status.scss rename to client/scss/_publish-status.scss diff --git a/client/scss/publish-url-input/_publish-url-input.scss b/client/scss/_publish-url-input.scss similarity index 100% rename from client/scss/publish-url-input/_publish-url-input.scss rename to client/scss/_publish-url-input.scss diff --git a/client/scss/react-app/_react-app.scss b/client/scss/_react-app.scss similarity index 100% rename from client/scss/react-app/_react-app.scss rename to client/scss/_react-app.scss diff --git a/client/scss/reset/_reset.scss b/client/scss/_reset.scss similarity index 100% rename from client/scss/reset/_reset.scss rename to client/scss/_reset.scss diff --git a/client/scss/row/_row.scss b/client/scss/_row.scss similarity index 87% rename from client/scss/row/_row.scss rename to client/scss/_row.scss index bbf63453..4fbdf10c 100644 --- a/client/scss/row/_row.scss +++ b/client/scss/_row.scss @@ -7,6 +7,7 @@ flex-direction: row; flex-wrap: nowrap; justify-content: flex-start; + padding-bottom: $tertiary-padding; } .row-labeled-label { @@ -14,8 +15,6 @@ display: flex; align-items: center; flex: 1; - //bad, fix this - .label { padding-top: 0; padding-bottom: 0; } } .row-labeled-content { align-self: center; @@ -32,4 +31,4 @@ .row-labeled-content { width: 100%; } -} \ No newline at end of file +} diff --git a/client/scss/_select.scss b/client/scss/_select.scss new file mode 100644 index 00000000..e9642528 --- /dev/null +++ b/client/scss/_select.scss @@ -0,0 +1,4 @@ +select { + margin: 0; + display: inline-block; +} diff --git a/client/scss/share-buttons/_share-buttons.scss b/client/scss/_share-buttons.scss similarity index 100% rename from client/scss/share-buttons/_share-buttons.scss rename to client/scss/_share-buttons.scss diff --git a/client/scss/social-share-link/_social-share-link.scss b/client/scss/_social-share-link.scss similarity index 100% rename from client/scss/social-share-link/_social-share-link.scss rename to client/scss/_social-share-link.scss diff --git a/client/scss/space-around/_space-around.scss b/client/scss/_space-around.scss similarity index 100% rename from client/scss/space-around/_space-around.scss rename to client/scss/_space-around.scss diff --git a/client/scss/space-between/_space-between.scss b/client/scss/_space-between.scss similarity index 100% rename from client/scss/space-between/_space-between.scss rename to client/scss/_space-between.scss diff --git a/client/scss/text/_text.scss b/client/scss/_text.scss similarity index 100% rename from client/scss/text/_text.scss rename to client/scss/_text.scss diff --git a/client/scss/textarea/_textarea.scss b/client/scss/_textarea.scss similarity index 100% rename from client/scss/textarea/_textarea.scss rename to client/scss/_textarea.scss diff --git a/client/scss/tooltip/_tooltip.scss b/client/scss/_tooltip.scss similarity index 100% rename from client/scss/tooltip/_tooltip.scss rename to client/scss/_tooltip.scss diff --git a/client/scss/variables/_variables.scss b/client/scss/_variables.scss similarity index 100% rename from client/scss/variables/_variables.scss rename to client/scss/_variables.scss diff --git a/client/scss/video/_video.scss b/client/scss/_video.scss similarity index 100% rename from client/scss/video/_video.scss rename to client/scss/_video.scss diff --git a/client/scss/all.scss b/client/scss/all.scss index 6629e7d1..c61e42bd 100644 --- a/client/scss/all.scss +++ b/client/scss/all.scss @@ -1,45 +1,44 @@ -@import '~variables/_variables'; -@import '~reset/_reset'; -@import '~font/_font'; -@import '~html/_html'; -@import '~body/_body'; -@import '~react-app/_react-app'; -@import '~text/_text'; +@import '_variables'; +@import '_reset'; +@import 'font/_font.scss'; +@import '_html'; +@import '_body'; +@import '_react-app'; +@import '_text'; -@import '~link/_link'; -@import '~input/_input'; -@import '~select/_select'; -@import '~textarea/_textarea'; -@import '~video/_video'; +@import '_link'; +@import '_input'; +@import '_select'; +@import '_textarea'; +@import '_video'; +@import '_form'; -@import '~asset-display/_asset-display'; -@import '~asset-preview/_asset-preview'; -@import '~button/_button'; -@import '~button-primary/_button-primary'; -@import '~button-secondary/_button-secondary'; -@import '~click-to-copy/_click-to-copy'; -@import '~form-feedback/_form-feedback'; -@import '~horizontal-split/_horizontal-split'; -@import '~label/_label'; -@import '~nav-bar/_nav-bar'; -@import '~page-layout/_page-layout'; -@import '~page-layout-show-lite/_page-layout-show-lite'; -@import '~page-content/_page-content'; -@import '~progress-bar/_progress-bar'; -@import '~publish-preview/_publish-preview'; -@import '~share-buttons/_share-buttons'; -@import '~space-between/_space-between'; -@import '~space-around/_space-around'; -@import '~row/_row'; -@import '~tooltip/_tooltip'; -@import '~social-share-link/_social-share-link'; - -@import '~channel-claims-display/_channel-claims-display'; -@import '~dropzone/_dropzone'; -@import '~publish-url-input/_publish-url-input'; -@import '~publish-status/_publish-status'; -@import '~publish-disabled-message/_publish-disabled-message'; - -@import '~media-queries/_media-queries'; +@import '_asset-display'; +@import '_asset-preview'; +@import '_button'; +@import '_button-primary'; +@import '_button-secondary'; +@import '_click-to-copy'; +@import '_form-feedback'; +@import '_horizontal-split'; +@import '_label'; +@import '_nav-bar'; +@import '_page-layout'; +@import '_page-layout-show-lite'; +@import '_page-content'; +@import '_progress-bar'; +@import '_publish-preview'; +@import '_share-buttons'; +@import '_space-between'; +@import '_space-around'; +@import '_row'; +@import '_tooltip'; +@import '_social-share-link'; +@import '_channel-claims-display'; +@import '_dropzone'; +@import '_publish-url-input'; +@import '_publish-status'; +@import '_publish-disabled-message'; +@import '_media-queries'; diff --git a/client/scss/select/_select.scss b/client/scss/select/_select.scss deleted file mode 100644 index 6c1154c3..00000000 --- a/client/scss/select/_select.scss +++ /dev/null @@ -1,13 +0,0 @@ -select { - margin: 0; - display: inline-block; -} - -.select--arrow { - -moz-appearance:none; - -webkit-appearance: none; - background: url('./icon/chevron-down.svg') no-repeat right; - cursor: pointer; - padding-right: 1.5em; - padding-left: $input-padding -} diff --git a/client/src/components/ChannelSelectDropdown/index.jsx b/client/src/components/ChannelSelectDropdown/index.jsx index fee212c7..2079c05c 100644 --- a/client/src/components/ChannelSelectDropdown/index.jsx +++ b/client/src/components/ChannelSelectDropdown/index.jsx @@ -5,7 +5,6 @@ const ChannelSelectDropdown = ({ selectedChannel, handleSelection, loggedInChann return ( diff --git a/client/src/components/ProgressBar/index.jsx b/client/src/components/ProgressBar/index.jsx index fdaf9422..cb41cc38 100644 --- a/client/src/components/ProgressBar/index.jsx +++ b/client/src/components/ProgressBar/index.jsx @@ -62,7 +62,7 @@ class ProgressBar extends React.Component { }; render () { return ( -
+
{this.state.bars.map((bar, index) => bar.isActive ? : )}
); diff --git a/client/src/components/PublishLicenseInput/index.jsx b/client/src/components/PublishLicenseInput/index.jsx index 6ef59418..af827ec8 100644 --- a/client/src/components/PublishLicenseInput/index.jsx +++ b/client/src/components/PublishLicenseInput/index.jsx @@ -13,7 +13,6 @@ const PublishLicenseInput = ({ handleSelect }) => { type='text' name='license' id='publish-license' - className='select select--primary' onChange={handleSelect} > diff --git a/client/src/components/PublishPreview/index.jsx b/client/src/components/PublishPreview/index.jsx index 12c8bda1..ec962bda 100644 --- a/client/src/components/PublishPreview/index.jsx +++ b/client/src/components/PublishPreview/index.jsx @@ -19,6 +19,7 @@ class PublishPreview extends React.Component {
} rightSide={} /> diff --git a/client/src/containers/ChannelCreateForm/view.jsx b/client/src/containers/ChannelCreateForm/view.jsx index 2d175ce2..49ef639d 100644 --- a/client/src/containers/ChannelCreateForm/view.jsx +++ b/client/src/containers/ChannelCreateForm/view.jsx @@ -59,7 +59,7 @@ class ChannelCreateForm extends React.Component { return (
{ !status ? ( -
+ - + + - + + } content={{loggedInChannelName}} /> -
+ ); } return ( -
+ }
)} -
+ ); } } diff --git a/client/src/containers/ChannelTools/view.jsx b/client/src/containers/ChannelTools/view.jsx index 455b6d26..c3511b4b 100644 --- a/client/src/containers/ChannelTools/view.jsx +++ b/client/src/containers/ChannelTools/view.jsx @@ -7,14 +7,14 @@ class ChannelTools extends React.Component { render () { return (
- -

Log in to existing channel

- -
- {!this.props.closedRegistration && ( -

Create new channel

- -
)} +

Log in to existing channel

+ + {!this.props.closedRegistration && ( + +

Create new channel

+ +
+ )}
); } diff --git a/client/src/containers/Dropzone/view.jsx b/client/src/containers/Dropzone/view.jsx index 436bac99..b524b014 100644 --- a/client/src/containers/Dropzone/view.jsx +++ b/client/src/containers/Dropzone/view.jsx @@ -84,7 +84,7 @@ class Dropzone extends React.Component { const { dragOver, mouseOver, dimPreview } = this.state; const { file, thumbnail, fileError, isUpdate, sourceUrl, fileExt } = this.props; return ( -
+ {isUpdate && fileExt === 'mp4' ? (

Video updates are currently disabled. This feature will be available soon. You can edit metadata.

) : ( @@ -145,7 +145,7 @@ class Dropzone extends React.Component {
)} -
+ ); } }; diff --git a/client/src/containers/PublishDetails/view.jsx b/client/src/containers/PublishDetails/view.jsx index bc9dc45e..2c88c6df 100644 --- a/client/src/containers/PublishDetails/view.jsx +++ b/client/src/containers/PublishDetails/view.jsx @@ -45,7 +45,7 @@ class PublishDetails extends React.Component { return (
{isUpdate ? (asset && ( - + @@ -56,16 +56,14 @@ class PublishDetails extends React.Component { } /> - + )) : ( - - - + )} diff --git a/client/src/containers/PublishMetadataInputs/view.jsx b/client/src/containers/PublishMetadataInputs/view.jsx index df8d86a5..2234e2ad 100644 --- a/client/src/containers/PublishMetadataInputs/view.jsx +++ b/client/src/containers/PublishMetadataInputs/view.jsx @@ -32,23 +32,17 @@ class PublishMetadataInputs extends React.Component {
{(showMetadataInputs || isUpdate) && ( - - - - - - - - - + + + )} {!isUpdate && ( diff --git a/client/src/pages/AboutPage/index.jsx b/client/src/pages/AboutPage/index.jsx index 621f27b7..1b197ad5 100644 --- a/client/src/pages/AboutPage/index.jsx +++ b/client/src/pages/AboutPage/index.jsx @@ -13,6 +13,7 @@ class AboutPage extends React.Component { pageUri={'about'} > } rightSide={} /> diff --git a/client/src/pages/LoginPage/view.jsx b/client/src/pages/LoginPage/view.jsx index a3804e59..fb2968a5 100644 --- a/client/src/pages/LoginPage/view.jsx +++ b/client/src/pages/LoginPage/view.jsx @@ -20,6 +20,7 @@ class LoginPage extends React.Component { pageUri={'login'} > } rightSide={} /> diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index 87cce975..7798531d 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -14,7 +14,7 @@ class ShowAssetDetails extends React.Component { // this.storageKey = 'vert-split-state-' + this.props.name; // const closed = window && window.localStorage // ? !!window.localStorage.getItem(this.storageKey) : false; - const closed = false; + const closed = true; this.state = { closed: closed }; } @@ -35,12 +35,15 @@ class ShowAssetDetails extends React.Component { pageTitle={`${name} - details`} asset={asset} > - - - - { !this.state.closed && } +
+ + + + +
+ {!this.state.closed && } ); } diff --git a/deployment-config.json b/deployment-config.json new file mode 100644 index 00000000..c4bc966f --- /dev/null +++ b/deployment-config.json @@ -0,0 +1,10 @@ +{ + "type": "sftp", + "host": "sean.lbry.tech", + "username": "lbry", + "password": "", + "port": 22, + "remotePath": "/home/lbry/spee.ch", + "sshKeyFile": "/Users/sean/.ssh/id_rsa2", + "uploadOnSave": true +} From 440c12a7aa78a3667cdfb668b51895fa041bcb3b Mon Sep 17 00:00:00 2001 From: Jessop Breth Date: Sun, 11 Nov 2018 18:26:00 -0500 Subject: [PATCH 56/63] changes to docs and setup --- README.md | 109 ++++++-- customize.md | 2 +- ...dyfile.speechsample => Caddyfile.template} | 0 docs/setup/conf/speech/speech.service.draft | 9 + docs/ubuntuinstall.md | 246 ++++++++++++++++++ 5 files changed, 348 insertions(+), 18 deletions(-) rename docs/setup/conf/caddy/{Caddyfile.speechsample => Caddyfile.template} (100%) create mode 100644 docs/setup/conf/speech/speech.service.draft create mode 100644 docs/ubuntuinstall.md diff --git a/README.md b/README.md index bc157b1a..8f9d2b86 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,97 @@ # Spee.ch -Spee.ch is a web app that reads and publishes images and videos to and from the [LBRY](https://lbry.io/) blockchain. You are encouraged to contribute to the shared code base, or fork it and make it your own. +Spee.ch is a web app that reads and publishes images and videos to and from the [LBRY](https://lbry.io/) blockchain. We encourage you to contribute to the shared code base, or fork it and make it your own. You can create your own custom version of spee.ch by installing this code base and then creating your own custom components and styles to override the defaults. (More details/guide on how to do that coming soon.) -## Quickstart +## Technology Overview +Spee.ch is a react web app that depends on MySQL for local content, and on two other lbry technologies: + * [chainquery](https://github.com/lbryio/chainquery) - a normalized database of the blockchain data. We've provided credentials to use a public chainquery service. You can also install it on your own server to avoid being affected by the commons. + * [lbrynet](https://github.com/lbryio/lbry) - a daemon that handles your wallet and transactions. -### Ubuntu -[Ubuntu VPS Setup](./docs/ubuntu16vpspersonal.md) +## Installation -_Note: This is our new setup. For our old setup see the [fullstart guide](./fullstart.md)._ +### Ubuntu Step by Step +[Ubuntu Install Guide](./docs/ubuntuinstall.md) -#### System Dependencies: - * [node](https://nodejs.org) +### Quickstart Overview + +#### Get some information ready: + * mysqlusername + * mysqlpassword + * domainname or 'http://localhost' + * speechport = 3000 + +#### Install and Set Up System Dependencies: + * [NodeJS](https://nodejs.org) * [MySQL](https://dev.mysql.com/doc/refman/8.0/en/installing.html) - * [`lbry`](https://github.com/lbryio/lbry) daemon - * note: retrieve an address from the daemon and send your wallet a few credits (or join us in the [#speech discord channel](https://discord.gg/YjYbwhS) and we will send you a few) + * localhost port 3306 + * mysqlusername or root + * mysqlpassword + * You may need + ``` + mysql> `ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';` + ``` + * [lbrynet](https://github.com/lbryio/lbry) daemon + * run this as a service exposing ports 3333 and 4444 + * _note_: once the daemon is running, issue commands in another terminal session (tmux) to retrieve an address for your wallet to recieve 5+ LBC credits (or join us in the [#speech discord channel](https://discord.gg/YjYbwhS) and we will send you a few) + * `./lbrynet commands` gets a list of commands + * `./lbrynet account_balance` gets your balance (initially 0.0) + * `./lbrynet address_list` gets addresses you can use to recieve LBC * [FFmpeg](https://www.ffmpeg.org/download.html) + * [Spee.ch] (below) + * [pm2] (optional) process manager such as pm2 to run speech server.js + * [http proxy server] caddy, nginx, traefik, etc to forward 443 to speech port 3000 + + +#### Clone this repo + * release version for stable production +``` +$ git clone -b release https://github.com/lbryio/spee.ch.git +``` + * master version for development +``` +$ git clone https://github.com/lbryio/spee.ch.git +``` + * your own fork for customization + +#### Change directory into your project +``` +$ cd spee.ch +``` + +#### Install node dependencies +``` +$ npm install +``` + +#### Create the config files using the built-in CLI +_note: make sure lbrynet is running in the background before proceeding_ + +``` +$ npm run configure +``` + + * _note: At the moment, you will have to copy chainqueryConfig.json from:_ + ``` + ~/spee.ch/docs/setup/conf/speech/chainqueryConfig.json + ``` + + _to:_ + ``` + ~/spee.ch/site/config/chainqueryConfig.json + ``` + + * _note: The domain name in this part must be prefixed with http:// or https://_ + +#### Build & start the app + +_note: make sure lbrynet is running in the background before proceeding_ +``` +$ npm run start +``` + +#### View in browser + * Visit [http://localhost:3000](http://localhost:3000) in your browser #### Customize your app @@ -23,12 +99,11 @@ Check out the [customization guide](https://github.com/lbryio/spee.ch/blob/readm #### (optional) add custom components and update the styles - * Create custom components by creating React components in `src/views/` (further instructions coming soon) - * Update the CSS by changing the files in `public/assets/css/` (further instructions and refactor coming soon) + * Create custom components by creating React components in `site/custom/src/` (further instructions coming soon) + * Update the CSS by changing the files in `site/custom/scss` (further instructions and refactor coming soon) -#### (optional) Syncing the full blockchain - * Start the `spee.ch-sync` tool available at [billbitt/spee.ch-sync](https://github.com/billbitt/spee.ch-sync) - * This is not necessary, but highly recommended. It will decode the blocks of the `LBRY` blockchain and add the claims information to your database's tables +#### (optional) install your own chainquery +Instructions are coming at [lbry-docker] to install your own chainquery instance using docker-compose. This will require 50GB of preferably SSD space and at least 10 minutes to download, possibly much longer. ## API #### /api/claim/publish @@ -112,7 +187,7 @@ Spee.ch also runs a sync tool, which decodes blocks from the `LBRY` blockchain a ### Architecture -* `cli/` contains the code for the CLI tool. Running the tool will create `.json` config files and place them in the `config/` folder +* `cli/` contains the code for the CLI tool. Running the tool will create `.json` config files and place them in the `site/config/` folder * `configure.js` is the entry point for the CLI tool * `cli/defaults/` holds default config files * `cli/questions/` holds the questions that the CLI tool asks to build the config files @@ -128,9 +203,9 @@ Spee.ch also runs a sync tool, which decodes blocks from the `LBRY` blockchain a * `client/scss/` contains the CSS for the project * -* `config/custom` is a folder which can be used to override the default components in `client/` +* `site/custom` is a folder which can be used to override the default components in `client/` * The folder structure mimics that of the `client/` folder - * to customize spee.ch, place your own components and scss in the `config/custom/src/` and `config/custom/scss` folders. + * to customize spee.ch, place your own components and scss in the `site/custom/src/` and `site/custom/scss` folders. * `server/` contains all of the server code * `index.js` is the entry point for the server. It creates the [express app](https://expressjs.com/), requires the routes, syncs the database, and starts the server listening on the `PORT` designated in the config files. diff --git a/customize.md b/customize.md index 98273136..faba1bf1 100644 --- a/customize.md +++ b/customize.md @@ -1,6 +1,6 @@ # Configure your own spee.ch -_note: this guide assumes you have done the []quickstart](https://github.com/lbryio/spee.ch/blob/readme-update/README.md) or [fullstart](https://github.com/lbryio/spee.ch/blob/readme-update/fullstart.md) guide and have a working spee.ch server_ +_note: this guide assumes you have done the [quickstart](https://github.com/lbryio/spee.ch/blob/readme-update/README.md) or [fullstart](https://github.com/lbryio/spee.ch/blob/readme-update/fullstart.md) guide and have a working spee.ch server_ ## Custom Components The components used by spee.ch are taken from the `client/` folder, but you can override those components by defining your own in the `site/custom/` folder. diff --git a/docs/setup/conf/caddy/Caddyfile.speechsample b/docs/setup/conf/caddy/Caddyfile.template similarity index 100% rename from docs/setup/conf/caddy/Caddyfile.speechsample rename to docs/setup/conf/caddy/Caddyfile.template diff --git a/docs/setup/conf/speech/speech.service.draft b/docs/setup/conf/speech/speech.service.draft new file mode 100644 index 00000000..1abdc50c --- /dev/null +++ b/docs/setup/conf/speech/speech.service.draft @@ -0,0 +1,9 @@ +[Service] +ExecStart=/usr/bin/node /opt/app/app.js +Restart=always +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=node-app-1 +User=your_app_user_name +Group=your_app_user_name +Environment=NODE_ENV=production PORT=3000 diff --git a/docs/ubuntuinstall.md b/docs/ubuntuinstall.md new file mode 100644 index 00000000..a072d43d --- /dev/null +++ b/docs/ubuntuinstall.md @@ -0,0 +1,246 @@ +# Create Your Own Spee.ch on Ubuntu 16.x 18.x VPS + +# Overview + +## Prerequisites + * Ability to use SSH (putty + public key for windows users) + * Ubuntu 16.04 or 18.04 VPS with root access + * Your login info ready + * Domain name with @ and www pointed at your VPS IP + * alternatively, specify http://localhost + * Ability to send 5+ LBRY credits to an address + * Noncommercial use + * _(configuration examples for nginx and certbot are included as an alternative)_ + +## You'll be installing: + * MySQL DB + * Default Port 3306 + * NodeJS v8+ + * Https proxy server + * Caddy for personal use + * Exposed ports: 22, 80, 443, 3333, 4444 + * Reverse proxies 443 to App on 3000 + * Spee.ch started on port 3000 + * Lbrynet DAEMON started on ports 3333 and 4444 + + +# 1. Update OS and install packages +## OS + +### Secure your server by creating a non-root sudoer. + +As root# _create user and add to sudo group_ +``` + adduser username + usermod -aG sudo username + su - username +``` +As username: _paste public key in authorized_keys_ +``` + `cd` + `mkdir .ssh` + `nano ~/.ssh/authorized_keys` +``` + +### Prep + +Log in as username@domainname or username@ip_address + + `sudo apt-get update -y` + + `ulimit -n 8192` + + `wget -qO- https://deb.nodesource.com/setup_8.x | sudo -E bash -` + + +## Git, Curl, Tmux, Unzip, ffmpeg, Node + + `sudo apt-get install git curl tmux unzip ffmpeg nodejs -y` + +## Clone speech either from your own fork, or from the lbryio/spee.ch repo. + +### For Developers or those with their own forked repo + + + `git clone -b master https://github.com/lbryio/spee.ch` + + SSH: + + `git clone git@github.com:{{youraccount}}/spee.ch` + + HTTPS: + + `git clone https://github.com/{{youraccount}}/spee.ch.git` + +### For Publishers and Content creators + + + `git clone -b release https://github.com/lbryio/spee.ch` + +### Prepare the scripts + + `chmod 750 -R ~/spee.ch/docs/setup` + +# 2 Secure the UFW firewall +## UFW + + `sudo ~/spee.ch/docs/setup/scripts/firewall.sh` + +# 3 Install Caddy to handle https and reverse proxy +## Get Caddy + + `curl https://getcaddy.com | sudo bash -s personal` + +## Set up Caddy reverse proxy and ssl + + `sudo mkdir -p /opt/caddy/logs/` + + `sudo mkdir -p /opt/caddy/store/` + + `cp ~/spee.ch/docs/setup/conf/caddy/Caddyfile.template ~/spee.ch/docs/setup/conf/caddy/Caddyfile` + + `nano ~/spee.ch/docs/setup/conf/caddy/Caddyfile` + ( Change {{EXAMPLE.COM}} to YOURDOMAIN.COM ) + + `sudo cp ~/spee.ch/docs/setup/conf/caddy/Caddyfile /opt/caddy/` + +## Set up Caddy to run as systemd service + + `sudo cp ~/spee.ch/docs/setup/conf/caddy/caddy.service /etc/systemd/system/caddy.service` + + `sudo chmod 644 /etc/systemd/system/caddy.service` + + `sudo chown -R www-data:www-data /opt/caddy/` + + `sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy` + + `sudo systemctl daemon-reload` + + `sudo systemctl start caddy` + + `sudo systemctl status caddy` + + `q` exits + + At this point, navigating to yourdomain.com should give you a 502 bad gateway error. That's good! + +# 4 Set up MySQL + +## Install MySQL + + `sudo apt-get install mysql-server -y` + ( enter blank password each time if prompted) + + `sudo systemctl status mysql` (q to exit) + +## Secure Setup + + `sudo mysql_secure_installation` + * Password abcd1234 + * No to password validation + * Y to all other options + + +## Login to mysql from root to complete setup: + + `sudo mysql` to enter mysql> console + + mysql> + + `ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'abcd1234';` + + mysql> + + `FLUSH PRIVILEGES;` + + `Control+D` to exit + + Verify: + + `mysql -u root -p` and then entering your password abcd1234 should give you the mysql> shell + +# 5 Get Lbrynet Daemon + +## Start tmux + +This just allows you to run multiple things in different sessions. Useful for manually starting daemons and watching its console logs. + + `tmux` + * `Ctrl+b`, then `d` detaches leaving session running. + * `tmux`, reenters tmux, then + * `Ctrl+b`, `(` goes back to through sessions + +## Get the daemon + `wget -O ~/latest_daemon.zip https://lbry.io/get/lbrynet.linux.zip` + + `unzip -o -u ~/latest_daemon.zip` + +## Start the daemon + `./lbrynet start` + +## Detatch tmux session + * `Control + b`, then `d` to leave lbrynet daemon running and exit the session + + `tmux` if you want to get back into tmux + + `Control+b`, then `)` while in tmux session to cycle back to your lbrynet session to see output + +## Display wallet address to which to send 5+ LBC. + + _note: These commands work when `./lbrynet start` is already running in another tmux session_ + + `./lbrynet commands` to check out the current commands + + `./lbrynet address_list` to get your wallet address + + `Ctrl + Shift + C` after highlighting an address to copy. + + Use a LBRY app or daemon to send LBC to the address. Sending LBC may take a few seconds or longer. + + `./lbrynet account_balance` to check your balance after you've sent LBC. + +## Optional/Production: Set up lbrynet to run as a systemd service + + `//coming soon` + +# 6 Set up spee.ch + +## Build it + `cd spee.ch` + + ~/spee.ch: + + `npm install` + + `cp ~/spee.ch/docs/setup/conf/speech/chainqueryConfig.json ~/spee.ch/site/config/chainqueryConfig.json` + + `npm run configure` (once your wallet balance has cleared) + * Database: lbry + * Username: root + * Password: abcd1234 + * Port: 3000 + * Site Title: Your Site Name + * Enter your site's domain name: https://freezepeach.fun (this must include 'https://') + * Enter a directory where uploads should be stored: (/home/lbry/Uploads) + + `npm run start` + +## Try it + + Navigate to yourdomain.fun! + +# 7 Production + +## pm2 to keep your speech app running + ``` + npm install -g pm2 + ``` + +### 7 Maintenance Proceedures + +#### Change daemon + * backup wallet (private keys!) to a safe place + * wget daemon from https://github.com/lbryio/lbry/releases + * wget -O ~/your_name_daemon.zip https://your_copied_file_path.zip + * rm ./lbrynet + * unzip -o -u ~/your_name_daemon.zip From a740f6dba1bd744a6927cc17dad07deee285580c Mon Sep 17 00:00:00 2001 From: Jessop Breth Date: Mon, 12 Nov 2018 09:26:40 -0500 Subject: [PATCH 57/63] adds new chainquery default json --- cli/configure.js | 8 ++++++++ cli/defaults/chainqueryConfig.json | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cli/configure.js b/cli/configure.js index c2b2aa2e..8db0faac 100644 --- a/cli/configure.js +++ b/cli/configure.js @@ -67,6 +67,13 @@ try { slackConfig = require('./defaults/slackConfig.json'); } +let chainqueryConfig; +try { + chainqueryConfig = require('../site/config/chainqueryConfig.json'); +} catch (error) { + chainqueryConfig = require('./defaults/chainqueryConfig.json'); +} + // ask user questions and create config files inquirer .prompt(mysqlQuestions(mysqlDatabase, mysqlUsername, mysqlPassword)) @@ -196,6 +203,7 @@ inquirer createConfigFile('lbryConfig.json', lbryConfig); createConfigFile('loggerConfig.json', loggerConfig); createConfigFile('slackConfig.json', slackConfig); + createConfigFile('chainqueryConfig.json', chainqueryConfig); }) .then(() => { console.log('\nYou\'re all done!'); diff --git a/cli/defaults/chainqueryConfig.json b/cli/defaults/chainqueryConfig.json index 94c1898a..2ef4c607 100644 --- a/cli/defaults/chainqueryConfig.json +++ b/cli/defaults/chainqueryConfig.json @@ -1,8 +1,8 @@ { - "host": "localhost", + "host": "public.chainquery.lbry.io", "port": "3306", "timeout": 30, "database": "chainquery", - "username": "lbry", - "password": "root" + "username": "speechpublic", + "password": "7uITJLwZRvHBZYS3JZDykD1-7hLVkVA1jDWfcgqi6QnC" } From 0b2b7fff929e04433a7da214340425a87f444e9c Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 12 Nov 2018 10:20:41 -0500 Subject: [PATCH 58/63] return null if either requestId or requestType are undefined --- server/render/build/handleShowRender.js | 4 ++++ server/render/src/handleShowRender.jsx | 3 +++ 2 files changed, 7 insertions(+) diff --git a/server/render/build/handleShowRender.js b/server/render/build/handleShowRender.js index 277b9630..536b431b 100644 --- a/server/render/build/handleShowRender.js +++ b/server/render/build/handleShowRender.js @@ -44,6 +44,10 @@ var getCanonicalUrlFromShow = function getCanonicalUrlFromShow(show) { var requestId = show.requestList[show.request.id]; var requestType = show.request.type; + if (!requestId || !requestType) { + return null; + } + switch (requestType) { case 'ASSET_DETAILS': var asset = show.assetList[requestId.key]; diff --git a/server/render/src/handleShowRender.jsx b/server/render/src/handleShowRender.jsx index a0640ffa..d6ce7c95 100644 --- a/server/render/src/handleShowRender.jsx +++ b/server/render/src/handleShowRender.jsx @@ -20,6 +20,9 @@ const createCanonicalLink = require('../../../utils/createCanonicalLink'); const getCanonicalUrlFromShow = show => { const requestId = show.requestList[show.request.id]; const requestType = show.request.type; + if (!requestId || !requestType) { + return null; + } switch (requestType) { case 'ASSET_DETAILS': const asset = show.assetList[requestId.key]; From 0c9c1563e7236be4b079ce2eac3e163916faf148 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Mon, 12 Nov 2018 10:26:28 -0500 Subject: [PATCH 59/63] fix asset cutoff --- client/scss/_asset-display.scss | 9 --------- 1 file changed, 9 deletions(-) diff --git a/client/scss/_asset-display.scss b/client/scss/_asset-display.scss index 2350f29f..cf9d979f 100644 --- a/client/scss/_asset-display.scss +++ b/client/scss/_asset-display.scss @@ -8,14 +8,6 @@ .asset-display { display: flex; - flex-direction: column; - flex: 1 1 auto; - justify-content: center; - position: relative; - width: 100%; - overflow: hidden; - align-items: center; - min-height: 50vh; } .asset-title { @@ -34,7 +26,6 @@ margin-right: auto; object-fit: contain; object-position: center; - background: black; } /*below must die if this is intended to be shareable component! it also probably doesn't need to be*/ From b5efb5f08f55fb6f7ff0cdc0dccc2ddc0cf3f339 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Mon, 12 Nov 2018 11:07:49 -0500 Subject: [PATCH 60/63] remove config --- .gitignore | 2 ++ config/.siteConfig.json.swp | Bin 12288 -> 0 bytes config/chainqueryConfig.json | 8 -------- config/lbryConfig.json | 5 ----- config/loggerConfig.json | 3 --- config/mysqlConfig.json | 5 ----- config/siteConfig.json | 37 ----------------------------------- config/slackConfig.json | 5 ----- 8 files changed, 2 insertions(+), 63 deletions(-) delete mode 100644 config/.siteConfig.json.swp delete mode 100644 config/chainqueryConfig.json delete mode 100644 config/lbryConfig.json delete mode 100644 config/loggerConfig.json delete mode 100644 config/mysqlConfig.json delete mode 100644 config/siteConfig.json delete mode 100644 config/slackConfig.json diff --git a/.gitignore b/.gitignore index f68ecf84..a67766ab 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,5 @@ public/bundle/Lekton-* public/bundle/style.css uploads + +config/ diff --git a/config/.siteConfig.json.swp b/config/.siteConfig.json.swp deleted file mode 100644 index 933afbccf7c4fe5b432073d3bc115d1b5d3eed6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2zmMER6vro5(1iRDDG`$6C|$B^@7lNCq~UU_ND&-5PIrM-pcs2*)^j)hfoGi4 z5+!s~CZ^cLu^^Mw2idJ1|1dJOs+^aW@i zbQARFImiuq4*CJ~4d^pa2>Rn~LVg5&2f7d11Noq9p!YxabU%UEV*c$Od0!RP} zAOR$R1dsp{KmthMbOH~F<5)S4Tk=X2Rd!G^YPfc9IHs!kD@)rcPmcPPYp~>MLn~94 z;QRm{A6gq&g;ac7QJLM6Y%443+<=4Y4Lsj%9g>vhIamMX)h6&Axu!Ed1t1KNh6D#wtH_eRzY0T?Y+-CACuNuoKvZ` z+bZucyLS|_P>ckN{9rnnGM;S4UNlNZB8p;f5+{Bb@_xL=M%}yBr79?! z$%-eYsFv1im=+lys<>JX51Q4Lb6LrZR?7xkSGo;|=Q=sqn~j6ryIW#DpWJ54x&KM9 zf5?tMo_|`+jy`I3bN|H#Q77kRj-@fY0&Bynoe|?Ysbpzs*-f?_=$YrHqDp?rnUfaU z*a4J^8hdP*Jzo2A3^&UbVID!O%6d_5p90XG_hKikl<8 zY~q?7Xl>H9^s51a-A#=t^^M``zv>L^c+n>J$0CfU2_1{+W)O+ck9a7;Q4n~e zCLl?LqKiS9FS>VPjdy?6;a~3tusgF8tQ@qF5;29PhkV Q%0i{^W-N_NTGt2UA5#E$1^@s6 diff --git a/config/chainqueryConfig.json b/config/chainqueryConfig.json deleted file mode 100644 index ae59e90b..00000000 --- a/config/chainqueryConfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "host": "chainquery.lbry.io", - "port": "3306", - "timeout": 30, - "database": "chainquery", - "username": "speechapi", - "password": "1304486ca42ecdbf419f667fdc02c31e7d03b1e3" -} diff --git a/config/lbryConfig.json b/config/lbryConfig.json deleted file mode 100644 index 7cf79730..00000000 --- a/config/lbryConfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "apiHost": "localhost", - "apiPort": "5279", - "getTimeout": 30 -} \ No newline at end of file diff --git a/config/loggerConfig.json b/config/loggerConfig.json deleted file mode 100644 index c5333fa0..00000000 --- a/config/loggerConfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "logLevel": "verbose" -} \ No newline at end of file diff --git a/config/mysqlConfig.json b/config/mysqlConfig.json deleted file mode 100644 index 3dd276a7..00000000 --- a/config/mysqlConfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "database": "lbry", - "username": "root", - "password": "" -} \ No newline at end of file diff --git a/config/siteConfig.json b/config/siteConfig.json deleted file mode 100644 index 4d123c63..00000000 --- a/config/siteConfig.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "analytics": { - "googleId": null - }, - "assetDefaults": { - "title": "Default Content Title", - "description": "Default Content Description", - "thumbnail": "https://spee.ch/0e5d4e8f4086e13f5b9ca3f9648f518e5f524402/speechflag.png" - }, - "auth": { - "sessionKey": "mysecretkeyword", - "masterPassword": "myMasterPassword" - }, - "details": { - "port": 3000, - "title": "dev1", - "ipAddress":"127.0.0.1", - "host": "localhost", - "description": "A decentralized hosting platform built on LBRY", - "twitter": false - }, - "publishing": { - "primaryClaimAddress": "bYscURD34PVAfYY7FdyY1W4TjdwQYXrDkN", - "uploadDirectory": "/home/lbry/Uploads", - "thumbnailChannel": "@thumbnails", - "thumbnailChannelId": "85d5f2fd814979dec6b082c2f88b07bc155e4e79", - "additionalClaimAddresses": [], - "disabled": false, - "disabledMessage": "Default publishing disabled message", - "channelClaimBidAmount": "0.1", - "fileClaimBidAmount": "0.01" - }, - "startup": { - "performChecks": true, - "performUpdates": true - } -} diff --git a/config/slackConfig.json b/config/slackConfig.json deleted file mode 100644 index 5bbf8072..00000000 --- a/config/slackConfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "slackWebHook": false, - "slackErrorChannel": false, - "slackInfoChannel": false -} \ No newline at end of file From eea5d67f02b184a8c2dc414309ae8ea4e79065cf Mon Sep 17 00:00:00 2001 From: Shawn K Date: Mon, 12 Nov 2018 10:19:31 -0600 Subject: [PATCH 61/63] Update handleShowRender.jsx --- server/render/src/handleShowRender.jsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/render/src/handleShowRender.jsx b/server/render/src/handleShowRender.jsx index d6ce7c95..6e527b0c 100644 --- a/server/render/src/handleShowRender.jsx +++ b/server/render/src/handleShowRender.jsx @@ -20,9 +20,11 @@ const createCanonicalLink = require('../../../utils/createCanonicalLink'); const getCanonicalUrlFromShow = show => { const requestId = show.requestList[show.request.id]; const requestType = show.request.type; + if (!requestId || !requestType) { return null; } + switch (requestType) { case 'ASSET_DETAILS': const asset = show.assetList[requestId.key]; @@ -39,6 +41,7 @@ const returnSagaWithParams = (saga, params) => { yield call(saga, params); }; }; + module.exports = (req, res) => { let context = {}; @@ -54,6 +57,7 @@ module.exports = (req, res) => { // Workaround, remove when a solution for async httpContext exists const showState = store.getState().show; const assetKeys = Object.keys(showState.assetList); + if(assetKeys.length !== 0) { res.claimId = showState.assetList[assetKeys[0]].claimId; } else { From 9dcf828db2875a062ddcc81dcc758eb8c63bed2d Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Mon, 12 Nov 2018 11:28:56 -0500 Subject: [PATCH 62/63] fix asset display on firefox --- client/scss/_asset-display.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/scss/_asset-display.scss b/client/scss/_asset-display.scss index cf9d979f..55983340 100644 --- a/client/scss/_asset-display.scss +++ b/client/scss/_asset-display.scss @@ -1,13 +1,13 @@ .asset-main { - height: 80vh; + height: 75vh; display: flex; flex-direction: column; - align-items: space-between; align-items: center; } .asset-display { display: flex; + min-height: 50vh } .asset-title { From 35698ca1c681e7d622db6b9ab5161ca26507a300 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Mon, 12 Nov 2018 12:37:37 -0500 Subject: [PATCH 63/63] remove deployment-config.json --- .gitignore | 2 ++ deployment-config.json | 10 ---------- 2 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 deployment-config.json diff --git a/.gitignore b/.gitignore index a67766ab..06ec7271 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ public/bundle/style.css uploads config/ + +deployment-config.json diff --git a/deployment-config.json b/deployment-config.json deleted file mode 100644 index c4bc966f..00000000 --- a/deployment-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "sftp", - "host": "sean.lbry.tech", - "username": "lbry", - "password": "", - "port": 22, - "remotePath": "/home/lbry/spee.ch", - "sshKeyFile": "/Users/sean/.ssh/id_rsa2", - "uploadOnSave": true -}