From 542107db78d48f74488fc4b71934edfb98b2242d Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( <div> + + {description && ( + <Row> + <p class='asset-description'>{description}</p> + </Row> + )} + {channelName && ( <Row> <RowLabeled @@ -104,12 +111,6 @@ class AssetInfo extends React.Component { </SpaceBetween> </Row> - {description && ( - <Row> - <p>{description}</p> - </Row> - )} - <Row> <p> Hosted via the <a className={'link--primary'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> 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} > <AssetTitle /> - <HorizontalSplit - leftSide={<AssetDisplay />} - rightSide={<AssetInfo />} + <VerticalSplit + top={<AssetDisplay />} + bottom={<AssetInfo />} /> </PageLayout> ); -- 2.45.3 From 431757cea4c251fe680af245c71332d1cbec5cb5 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( - <div> - - {description && ( - <Row> - <p class='asset-description'>{description}</p> - </Row> - )} + <div className='asset-information'> + <HorizontalSplit + leftSide={ + <div className='asset-description'> + {description && ( + <p>{description}</p> + )} + </div> + } + rightSide={''} + /> {channelName && ( <Row> -- 2.45.3 From 81f97c133197d1b34b2b63d1d88d2fd3da4c318b Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( + <div className={'row-labeled-alt'}> + <div className={'row-labeled-label'}>{this.props.label}</div> + <div className={'row-labeled-content'}>{this.props.content}</div> + </div> + ); + } +} + +export default RowLabeledAlt; -- 2.45.3 From e0b15691b9a11b3d35c4baa2ee5a93bc882a6aeb Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( - <div className='asset-information'> + <div className='asset-information-wrap'> <HorizontalSplit leftSide={ <div className='asset-description'> @@ -21,106 +21,110 @@ class AssetInfo extends React.Component { )} </div> } - rightSide={''} + rightSide={ + <div className='asset-information'> + {channelName && ( + <Row> + <RowLabeled + label={ + <Label value={'Channel'} /> + } + content={ + <span className='text'> + <Link className='link--brand' to={`/${channelName}:${certificateId}`}>{channelName}</Link> + </span> + } + /> + </Row> + )} + + <Row> + <RowLabeled + label={ + <Label value={'Share'} /> + } + content={ + <AssetShareButtons + host={host} + name={name} + shortId={shortId} + /> + } + /> + </Row> + + <Row> + <RowLabeled + label={ + <Label value={'Link'} /> + } + content={ + <ClickToCopy + id={'short-link'} + value={`${host}/${shortId}/${name}`} + /> + } + /> + </Row> + + <Row> + <RowLabeled + label={ + <Label value={'Embed'} /> + } + content={ + <div> + {(contentType === 'video/mp4') ? ( + <ClickToCopy + id={'embed-text-video'} + value={`<video width="100%" controls poster="${thumbnail}" src="${host}/${claimId}/${name}.${fileExt}"/></video>`} + /> + ) : ( + <ClickToCopy + id={'embed-text-image'} + value={`<img src="${host}/${claimId}/${name}.${fileExt}"/>`} + /> + )} + </div> + } + /> + </Row> + + <Row> + <SpaceBetween> + <a + className='link--brand' + href={`${host}/${claimId}/${name}.${fileExt}`} + > + Direct Link + </a> + <a + className={'link--brand'} + href={`${host}/${claimId}/${name}.${fileExt}`} + download={name} + > + Download + </a> + <a + className={'link--brand'} + target='_blank' + href='https://lbry.io/dmca' + > + Report + </a> + </SpaceBetween> + </Row> + + <Row> + <p> + Hosted via the <a className={'link--brand'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain + </p> + </Row> + + </div> + } /> - {channelName && ( - <Row> - <RowLabeled - label={ - <Label value={'Channel:'} /> - } - content={ - <span className='text'> - <Link to={`/${channelName}:${certificateId}`}>{channelName}</Link> - </span> - } - /> - </Row> - )} - - <Row> - <RowLabeled - label={ - <Label value={'Share:'} /> - } - content={ - <AssetShareButtons - host={host} - name={name} - shortId={shortId} - /> - } - /> - </Row> - - <Row> - <RowLabeled - label={ - <Label value={'Link:'} /> - } - content={ - <ClickToCopy - id={'short-link'} - value={`${host}/${shortId}/${name}`} - /> - } - /> - </Row> - - <Row> - <RowLabeled - label={ - <Label value={'Embed:'} /> - } - content={ - <div> - {(contentType === 'video/mp4') ? ( - <ClickToCopy - id={'embed-text-video'} - value={`<video width="100%" controls poster="${thumbnail}" src="${host}/${claimId}/${name}.${fileExt}"/></video>`} - /> - ) : ( - <ClickToCopy - id={'embed-text-image'} - value={`<img src="${host}/${claimId}/${name}.${fileExt}"/>`} - /> - )} - </div> - } - /> - </Row> - - <Row> - <SpaceBetween> - <a - className='link--primary' - href={`${host}/${claimId}/${name}.${fileExt}`} - > - Direct Link - </a> - <a - className={'link--primary'} - href={`${host}/${claimId}/${name}.${fileExt}`} - download={name} - > - Download - </a> - <a - className={'link--primary'} - target='_blank' - href='https://lbry.io/dmca' - > - Report - </a> - </SpaceBetween> - </Row> - - <Row> - <p> - Hosted via the <a className={'link--primary'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain - </p> - </Row> </div> ); -- 2.45.3 From dba4d15a67fbebbd4eff7aebb9ae0af4e3977ca4 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 { } })() } + <AssetTitle /> </div> + ); } }; 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 { <div className='asset-information'> {channelName && ( <Row> - <RowLabeled + <RowLabeledAlt label={ <Label value={'Channel'} /> } @@ -39,7 +39,7 @@ class AssetInfo extends React.Component { )} <Row> - <RowLabeled + <RowLabeledAlt label={ <Label value={'Share'} /> } @@ -54,7 +54,7 @@ class AssetInfo extends React.Component { </Row> <Row> - <RowLabeled + <RowLabeledAlt label={ <Label value={'Link'} /> } @@ -68,7 +68,7 @@ class AssetInfo extends React.Component { </Row> <Row> - <RowLabeled + <RowLabeledAlt label={ <Label value={'Embed'} /> } 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 ( - <Row> - <h3>{title}</h3> - </Row> + <div className='asset-title-wrap'> + <h3 className='asset-title'>{title}</h3> + </div> ); }; 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} > - <AssetTitle /> + <VerticalSplit top={<AssetDisplay />} bottom={<AssetInfo />} -- 2.45.3 From 3023b25eb2333ef4f3e5b8148a7993d22b478589 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 { <div className='asset-information-wrap'> <HorizontalSplit leftSide={ - <div className='asset-description'> + <div> {description && ( - <p>{description}</p> + <p className='asset-description'>{description}</p> )} </div> } -- 2.45.3 From 5f99629930b193b853998548ef3ae9bb54f37ab0 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( - <input - id={id} - value={value} - onClick={this.copyToClipboard} - type='text' - className='click-to-copy' - readOnly - spellCheck='false' - /> + <div className='click-to-copy-wrap'> + <input + id={id} + value={value} + onClick={this.copyToClipboard} + type='text' + className='click-to-copy' + readOnly + spellCheck='false' + /> + <Icon.Copy /> + </div> ); } } 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 { } /> - </div> ); } 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) => { <link rel="stylesheet" href="/bundle/style.css" type="text/css"> <!--google font--> <link href="https://fonts.googleapis.com/css?family=Roboto:300" rel="stylesheet"> + <link href="https://fonts.googleapis.com/css?family=Lora" rel="stylesheet"> </head> <body> <div id="react-app">${html}</div> @@ -22,6 +23,7 @@ module.exports = (helmet, html, preloadedState) => { window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace(/</g, '\\\u003c')} </script> <script src="/bundle/bundle.js"></script> + <script src="/assets/js/feather.min.js"></script> </body> </html> `; -- 2.45.3 From 57fab11316398dca09ebae7d3187a26dd1f64463 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( - <div className='click-to-copy-wrap'> + <div + className='click-to-copy-wrap' + onClick={this.copyToClipboard} + > <input id={id} value={value} - onClick={this.copyToClipboard} type='text' className='click-to-copy' readOnly -- 2.45.3 From 00bebfaa8a2b3a3f22a72a4e19d5f171b1084df4 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( + <div className={'vertical-split'}> + <div className='visible-content'> + {this.props.top} + </div> + <div className='collapse-content'> + {this.props.bottom} + </div> + </div> + ); + } +} + +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 ( - <div className={'asset-display'}> - {(status === LOCAL_CHECK) && - <div> - <p>Checking to see if Spee.ch has your asset locally...</p> - </div> - } - {(status === UNAVAILABLE) && - <div> - <p>Sit tight, we're searching the LBRY blockchain for your asset!</p> - <ProgressBar size={12} /> - <p>Curious what magic is happening here? <a className='link--primary' target='blank' href='https://lbry.io/faq/what-is-lbry'>Learn more.</a></p> - </div> - } - {(status === ERROR) && - <div> - <p>Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the below error message in the <a className='link--primary' href='https://chat.lbry.io' target='_blank'>LBRY discord</a>.</p> - <i><p id='error-message'>{error}</p></i> - </div> - } - {(status === AVAILABLE) && - (() => { - switch (contentType) { - case 'image/jpeg': - case 'image/jpg': - case 'image/png': - case 'image/gif': - return ( - <img - className='asset-image' - src={sourceUrl} - alt={name} - /> - ); - case 'video/mp4': - return ( - <video - className='asset-video' - controls poster={thumbnail} - > - <source - src={sourceUrl} - /> - <p>Your browser does not support the <code>video</code> element.</p> - </video> - ); - default: - return ( - <p>Unsupported content type</p> - ); + <div className={'asset-display-wrap'}> + <div className={'asset-display'}> + {(status === LOCAL_CHECK) && + <div> + <p>Checking to see if Spee.ch has your asset locally...</p> + </div> } - })() - } + {(status === UNAVAILABLE) && + <div> + <p>Sit tight, we're searching the LBRY blockchain for your asset!</p> + <ProgressBar size={12} /> + <p>Curious what magic is happening here? <a className='link--primary' target='blank' href='https://lbry.io/faq/what-is-lbry'>Learn more.</a></p> + </div> + } + {(status === ERROR) && + <div> + <p>Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the below error message in the <a className='link--primary' href='https://chat.lbry.io' target='_blank'>LBRY discord</a>.</p> + <i><p id='error-message'>{error}</p></i> + </div> + } + {(status === AVAILABLE) && + (() => { + switch (contentType) { + case 'image/jpeg': + case 'image/jpg': + case 'image/png': + case 'image/gif': + return ( + <img + className='asset-image' + src={sourceUrl} + alt={name} + /> + ); + case 'video/mp4': + return ( + <video + className='asset-video' + controls poster={thumbnail} + > + <source + src={sourceUrl} + /> + <p>Your browser does not support the <code>video</code> element.</p> + </video> + ); + default: + return ( + <p>Unsupported content type</p> + ); + } + })() + } + </div> <AssetTitle /> </div> 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} > - - <VerticalSplit + <VerticalCollapsibleSplit top={<AssetDisplay />} bottom={<AssetInfo />} /> -- 2.45.3 From b3d05c7b82997f18600aeba7ad0b61ffb2cfecd4 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( <div className={'vertical-split'}> <div className='visible-content'> {this.props.top} + <button className='collapse-button' onClick={this.collapse}> + {this.state.open ? <Icon.PlusSquare /> : <Icon.MinusSquare /> } + </button> </div> - <div className='collapse-content'> + <div className='collapse-content' id={this.props.name}> {this.props.bottom} </div> </div> ); } -} +}; 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} > <VerticalCollapsibleSplit + name={'asset-display-collapse'} top={<AssetDisplay />} bottom={<AssetInfo />} /> -- 2.45.3 From 8759bcfdd6e7925a03b19902f58d01c98e1172c8 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( - <SpaceBetween > + <div className='share-buttons'> <a className='link--primary' target='_blank' href={`https://twitter.com/intent/tweet?text=${host}/${shortId}/${name}`} > - twitter + <img src='/assets/img/icn_twitter.svg' /> </a> <a className='link--primary' target='_blank' href={`https://www.facebook.com/sharer/sharer.php?u=${host}/${shortId}/${name}`} > - facebook + <img src='/assets/img/icn_facebook.svg' /> </a> <a className='link--primary' target='_blank' href={`http://tumblr.com/widgets/share/tool?canonicalUrl=${host}/${shortId}/${name}`} > - tumblr + <img src='/assets/img/icn_tumblr.svg' /> </a> <a className='link--primary' target='_blank' href={`https://www.reddit.com/submit?url=${host}/${shortId}/${name}&title=${name}`} > - reddit + <img src='/assets/img/icn_reddit.svg' /> </a> - </SpaceBetween> + </div> ); }; 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>icn_facebook</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded" transform="translate(-867.000000, -911.000000)" fill-rule="nonzero"> + <g id="icn_facebook" transform="translate(867.000000, 911.000000)"> + <rect id="Rectangle-7-Copy" fill="#5487DE" x="0" y="0" width="30" height="30" rx="15"></rect> + <path d="M10,16.2457933 L10,13.2217548 L12.6590693,13.2217548 L12.6590693,10.9945913 C12.6590693,9.72775809 13.0205601,8.74529596 13.7435525,8.04717548 C14.4665449,7.349055 15.4293617,7 16.6320317,7 C17.6539537,7 18.4464527,7.04086498 19.0095525,7.12259615 L19.0095525,9.81971154 L17.3724001,9.81971154 C16.774541,9.81971154 16.3713397,9.94230647 16.1627842,10.1875 C15.9542287,10.4326935 15.8499525,10.8004783 15.8499525,11.2908654 L15.8499525,13.2217548 L18.9052753,13.2217548 L18.4985941,16.2457933 L15.8499525,16.2457933 L15.8499525,24 L12.6590693,24 L12.6590693,16.2457933 L10,16.2457933 Z" id="facebook" fill="#FFFFFF"></path> + </g> + </g> + </g> +</svg> \ 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>icn_reddit</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded" transform="translate(-955.000000, -911.000000)" fill-rule="nonzero"> + <g id="icn_reddit" transform="translate(955.000000, 911.000000)"> + <circle id="Oval" fill="#FF4500" cx="15" cy="15" r="15"></circle> + <path d="M24.0048981,15.1197594 C23.9764831,14.3425491 23.4942377,13.6545068 22.773348,13.3626486 C22.0524583,13.0707904 21.2273777,13.229551 20.6662713,13.7680886 C19.1286396,12.7228617 17.3211611,12.1454075 15.4623388,12.1055335 L16.3409248,7.88832069 L19.2335002,8.49657254 C19.3045341,9.15687714 19.8447288,9.66775963 20.507966,9.70188281 C21.1712032,9.73600599 21.7609761,9.2832597 21.8994002,8.6337316 C22.0378242,7.98420349 21.6838865,7.33033854 21.0643652,7.09108696 C20.4448439,6.85183538 19.7432934,7.09808364 19.4092174,7.67205337 L16.097624,7.00973469 C15.9882261,6.98573517 15.8737733,7.00653061 15.7798101,7.06747975 C15.6858468,7.1284289 15.6201945,7.22445834 15.5975059,7.33413567 L14.5972695,12.0244333 C12.7155841,12.0528011 10.8832461,12.6306923 9.32575344,13.6869883 C8.75634717,13.1512356 7.92434611,13.0021476 7.20433738,13.3068472 C6.48432865,13.6115468 6.01208752,14.3125756 6.00022843,15.0943133 C5.98836935,15.876051 6.43912863,16.5910818 7.14956348,16.9174815 C7.13434461,17.1154345 7.13434461,17.3142637 7.14956348,17.5122166 C7.14956348,20.5399592 10.6774242,23 15.0298041,23 C19.382184,23 22.9100448,20.5399592 22.9100448,17.5122166 C22.9252636,17.3142637 22.9252636,17.1154345 22.9100448,16.9174815 C23.5907847,16.5791323 24.016659,15.8798572 24.0048981,15.1197594 Z M10.4881903,16.4714301 C10.4881903,15.724923 11.0933539,15.1197594 11.8398611,15.1197594 C12.5863682,15.1197594 13.1915319,15.724923 13.1915319,16.4714301 C13.1915319,17.2179373 12.5863682,17.8231009 11.8398611,17.8231009 C11.4813757,17.8231009 11.137573,17.6806932 10.8840855,17.4272057 C10.6305981,17.1737183 10.4881903,16.8299155 10.4881903,16.4714301 Z M18.3413975,20.1885248 C17.3824182,20.9112013 16.202534,21.2790195 15.0027707,21.2293113 C13.8030075,21.2790195 12.6231232,20.9112013 11.6641439,20.1885248 C11.5450602,20.0434288 11.5554608,19.831664 11.6881894,19.6989354 C11.820918,19.5662068 12.0326828,19.5558062 12.1777788,19.6748899 C12.9904434,20.2709755 13.9824183,20.5714295 14.989254,20.5264425 C15.9973291,20.581264 16.9939253,20.2903914 17.8142459,19.7019233 C17.910827,19.6077567 18.0503089,19.5722686 18.1801501,19.608827 C18.3099913,19.6453854 18.4104658,19.7484362 18.4437259,19.8791612 C18.476986,20.0098862 18.4379786,20.148425 18.3413975,20.2425916 L18.3413975,20.1885248 Z M18.0980968,17.8771677 C17.3515896,17.8771677 16.746426,17.2720041 16.746426,16.525497 C16.746426,15.7789898 17.3515896,15.1738262 18.0980968,15.1738262 C18.844604,15.1738262 19.4497676,15.7789898 19.4497676,16.525497 C19.4646058,16.8956141 19.3269023,17.2556033 19.0688404,17.5213305 C18.8107785,17.7870576 18.4549729,17.935236 18.0845801,17.9312346 L18.0980968,17.8771677 Z" id="Shape" fill="#FFFFFF"></path> + </g> + </g> + </g> +</svg> \ 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>icn_tumblr</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded" transform="translate(-911.000000, -911.000000)" fill-rule="nonzero"> + <g id="icn_tumblr" transform="translate(911.000000, 911.000000)"> + <rect id="Rectangle-7-Copy-2" fill="#274061" x="0" y="0" width="30" height="30" rx="15"></rect> + <path d="M10,13.3195248 L10,11.139339 C10.6412999,10.9383992 11.1874537,10.6570877 11.6384778,10.2953961 C12.0895019,9.92700647 12.4524299,9.48494557 12.7272727,8.9692001 C13.0021155,8.44675665 13.1923885,7.79036318 13.2980973,7 L15.6131078,7 L15.6131078,10.8982124 L19.4608879,10.8982124 L19.4608879,13.3195248 L15.6131078,13.3195248 L15.6131078,17.2780189 C15.6131078,18.188946 15.6624378,18.7649647 15.7610994,19.0060925 C15.8527136,19.2539182 16.0359394,19.454855 16.3107822,19.6089088 C16.6631448,19.8165466 17.0754029,19.9203639 17.5475687,19.9203639 C18.3720971,19.9203639 19.1895661,19.665844 20,19.1567966 L20,21.5881559 C19.2811803,21.9096595 18.6539844,22.127341 18.1183932,22.2412069 C17.5757549,22.3684688 16.9661767,22.4320988 16.2896406,22.4320988 C15.5496792,22.4320988 14.8942946,22.3416772 14.3234672,22.1608314 C13.7737816,21.9933816 13.2875285,21.7422106 12.8646934,21.407311 C12.4559529,21.0657133 12.1775906,20.714074 12.0295983,20.3523823 C11.8745588,19.9906907 11.7970402,19.4515104 11.7970402,18.7348251 L11.7970402,13.3195248 L10,13.3195248 Z" id="tumblr" fill="#FFFFFF"></path> + </g> + </g> + </g> +</svg> \ 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>icn_twitter</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded" transform="translate(-823.000000, -911.000000)" fill-rule="nonzero"> + <g id="icn_twitter" transform="translate(823.000000, 911.000000)"> + <rect id="Rectangle-7" fill="#4DC2FE" x="0" y="0" width="30" height="30" rx="15"></rect> + <path d="M7,20.3784787 C7.23887844,20.4052125 7.50505328,20.4185791 7.79853251,20.4185791 C9.33417962,20.4185791 10.7025913,19.9574295 11.9038086,19.0351165 C11.1871733,19.0217496 10.5456237,18.8062123 9.97914051,18.3884981 C9.41265735,17.9707839 9.02363258,17.4377885 8.81205454,16.789496 C9.03728278,16.8229132 9.24544516,16.8396215 9.43654791,16.8396215 C9.73002714,16.8396215 10.0200895,16.8028632 10.3067436,16.7293455 C9.54233258,16.5756266 8.90931421,16.2030311 8.40766949,15.6115478 C7.90602476,15.0200644 7.65520616,14.3333525 7.65520616,13.5513915 L7.65520616,13.5112911 C8.11931284,13.7652614 8.61753755,13.9022696 9.14989521,13.9223199 C8.69943873,13.6282491 8.34112644,13.2439577 8.07494761,12.7694344 C7.80876877,12.294911 7.67568135,11.7802948 7.67568135,11.2255703 C7.67568135,10.6374287 7.82583126,10.0927375 8.12613559,9.59148039 C8.95197248,10.5873111 9.95695313,11.3842979 11.1411077,11.9824647 C12.3252622,12.5806315 13.5930052,12.913127 14.9443747,12.9799613 C14.8897739,12.725991 14.8624739,12.4787079 14.8624739,12.2381045 C14.8624739,11.3425252 15.184955,10.5789551 15.8299268,9.94737114 C16.4748986,9.31578722 17.2546543,9 18.1692175,9 C19.1247313,9 19.9300808,9.3408497 20.5852902,10.0225593 C21.3292259,9.88220734 22.028788,9.62155757 22.6839975,9.24060219 C22.4314688,10.0091964 21.9468941,10.6040125 21.2302588,11.0250685 C21.8649929,10.9582342 22.4997176,10.791151 23.1344517,10.5238139 C22.6771701,11.1787898 22.1243454,11.7368476 21.4759611,12.1980042 C21.4827862,12.2915721 21.4861987,12.431922 21.4861987,12.619058 C21.4861987,13.4879036 21.3565238,14.3550653 21.09717,15.2205692 C20.8378163,16.0860731 20.4436728,16.9164765 19.9147277,17.7118044 C19.3857826,18.5071323 18.7561767,19.2105525 18.0258912,19.8220862 C17.2956056,20.4336198 16.4151812,20.9215027 15.3845913,21.2857495 C14.3540015,21.6499963 13.2517646,21.832117 12.0778477,21.832117 C10.2282461,21.832117 8.53564712,21.3475758 7,20.3784787 L7,20.3784787 Z" id="twitter" fill="#FFFFFF"></path> + </g> + </g> + </g> +</svg> \ No newline at end of file -- 2.45.3 From de27ae81a86aa4257df1331ffa099d071756141c Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@Mineshs-MacBook-Pro.local> 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 ( <div className={'vertical-split'}> - <div className='visible-content'> + <div className='visible-content' data-name={this.props.name}> {this.props.top} <button className='collapse-button' onClick={this.collapse}> - {this.state.open ? <Icon.PlusSquare /> : <Icon.MinusSquare /> } + {this.state.closed ? <Icon.MinusSquare /> : <Icon.PlusSquare /> } </button> </div> - <div className='collapse-content' id={this.props.name}> + <div className='collapse-content' data-name={this.props.name}> {this.props.bottom} </div> </div> -- 2.45.3 From 160fefb4178e89033e65ee0f9c089ab9f0c8bcf8 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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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 B?d1Rf literal 0 HcmV?d00001 diff --git a/client/scss/font/_font.scss b/client/scss/font/_font.scss index a62312a0..279b7de7 100644 --- a/client/scss/font/_font.scss +++ b/client/scss/font/_font.scss @@ -16,3 +16,16 @@ font-weight: normal; font-style: italic; } + + +@font-face { + font-family: 'Circular'; + src: url('./font/Circular/CircularStd-Book.ttf'); + font-weight: normal; +} + +@font-face { + font-family: 'Circular'; + src: url('./font/Circular/CircularStd-Bold.ttf'); + font-weight: bold; +} \ No newline at end of file diff --git a/client/scss/text/_text.scss b/client/scss/text/_text.scss index a8b72aa0..331eaff7 100644 --- a/client/scss/text/_text.scss +++ b/client/scss/text/_text.scss @@ -18,7 +18,7 @@ h3 { } p, body, button, input, textarea, label, select, option { - font-family: 'Lora', serif; + font-family: 'Circular', serif; font-size: 16px; } diff --git a/public/bundle/CircularStd-Bold-5b43235344fe2aee5bbbbe836e3acc7d.ttf b/public/bundle/CircularStd-Bold-5b43235344fe2aee5bbbbe836e3acc7d.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/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 zcmd442Yggj_6L6NoAjPcCPV79%uL#(O-t{+cS1r!5|R**CLkgr2sXe%6-Cj-hKktG z-L<W2LtX40bp>=?cP+c3B5NTp|L?tTX3~N6xBt)oPk8gD+;{J}=bm%!x#ygFE}?{w zKyoROk)>s2Ew%I7u1+Jgcq_h*DlaK5^U`?45c2S8e9kCusBca?;U7iFGdYA@)>7Ww zTD0r6ynTcmv=9>DQQw@BUSC%KE+KRk%J<A&)VnnDUw{385bq2^+`8xWE?+t_f|kg` zC-J-2yoDDHzT}~=BP6(nkj?Ew1HJuT72CJqH`bnQ2w!+_@<9C*^^@44MJrZ)-QHS> z&qoOH>{+;EZtqXS?|(sv|BZym4le3lwNy}(QvBYI^6JICiw3sOmtRlF&36*w<F$0j z@)cxc|8hd^IzWhDIbnULq{#Z`m%o`4nDZm?mHiXnkhfkiq7CUj^7hCK_cvru<D(Z5 z*thtH=VX5u(FYF?{Qi#n8@wjzH>to8_6?vcA|Ct;_9W${3ixNBLnx!q5qI1-3k=$7 z=}x;z1Jw{B_<FbrlnPY1l#rAL^7+Lm<Heq>scWex&k%ocL>50%NM4rxo%*RcOnCWJ zID{f<;wz++23DH<B3;x@I_OFgCwxZIg=Ug2OCxsSaZ*P9LgHvLvEw52F`^UfcyAzO zbUrarCGH0S%OFXoy(C-+#_#b&FXZ7Ki>ri~>EDREkV;HKDeBRZY8sF0GyK*_3fY~C zL?_F_?~fB7p@Vb?|Hk__aWBPX#5Ii1p8>WRcppYWg*~{(k`CEH+<(Pgi{D!v_w(>w zBQXdKsOwhJAZ#N(vTsPBFdv^6;93Qk)u;<F<L)ka1LhbKNP~!0@I}8H@k|JCP=hOm z#M7B*uL$)sTn&?KB943~_~X4u8f3Fj7T*gwD9fH>{ab>uc>#Tzi|1_U=P9%wj{3hw z+rGqyzKt@yfWZSW^rHPNqGR}{3Q~#oSo?)S8A-ww&dLb6q?KMw3^FU8IY5f&2P6jH znHcW*cQet}a`eFtTwXzP=^m0pLx9_Cz_Sd$vGFkwHPvH$J}1R^K2+vM>@r_mO&CWJ za5B74ak&YAkBtQzhcOqOG4c)@3*0})-B);*ggD26jm6lD;gXLJ8;h|Q8;b_iYsdEt z?^9f|1^Awg1;%0QMTSR?VJt8nBcI_e0}kU{<G{vZ>;+oopD`9}JX{yXf{z*QtS%vi zxHEciTLbv-<>P5!<LIIpHg2Ded`8y;r|e>QUx2ZD0OO>`{Y#>u7ZDZ4UnlGW??(Y| zYz*e%K8W#E68=xvKnmUJNj3S1#F69Dg>j2>T^mr}ems*v%4Bzv4mTCXD3rwD3Y8V3 z?j+Q8H^zTI#`$SnJ8|8P>o#0B;o6If{g#69cGAN%<%EYpGdF<uI!O$Jm;M5p5QyC^ z6!(AQ(n)uBe`5FW!236W%Mo1H;d&d_F_bmog5;vlk~rM8^x2USjGJBNKJqrZ3#Wn4 z!VyvCiLrbW@c%S&N>)KyWsoOspg&<QNoM#G9^|xO5)|m~PL8iKVK-pY04^KoFcZ%* z-iVPdM%Rq~WxL5@enFzkZ~;F$Sw6mJ7yJD%c;h4q=kM9)GhN9<=azvozXz;4z!$S| zbpY=-N*5czDRFx-@ckRdfTW{N#@GKQ?eul<=eM|C!{=^XZ{hui_&$uxg3K(V50G~9 zD`^+*#dqv`#?S1zPjFY03c3yV65#JK+;@^lp_4??TZkU8Mbh1*7&4gP^1>B|D+HGX z*Pn5{j7y7aJ}xV+7+iW>tegRt2A2s}B(7I*9mZ9KE6s7w$K8gDl?xD(LHDU73RfO3 zJ1#RW_AG0kUBS2#ah2d=ZKdL3^;Mytc3gzdElf^>C%L?YtmN|(<RAYHa*WLz!eY=- zHt5*FBcM-{P!71Kxo8z&y9?#t0$trt!pSS(-RE!}0G(jWon!4Bd&o{D=r5cGlMwJq zH29vqpFwxvJ-e2ZX!0=sE}UKfJTGz73Aq4rfgZ!JC_b+fp#`5X>ys$V=^40hhF0YP z2?X_otR*8fjTX^n+Dli_wRF4ilJFPd6WLDLy|SldlBzUokQggQp8RU6c)>MV7U zx<uWmUaG!Gy-9sQBiCp(2F-lU63q_HZq2=#M>Q{M1+9lRP#dCEXd|>S+C*)Iwnsal zJrsLLf1Cah{VV!649P~hQDNM8T=>;Z9D(M={`o^Y*b7(+X%p=MESCV57Xix=7c8ED zMXsKqj#8^RESWA?R;Vv^!P28ysM)I71y~+(!4eEu!d<ZRb6EE359$xQV7c@-h@8Vh zM}8dn+sJbx+eS8wEFYOS(l}B(k|lbI9>YHk7Y!#5M-7J`f9LpH#}6NW>G+Gs4;_E* z_~XYPKED6>y~l4kzV7&%<13H19Q*gN<HtTZcIUC%k8L=1>9O;Vop-F`nCe*6vCw1k zW5LG)j`<!PIr_JwuO9u&(FK1!@8fMBumAYGkB2_?`N;5*{=+9VB_8EMtu%HVGymVe zcnFMI7)Xqc#{Q!&-P5Uqj{SA)d+A9TaU<@aK2PY3-k?EW;)jtBfTkZrK<z|MLWzQe z5ha-cT8<!*pxS5>LsXy+4bg&UVu_v@h!L|`JV_vlB#D?vGD#tj3y^DOVj)&yBX*KO zGD#M6ryP<?@<=`@Acdre6q6F@;bo+pRFFzig*mZ?)RH<<kD0xZG?8Y~LRv{1nF*;k zi*%4qGMjXfZZe1TkY04>N^%w1M6M<~$c^MyatFDc+)4J4yU5+-UUDDV501W{Jc#-E zA@JuT<oD!J@(1!5`6GFXJW2jUo+f`M%Sb;NAoIyT$SQIhSxU~M0$E8G&?K^v+yp7K zoSLBX&LbC64UMHb@*zzi3&|St0l9}fLDrMGWHF5+uhK+lwTs9l<e#LEY#>*V8^|H@ zBKd?IC7+SMkz<(WAE#FGEcEDq0rg*zuW1FXBwvt=$fx9UXbzW?Ysh8fT1bN}WGmT5 zt|QkI%!y<t*+Xt2H$y(XM&2dolQ+p*<ZZH=yhq+4uk!(gR>1#~fuoJ&T^dUJ=^DC~ z-btUM@6(flAcP9BLW9sR>=d36K9c#!@?_nzy|VXZC*5M)Qr$}2+TC`#{nOpe-R9oo zzSe!0`+oPM?x#Ei54A^*M~%mz#~P1)9xr={o(9i8&lR3qJ@52<#`CD>NiRRI7_Vfn zJg+9N9<Rk-2fW_(61`KsyS*><e!}~R_X(d+pJbmbpM^e~eGd2>@fCa{eA|83`0n+6 z)c0-QZ~Tbg48JnJCcjJlZpYtKe&742`Y-g~>VLcc=>Tm&f55E)j|IFO@P1%upf<25 zaCYG4z&`}O5cpM)S5QPyUQkoevY=~%9t-*<I4^j0@SfnOgFg?6326wqGGu?q33-4# zNnR&kBfn0*SN;e2(NK@joX~}#dqUq-%uuu|mMIP@-dFq*rVVQeTNbu6?6}gPT&R3> zM$nAKGY*Gq!w17}3V%JqBcdf@C}K^-_J}7UzK=|fY>QkQxj*u&sD!AxsEtvNMjek1 zh;E8r7=2^(tI<cIzmM^WDTvt^^QLNsszf!Y+NgR=by)RR)mLgabr|Gyn|h6Ut9qaM zUG*=TD92xdCPUM%Sq16%I%IT?wn4j4d#QH6PSAzuw7SK*HM)m%Z|lB_4U4Ua?T@`Z z_TAW1dM~|A-=|-#-={yKKWRue^c!wByl?o$7-!5gb{N+h?=-$({3<Rit}1S2+)Z(h z#vP3p;*;X@;v3@o;#b6PjK4MhVEl{m|BM$CLJ|xKISCC3ixcilcp~A|gnuTSO7uva zk(ivgG;wR<>xutP@<>uAr6(;+TAj2t>DHu2lU_~w#zah6raIG7)2*g2l9Q6VlkZGE zkrJ13Y09f9$5Vq+Gg6nP-ky3mEhMcDe@oLYPdk`)H0@NnHoYZ%Y5D`{$IXH{)Ldj< zY`)Tb(EPcDSn@1O@weadw&fRVg0<bc+IrCXy7dd2k4<Y!wRPK8+itQwXZyzPX3w+t z*e|!=Xg_Fw)Bc(LC;LwsaTzNzp3ZnX<3y%grY*BBb8Y7S%oj3GX2oTdWL=r{RMtn? zZrNek3E6qsE3zNWK9Lievp8pM&W$+-bKcMO;D7D8yK?W${VY$&i^#L&Rps^MEzY|% zZ)@JudEexF<g4?O^DFW%&)=TEH~*phXY#)<&=zzQY%h4dFsg82;S+^Nie?n077Z4y zDB521P|-h&Q;QcC-&*`)@jpv^N@kSUN=izaO8QGymRwh|x8%i=Z%RpNKq+*0$Y`v& z>1SAj%OH7)Iam{{HwWt)=yvf>Cr=88hO_Ij=4ItNMt&uq@N&L{$Yna2V6ml#g?eb; z4=;}JFxZSnn{Y_<puY^yX73H`nK-(M)(JZy$)SD7EjDv{m?AWg>Wl{a*bi~q$Ox^F zpp6&qcfAv4MryT@UOrDf>ErEs$LfTJDm)}?g#1^bPOI5&_T-mB=V`{Jv-8XG{oJjw zEwR_(y6Oh)#@&whYqw}ywAX3r^)+|nU(Mc{d-1Pk@7}%Wr;MbJTrETjB4(6$%pJsC zXHBL?dkj@tjmgwvvs=vyeDK7V3S|scgnD?|Ee4|^kJ3=3HGtBNy56PUbKLVX!t2`4 zYpH9V71-gPo)Fm7GuSyNH6<lg{Lk#fv<rrOmRH7D>U`dE59;2!&}aSv->z(pCeQCR zS<qlf`9j~vH5T7zy)Cr4GURD58^9p;k)LF4!WN8DFtDk^JV!!8!_sXQgVvLc1R&8G z+$MeFsiWr2NkvIXMeF8l=;_%ohaMaI>G*8=c83sJVltH^)fLX3U05`G_D|zJwE))) zFJ&Vqg~zeBj>h~7+m^=Yq0<_y7F#|wCJVSb##U)pcq;Yj>}yXCMQE5TR7LGJtHq$x zdI*+|IYV<6=N9<*hev9bR5UH<kG=fXp4-GueXdrvH8v+Z!WNclH5;|o?ga}g3))h> z0wOfU>c*Zqb<I_gn;u%fWM5sJ!R>~~<Xl58{WvjWMyxR{HXXx68Lg4qIIWGRv{B+3 zLsBSjAL*gVvIs`?wjjIGBS`6Ke>!vDzD%uPdoKM6G3E(S8q;b<ddPpIav?#UMq7~4 z{vTdWXdga|g7h<1kYfGaORooi1mJ_huJlxT8a<76qg`pGvWt~#nsS@#a_iS9R||)( zOsI&TpS);c@=$z5;#KTfJ60qFniS(KGYAZXtk79?_9vU3daCJ3TK@d=^@k3jT-iu3 zIgYtGm=Gred3aj$sGW^PS%ONNGCLzSnR*6B8ww)h(oG$Go))isy}KUIn#d`dLn|<n zM6a=GXpZ<D4LsGv`&b6vehV55!-a#Z%i^-)<Fj<^B~HQv06ob0pLkOpr3b}(JLya& zA@C*ROIV^T!VTyHYzrYl%CK}ha0TKNg6uZ6GAzi`Lv7rV8MihrlfB%ORZ87Tv$9IX z)1~wy@!gz+gdCcLS8+E@Xd4=86W_-x;D+R&VW2@+5;eMD9qX-`hV|T1)ZyDk|58ee z!5s{TI=p;|_F?;#8yR6b2-3q-qtN8heCi-VMd-DCboJoC%GH;a`p{Z2ODJz#IIAEl zw}Af6&pUYL#mieRu5C(6>1<kKDa))&Evm})X7%ewP6(9C9n^0J1{I#1>414A9?a=d z{hy}(Sv*W1d%XUlwTsSM@7^P8%qgg>vqe)=<3k<o_YHNmt-i1|EWftYoSg@_1qQc} zf_i<R?Gn3{nuGc1=h9%Aj)q;eWXYV*x1Ue15C=N9Z||hJ;`6Mp4p`9Fd^*}T6H0RQ z)>G;`BMM!&TVrl^LqkrbDWD*vg|>-brzXzoz4-D4{Z~8`l~YxbT~L<d9^pxgI-W>f zF}Hi&QU;S5W2pu%!=PCc>dAQ5GY?&4LPp|xb2<$Tlllz4_K!&|nR~HE*sPqn7hlsq zbp2D?XNj-0WMnrsu51*RH$-h1j7?oRZ(!98*FSVvwC7e=<>gmZp&#z3{V4h#g1aKX z%~O}>o=-JadNe$>KF8`k;1Qc@w<h}gi#vpk-J!{Y%O32l-L`N}VY07p2a`!Az$pWq zKF~T7P)8nxpwTk1Bk<wiZ@HARC*vncN_sM>O=nn2iWU}?_^z$2TwD3$M{7%M$vJDD zT9cD(E2S%FR!UM%PEtyi_*Py@YJPrd%8vPsnXMtg&6fIsfqHXGaBy2@BcnUaaezS% z7?f-z^C?4$J%Bo~<iHr^@(*y~*G#p!c*zo(d}dz9mDlzS?Y!eQLpyD1$;fPO%F1k3 zHmcUm)1_W8*thn^?SFVNj2_IXsm{%>s%C9fgHJ!8Uw}^oM>*9w57%&xjUU6ebfc4f z`LheiQ9R3Lk13=_h=cE|<6<;PGi}-=>g6A)r@Xej2z^RoYnNx5S9YvBY{`yV8P6H% zp9LjWZJ=De!k;R1bPveicCz*LIlFhyVK5hx8-yU(2)TZN!PNxg5`x4u`UbmbN3D3G zp7XD(E~;?1ny8ijS?s47;>)zM^);zBR-bO<SNbvLAvNY9qSt}b$FR1NalV6611Si> z!_h4o)lQp}ta+Ka1)jYgNkf(W7Y-&TE#hj+D}KuUjF{NG)S?<ojNDHVnbuLXs&Rg) zDyGQ$QI{@b8hJ~mM7!x&H4;6T-o*)FO6VYH%P9gF{h8D4%JEcSbdUf_3A6MzujI;- z)|E}VTwm{co6L|<bn_)wJaFHR3)<roHx)f}{IlD4zqaJAq&Q1)tGRHKT3ys#JNHVh z+WKptfBf?5C0if9?#csYwz#x+?!E7?PhPX+`Y%msv$7U-0zX)f3lBmhd$M;LqlPH} z-c)85N^8XztLM{*^J#>5-$f^1e38rUIpTASj%8TU62XM$0zk=XHV<)b=gi`fNb!-$ zw?rE3eADrdxy!RsvrAX^{?xZRtE4Pv<;I-KqWo)wLkrsM4IzPZa$6SBE&1u@oZ)}u znXUO?PtLC|0*9bLcgB`{q?j%R0TaYI2S}sWZhK?s){a$oMRtZRn>n;|=g`a*%9+u3 z1-`t0*@5PZhSUu+cZfgj?5b7Iy9E7ZaNhyAz4)x?gifvlpp5yR+BUT5s-Yb_PyMvz zxff<`zI6RH!`p>Jf4Y0$lYoak>y2kI@5a+$NKWZb@D>~CgW@AJS$vz;3WqvBn*AYg zG+G`Lf?4M*|5Tr|EJ}Vpdu%@;JvBNbqXVdpV>`<!Bu}vGzzWaQdq=En?!0O4&@COy z?p4j2abeTEo!bU8W~PM;r)YD3N=fs9FAg+a&}*n|-G0TDJ7TkQVwn5Q0nbJWe$0)U zV00R<W?^HWxT~*^F6g7#;vs0|Z^8cVC{Lb7dFTLu-~4ocKR%$I(2?&b$bn<fYL~>6 z6?JiGAKF)xVaw~gpl9C7cap=3v6RTAKZ$`omofjIgp+F>FvvU=3<O4SLhy+JfKanu z{166-qJ{4Rj2(25_=0%hDD1v?4s!r-54Z(ivA&PigDP)u)GKSp?|yvV$9jYHE|QvM z?Y-Z3oanvcm(!OCal=RWb!hm{LZJhe+wcs=N28<c0n{wqHYl#|yNver2}Q%`{qS)? z4Z2}-$B&>zPf1^aCLLtZ$}D+8dW@h54WJmZZM)vxwd>tqatGFKTsx3EfA1gm&ZqwX z>FuOmJH#*BuIo%s@4T*U*@2c8IA=jhoSy7x-wW0%#z7LxfEF=05;b0ji7)@Uy?gtp z(7SpyU0rC;C>DP&9u*F)>gZg_>M)HQ;&92?+$(p&!_-L#oMdWae8SX9R=3vVfUUo| zxUFTdbMO5AT?<MwE-qP<zw2E(*9qb8=5=MyF}EBz1=v-av#+UHarq7xym^4vA2U7C z$VTDxlsgofL`wg1`+~XDx9`H)4fl#0cI8x6<?Nzb2JuB5wTlA952Q|@K1vM0X)JJR z#0QD1K}#xVD3abVswbsTJ|BZcg_w5Fn&Rxbl%xgiJsTHYc$IIrM|(|Kjm<Jp-@U1K z(F!3}m0VqtZnXI*<@2lC)?CsSQ_x<J7MJZC7TjOkvTgy|Wiqb}{eb>TStl4<mHn&l zUqX(sV0f3Xpc7>p09zf(VCHm#>|xZ6G3R&s=i^&?n|C$!1#Y~Ez9XhKwzoIZH$~G$ ztWT`&tMDA=IKA8q&DTsTj?5Fk?G=9<S}T-G>MzQnUKv{-gI-Zirt_sb8KYO>*zSSD z1CRf)@3nzF2j}e+((pw7@Ux)9_k=`8{d4dfWDu3f*<*6{oG|CRe_!y(AD4fBV&x-$ z0Pox?-a-}P*K{uJ6TgBBhU1&T)`MrE8$-e~<_OkNw_jF1_Sn*2`e+K>CB6VXe}VWG z+A*PQ1ImIo;xV@}1(s@rhT%`>-Qrv!RGdj4=o7p;=M0~c>h2g>NF!yz45#j3B*xe@ z^4VvXEZHf$tLF6gynXiKSQBV~7uqV`*F{^|ydu@%KC+O!DAl3VSz%YOnqNc>&+e?2 z1=IkhaN0*t2rn|+Qr>ejJu!FVrn%2G;|D<$X}?rY;K;)Q@XO?uJJTKlMKDTzJ!>9* zA{F^Je24f=ZZs?Ru3gzCsJ3s%Z+uMx4dVpX1o2$wacK&kMlOw`v1W$`!6#~Ex-FM_ z27pw<(i@64=q;Ai4EGMtrFDaS9<$v;YqQEb9>}lRp*AG0&#U&9yQ>VT)+9yg%(=DS zCC0|+)Tyl=B~@Wz?y;(<1lD%L$PYq1cp;F@c1+p^JM<E;u`!k_158c0zpG2$oH>8R zs-cCcG^(~Rzo8+&KzLXDi!SB5#Y?s|&)L&C`=&YQC-h8u5`95!l<Tz+FXMC!HjmPX z+}75-oP6Kr&?Rm2H*X$lUliQxn@4xIH`I6J7-Mrfwl7|~r6WH!0pT!Acl`ltns-6t zu%*~X6?%6GCDI~F$yfzw+E`tbUsH8y9SxV)TIXGIX@7QAK$m-``}Z|HeKpmyyH9)R z)3z<1zavFU?Za23#YM5P6G%MZJ_WcvV6h=`4WH}X$LmI(niz<iYpJJDl9y3ILmCy! z8V9c3*u7}AAnu~gx$~&jR$BRBRB`LoD;ICwv^>PGKw7tk0vE-?2k;9x`QFT7Rw@k8 zD561<MJsw|&FUyg^bd?snO4wiL|m<nwe3DF9(q#^gU>W#rl;vw@FqZNDfvn+mvV}b zssh=D1_;pS?abDKYC#~TPWKAij*wbQ&n0Vm7aO|5ZM}uF*8DBErY1M9wmL##F5XkB zOS)`u?o~C#VsUD7S=_+ut(#k0%F3HL%`%(YH^4jA@p3jx1>2aif_E0w|3G(lYG3oL z?xmJ28Y%uAwD4Zpf)?=&s=25f@G{nVPWTw~4oSo4%HUYnXhBNLj2Urp8T8YeGUANU zQRt8`^4*9T<v&4bV2O_<BS0%ik1re`nY9hw6}dV^U|^wwKW-5e!~ZC1_N<o)|8dp> z`H9M8fSJiDPr1%0P4#v<^4eP~Zz=BTdXs+oiul#L#oGXI#(Qk+`7`7JJmb(e&@+6H zzL&}2TgD8>dH~}Y`mb~$fn%9rgTJ}It0Sx-DWy)HzNECb%WO`|>o%Ly^XR7qhPY%? zXZI|u5R%h#N-g3i>|SDXwN1Z48%`W6T-9?N&ra=UIJRcfFv!zSOPd`i=IboBrV9nl zdb4@l=2}XI@Hw0*uE*BSoVj*p;`>)`KC-#Av$3JGv!RhTYy-n?Te6t7&-lMch^ODc zdj+~zx_arD3H44=O1ItL)v0L77`ou1dDbQc69EPF^_SK?E&Q(9kb2#s#aolK4^_^Y zQ&~L+%PG_wH&R4L=)X{J1eeUCq#CBQnqdHhTws;ckuG_?WnkUK^RnuLJH<`41^M-L z1%*#jL7%i^;eu`Hu~m2O>h0atC5;E|q+c=%1ZAufjak&p5Jo!{p_g~hPU;V$U-Zj% zen&rTnT_%~@bnG952UKg{@|L@V+2Sd8E2HysbAOXo|R@u%4^Cf7${4whzoUZ7JL+O zkvfyTuAsE5c~<`=F-EgKGBqH?ufm+y5t(ENRrx8Sf(;SLe!&6Nw#?bHq;U<!`p+g@ z1TP?wb3+;Hv0dT8R@`iYVPgFCp&?bQB4|cjUd8MPy<WKJ#@1i7YPSaOibCqu8n3BC zAF9!Zuj!|ZEA$c$$EpO7cl26$ovEp>+qyKX+r7grD^|a#g{FwdY-Pn6P=HpYBw!Zi z`T^+dQ$B}5OT{cqzj<cP^9wd@rk{!`T-U-Wk8(^u@Ig6nE#*_Sq#?-ZoZd?o%-z#_ z=_PY-owpF>chLoSZn3zXy_food7gfXXE8ozJ0>}-H(`SY5BfZE|FV@UmfRP(GvNF+ ztAG6F-h021zafA4VFuTTU7&ad^S4rG=i0%`^H#mFaM#v>zlijJ_$Y<=LpiLX>3)<O zrx(!u;#%q@o~9RxKT-cCn$_AQz9_+Bf?hBibGjP%w=!f~va#%E(iW!h7>ZjM{{lZ4 zOsRQ~`up3G>}hHCB%8ngqj^-`mS)-XM0Hxmo#_SM-UaD*WTaI;vC)#oVS&y;4xnzx z3&t@Anwp?&07mE$)FQP>6}+iLDvdM@^2wAn#lK*UQ_JK==cCb$tkFB9M(<>eZeoox z8^*hWlAgynU2g>K!^CS&S1~&djKW|eb#hdMEg>_jJ1sdmDmqJ-nbDo{ZFpd2@|=k9 zAbWBb<H^bqBmAx>05_y#Bs4fKlOb6Tgs+THb0Y&)i=Oo7<qmTKo=HdJ-w2y9pJVRT zFfRk<n=#&nU_QHh3ZY@jU=NyI(=va4OHKLAz(#MAp*pM~xU=+tH8HU}aKo(5b%E_| zUiDUu+UzC17FeY**LzXJin;)r2xBzsV<CXdfQ<@@iQEkFg&u}Emfea_C3HKsQubu) z6(yE@8rWE^7Nf4bEM{5D{9d;{nwgrAqj~NgA>H&!YHIhaTJgd39JhWtuOz);!Ga1v zYE4O~X$$eTv?y~;0rmZJ6txLqL9A_oB#nG8L;yFD@Xo{T#FsASbR{h0Xw<Q+VU}_O z^bd!mZPHigRNL}$%oRCh@o}ZuWtO}Gdu4W|uDN<~W#!`PZ;R};*>yTqRd!`&Ntv}g zyF#O{$*!>#WK~sVWx}$^`V2h@_Kb~eWuxcTbgS74@gS+m%*1LI=smsg{9JI~vRkfS zddG$L+;j8IH&-;2(*W^T>Mnj?ju{W|kJ2PKNe&%Wfvckl|75}9`B#bOqfF~aJpCu8 zwlr=V;(Xv-@o;%;wK$}sWQJsuy{BUWU?MUF`i2625{7pAxkVkHvZ}RvK$w+bOU=q2 zDz31q6Yx#fP)CL}B`0TINyVOid2~U4NX)khr2!Fj@lAsRts$8u>81>oO;??pSn3y1 zm(Vykzab>E*pg^h*<!2xVQ`ADYiwSoNV_yH2Ehzf{ccb!?DbCH9Fw9h&jQ{XG&91r z+VB~gCpF<SwAvZr8ex%icYekc&h4-=FZACNmR!)7(=R0iF+$^*kZV1-oF1$AF$%nR z--&(uPMm!2h8sWl;Kmzvr<azRTW6F6ca*iBzqGYtRzR7TnSOfuzWYw^7xQWQkq>X& z{UIH$*ihLRlUBKER_6s(=4dUG9RewWnPEO+rlJu8!um6fuFraCPKTz?^thrdQ+tFK z@k_E&_uA~rGPiO!b)_YLUB{f1D7r1t=Hch2n4yl14oWE~x8G|F3W~DjbOi=_#>p|K zqs<sHmp%{K>CX6GuQNg}yYp8{x~{mQ>oQu#Z*%`F{lhbC9d<qR&Hc>op~pHEo|w}u z;uZ9b>z|i&+Ufl?Zp>!E@$3UUM=;548^tgL1$PEYW`{%wVn|SqeNW63CI^PE;`pwz zXk*JPHCJcVr5QVBwj6e1_JoA#uT)XFPwb-GE3F9y{<k>hAe~T1Ey8vto7v)#TEuT@ zuu#~@@DNVhX$Nr6e3P!xAN5Ku9P4ouW{h($ay%9yD*F`oe_@s!>j7i-xWb2<4jycJ znEqa@rW-bHtiAHeN0_}h7j0GwuX2A6vjR(`2BR<Bz?yMJ;cKg86*<`zWfhTb4~i#S za}uM&BUD00U{G2~acWVLDMViA-(}H9=oQiG2sS+<ezJkGbv0YD7@3hyA=yDeJEJxX zo%Ue#ocm~Ce{x=9L2ivtv3sH_#t;`3K!-Exv5s@gOf{F~Bt}N-R5PL(y<o1vTJ?lu ztqM=|iM91Jg@^fCmDwkX=n2pglUGb1F>+Iy%SOQzlI>7PlH<C^Xe6P}3%?uHNHW!U zn74zue-_|}2xe9=fX(ouL5;d#TG1R-zkGc!ZRu?mR-Arb@LAl@HNWxn^D@}A0b?2Y zfV@TfnBL&@2}r&`GUBrPt49n}21_xTQ!=7=FuBo=SyOU@E!U)$8xw6gnH2`TDn2xF zMrhE0u_ni)H&~KQ+Tfso5Y|>YZ71(Z_6s@uo!qzgUTs^f*}a^$|7f8`#~QL2ynP$! z%Zv3$&dD6&MBw2E2Fv&HS(z<aS=t-t&b@IiU7WKZJ9|M6)er6&9Nfe3A;3E{mp(qq zr%Z)%*RfY>>ALK)t}DdH_-zcIy1^$)gpV+PctK-RGF{sRA^dV?nbq!a)8-1EA4wpa zm@oayhg%B@YM0PR4*u{eVdL;Km4E%bu%e>y>Z_ToWc7ZGdfECdk*$BQN_F;~o|%vj zum;3#2ZBncB<qdh4&JiZJ}rIozRA=a1{LHrEJLuCn%&Pp>2z#&sXK#X_{cQWuaYnz zY<zhNHV`i#MFz%YWCmq=6ZhrF&6p~<(?+5qqY|GTs~axNZ7jk8i`{poa^)<Pv@Ff^ zz8t@Y9LkrB+w>lkEe4JIFn|3RFNq99G0{_U&*t@mquvtw{)HE^afD7TOkIZ@tUa-g zyiMH$qjd<ilk0%w91DleZid*NSk3F5OIKYmyLGfC22BBI+zHPL-Y4C-y5xKYPN7h4 z5mmqhC0B2A>BQRg)<lCQP#K^ru_fvZf#Lq@(T0SEAX}!=Cm@O4yaRMFIl7I(L7>DV zPKgogaJ$Jz{ZH3v)3w@kO8ITscwdw(g8k<BKkPNys;gg2%L-tcGVGi(=h_*<#vba4 za3bd9a!diV<D!!lsxU=#G{SQ#QmFR=sVT4Y$~1F@0CyMtK%r78!lI+YGWEl3U~klC zr<a#8Ie|G@#{3|G%p(meDXZ7z6+&E;>_xFr{A%r5dW3%IbPo+LKl;K8l8@+Fh%@|S zel7zdl;7p?Lq@LiNfwR?o~}STS#Z+jnwX7Gj`x4Hu2jy9+%lk;C{I&;Uc7CrORT#_ z-L=|RGgin-J_&Eox-VOSj`ebJQXl8(`U-?D^+ebM0zK2SjKs%1n*joso|VZbJj-$E z^p+_!)Ir+g9v9z}D0{T|0*pQP&v8BtWOK2Tx|}g8a`=)ZkDWqu1*e}w{Pp6o?z;)J zB{cxM*gF`hr%|^Q_Xb@lg_@P{i1l(Lq&xdSOUIV6qu(fV74Pi5tjx&g81O<~1`>f; zvy4*zP;8yEPpGYc@hG%J8Ymm$b|q-t=#QkKX(gST$u~J_@KuE=RqCYGDrJ~Tm86d7 z@0Ud-$FMJLVXBy9mFo28AX1DEFe}`Rw>-X1!~7nI9^o{lmnPyw%1k7*<y1`#^M8t; zNZwF*o=Tf&GV_9Rm*@vgjBcgzzD>3Q@M-y+0Cj<R(2Uax5SMFh!+6m#BS1asY&$SX zaxh$Q{~I4$B_G=$sIQYea1`QrDlc3P25CB1oZx|RIoJ9zo>SB>gkpfFt^blq^&<`^ zWNP>&T9~2<8Y~gVw5^~QoMt3ET>!bRL?ruk?Myd9Q?x92Pa3OffmlCr==d5$_>qqr zlld?)JGs&+^U0K$c#?A_tT#-|i<eCHtd8ST@!M(Ktju0zr(X%4e8uI6uw&77^x*z` zGVZ-6^X|Jd@7-^I@PUkn9>{#)fs6+ql4$KU_*8#}z8WK~4)X+;34-g|lKnx+rbrKW zi;+k1FyCs)(9DXG%D(w~JLk2Pl$H1QXVaS8ss+0Qk|{o#RlQ)B<Ycwawsg<C1&(0r zEc5JndzV+z`wcrTUsNqN>vl4};=V`VERb25CV3y39_sW!ieG}VC%PepwV=4O)*}Ng zyXxry0Z*#tM_$c1c%Z>gf=8lRS5@Kz5~WV64p4zY8GfDpV{u8Cqn#Atl+z*1G&{!M zx{niqL=h1V*Xy|9KmGGWN30ar(gPeaeSFm0$#gB3$MX%wwPU=Vvc(R(v3W%D%fn-2 zcZx<i%tA18Ltr9IWNUs!MgG=3d;0or?pu4w$pU+3q4?M>!l6woAH4v5l>EmrnA0uz zFxIJUb^6U<;*pJAcQOZtB;TRb(g8)dE;*~UuBoZnn4r;Hv|-V)A^GaeY_qMR`;s{w z%iE(>bY@71UvOAWdd93-mN1n~AC?*(<P#E;5Lq0rh)pw?8!E*a^k3(#>8<Fphk%qA z?h$uM-@uxZ`8c7;V<wr#^1)T<F<wsQEj^2;Ga1g*vwJ(~F}{TTKf!`wJPRz}V6l95 zScLP(!*YP*1#<Jhz>7rxX934!=FoXV?PX_&h<<wY)r~IP+|A*EJ@&tVXKLAQJqv(e z+7eZ|0A)aQg*{P?H~!IQhgBE|v}S~P2P8UfOvjh#OM=_VEXn5%xy-5GzyN`#B+Ufx z&jNY<B%|XwKyI33mUO}XEyuYPJH7r3*yTL-Nir*W@C666U!Dc>$BL3oMMb9MqJk(z zXk=ul;v4`kG!+z>k_!ro;-aG^pE>7g8LUBAn_HN_S1(yjoe_r<_*?RuhDuI!cOJ#S zY@2$?)h_(2NwKmvZ@wmTV|`ac(ba}5OIogbyT`><7g|dDB@cT`&Y(CWtL>ID6ODiq zzBD(Z;;yKoHe32oOAd>5@Q6V`e_U|s%!Y<d%R_zgo83w)lwm#vQE{KaFAv!mH)7<m z3CY|Z<P7a`co?_^oJA^3wcHujsJkw_dY%-fkdf2YnwM4R+Z-~hOqpoQ&Z^WqjYosV zbl)xgi?{L6g^oR)xrSJ4i;oUVo%AH9JxM0T8bB7ZSOd&MXNopptDiGO9BhQ-n<DCf zehl&QU$w&~s57*a2B|hhJHnzd?Hu6!fkuAD{zy{m3{5>ONvtVaqn|Jl1%BbN8t@4) z{28%h@{BEFGmML)$8z@>KoCz)V(lrw5#lHFvVa^5gxt?<r_2w7(PJy6E*9<6)x`pS zhM9wu={A_3wa#)B*k|Ramf;x%VQn3*M?nF(8VHRR4q!CLuiFqsvBH6=PYXC+WGF+( zufiQ;)@_c3J2V^#2U-NrnPph4Va>Lft<+S>thqKU*06|UYc|}5UuGZz#yI%I<j^I; z**c3dM;LQUaABh~aAz1ysY<&uh&_~k+_>qA^UvFS_3WM`RoP|H-6@69vzrzjUE9{S zcBZf{?$Wnc-MndN!DZ>qIfeNtk@6ZvhJAQrOJ!Aa%XTMDzQMQ#GmkxwI8ku8nTi69 zR|?OYWFWFW&^;zfV$yUnF>r#mO_)4n=qKVRFcvJ10_)wWA}N>^c5F1oI~dVP5f#ty zN&TGaV<SGcK6*7qeo}?BiSw5P-vJIEEWA^~C-K$TDj$-_V^XEhacW^YnN;uHyk6LN zr>b{4oR4jYUOx%xlNzOE6R^(scx?MBW@VlVg6VvIV<G6C#IKV92$;yN%*JiPekK+> z$X7hhb%1lHf+rj*A0ZyzU@`L7!}KpL{1e^GZ#OkJgH1Rd-va#vgL)#_?h5L38-rUo zmw;nDLzQ;6YJ*}6pS5QgjVaDb&oSq1URa!&mXnrubz=An8bkifUHLO-ybwcAs0&kz zDh8KqQ{|@?R17WNHj-fyLpo1)HfAP>Fu}4t7KjT0%_^7&dFsdzHg`;j4!IU&J5_{; z;LS<*-0J0vnekC45un~F>%Dn=y$1j<oF&u1>sZl^ulh-ejHj&KSJGJ}T-=SiHEeA$ zb?wv50~0VL{xFG_rfhoVL~;V|cq|LXgs=LY(JV%Ax-+6>2xxLfwY<qN<A}e4jCI9d zjfuZB7{|q5bt{@}lj5&r+r^h+O%nsKFk7&=8pu*lP$hH>Cp3EJOfW&$bwVgEn$&$K zz}HObF-V=wW8{9!7npmPRT0w?n>_fQDIp9tKg0sTn(Jw`V`Ys!mkNy#Cf4`#^xbj` zt*4rVnF-k2cC2(}*$L?x8VOv${)oC<&pg#VYgYH1IW)*P(}>XgKj9(9cRV)U4MC{r zqh{3N1g|gnjwyHCdIBDH{7E(@S-99ZcoRa<nc3u~LFb+bTI(_{4PV){u;suq7L~rR z%dw||%SzdL=(^q*sg$vj%AvqIVnv<GFYGpsI9f^Jm82DN3`lyb6g-+ePgAyT;pVH) zTUVy;wK<jCc~052!4XZGp3;kOy={HT78X;Q&xDR3#jwN9U_|bSbB<z%=@@QM-C2X# z#g(0nt+Ov!b=IJE>Q+!7*?f4c9r6*yGwa_uM%&3HaLyid7df-6tbK6F*<<g7fyTz` zfFH@v#OyFkwj%~_qOHeQ3T_M5UB!(&l0p6&M@afOBadhw6Q2&61M(YCFQbDo5$aCN zjtf*5F_H|8j(~Mp2uBw5Dva2E;L3yhi6tb+v7Zp}3J7+ulRA59Y-pSCAo?|Y%oX8A zM?M?rqkk3thBYIB>WF>hjNGJv;y?;xx{MnPtym1Mu3o%O88ACLK^-2YHTwpw-`<2z zCUv-~E|jirKEI;Ur`a<$qoG+G;BOgku^0di?S|fon0L7(msd-ISkO512WJ`94@5(7 z%F;=&b8wyYOc#$KJzowyz)~hh$bvbB!c%4rpuaD!L(D{MS*%b=YXnVeW~9Lwk=4TC z3P+Bw>xF$7SJ#+^>(ll6bfL}?8*7PWyrDx>tRQ>~Iif&UMwQmE(G@ZkCa!^n^%GXO zlxRlckdY(^6hxF3gxO)a>Wtyk4Cc40!h(Vn(W%AD+e|@mnKP7bC0=$8qY4qV9gw}y zC8yJ$XvZX-Nw{m0ip2Y(0uI=|0k)pNTmt^J|GA^ce5$`Fm#q`{1S>FP3%ek1Wo$Ik z_+B~<4VzDu;v-Mfb!@ML&?>@l$i|k@@VAhg(fGsz#gzy}G4u7Xnko4_G=)cbegE?A zb<N@%hg&XwlWO0*xb+qBjplX2nk$wMYzn!&UA1@N?#CY6z3{e}_RB*y4J>DM|1aZ1 zOd~%FR!k?bhU)ps0}BD>Jz^0e*v4oVtkLSMoV&W41dnE0h`+mEX*yMj=hH1sP2$&S zZoIFB<djf2x}RJqWP36k`^l@xDL1##-`w0zm&+b^{1!)FA_s+6cwDxVg6xU_$~P?^ z)JLfjn$y(@)XNVkA!OmYr1-{J?kS#GYIjUU3=eVi8S<F$I)C0d=eqX5BkEn9)N0iv zQcwTLSYd0pJ~^RfwnwUGw$2?2B!7Nn5%TU_%$|3xTBmtFcl_g!FNjv?Lf$xJl|)sO zp!b~g4efGu$kRVUd!OqQ@1EDV?nRCJ1Xx*nFQGk#E41g**Im#~0Y7V?$?U)%Z;pRr zjSE{?0}bt-DV~`ccMWgO^@-tztxK2DF612I?M<$I@;7m3XfNwb&9V5*+YztF_dVIU z=Tgdh@Kw{gb@+cf&27B?`bLST=p`s8$9VAwPN^IZ{YKo3X&o=mUcUI5J;GktIG2$o z`Z@g$^9jQoU#}xa!bJxzTD^ZY)wHc%-PXE#HMkmiO=MNbqQvGi$dy<}kcr!byR1rY zGZ<{*zogs0`K`^S=l9W9hDYQkM6QnSUAa1<5&4=4sp<&O8;y%|X6wM7YP0iKcSh3= zlO9{<F!r1(e}{M*3&LsSk#*vZIfd0pN!5itJ<@&7lo>rf7dDEi&fvS89G2@NJ9{?6 z6^mm;gt-)x$O5_?@rx`Viv5oGDP)h}zuS4-)cLM>DfCx{{Qy59o`~%ojz-ok$mVhR zFJ$9CYQ}%0hn9pcsj^p>*~^zI7H=E-f&ORgCu}%06vobp@9T~4jx97?BrYHSdHg59 zMcH5oNj%Pp$63v0D8ongHT=&%Q6%HwFk>gdIEW{F90x}Ee*+WR$)SyOG2#^683oHj z)2$ZdYq8tXS#*=9ht_D=ylYpTF8-!?9e)u5F1~opnwHe8tkjlf_R3(*L9F8jz{+z( z$j8QF<v7C4_Kt>Cq2H`cws#gQLiw276!3CFff<t>BB#jH7#XA2$LJ#q(q6qu8J?O^ zQdexLrT51~sMOIh>c|;S7PUnc+U!-BfTg|+3a`PBss?(e&I`fge5D;IEg{jGv?4G6 z^r-Cemi*j~MXk2G;-ezt<0GSlCo=tQX8DZb?97U`#-0m~Woflp%oxV|ibxWs8z3hH zoSJ#Ed<4kR0lD64^k{Nd8)E(Zv8lP#UthMk$Ud*w?B`nq8f1O$2A-L%30AHUM=Uv1 zi_v%7#x^k(#3L4!%AyJ{(CG?vS8c3~RY$~Buc(fRP{#^s5n-X>;h|wqL@L9gqQaD& zxhat;e!fZJ$=TV-;Yq%J_~^t-zY{NV9tCOV?l#GPz|DKo<}s$|)B!E#A`hS?vl3`& zU(jZ|BQ82BE-osX_GkN>E%F&9Ss9gWjRQ-MX6cZOi_>e)$is9oO_J!yepWhKJc*2e z+w_sg$a_=|A1c<Z<KrzWq;N~b)s8$yE71<qf6p9_IAvVzjnjr5vav-UdZ>ZLdte{H ze;ZfZJw-gB#LGE=c?0^z`NKQ~e~jS{PGf+h9p%9vt`(JmZT&b${_vlQJs5wW-a%^m zAMgi_n3g}#*8#wOX8xf1N&ErWx-qT}{us3g{&xP@c24Z!z)QaqFUtP|f8<QV9-ys4 z*qU#|9v5ceW_w&fUS_^@lf;z9Q-fuO5=wpy)^mJokHM%btQUm(ZtVku^NZrl4W&yX zsop4lE0g`p_;BRHk~y}t=H>nSbv-m9Oc4@RH-C9bt-hqNE+i}}u%V#HR#v`j9_LM# zlVpW(Bj_5uD#vyhmtu-0)0uXQSv(h^>2jFcqp3}&(pTmdly@~1XJ|cBjdk^U)epvm zMk@0PK3dsYUtYi4TwWtYxB4jBD>Q!YbY?;MomIeN3~iUGAR9fI=8pJ&uCqfpdg^$z zI97_ZYH7_<nnd5L7|8CcnS0)OUBY^7(T^_?cYOKf7hk~2BLY|dZ?01?QPAfx$->rz zePM{NzzPUU3;O)7UE+#eyM&GHVqAMWJ<^W;uu0_=UKZ4>ca)UE)OEqaE5i$~xklJ| zP0v&9`~f^jkBD)Q^>_|@?O7Y#zC7_smQF(U$?1-3u95A#rst31mwy~r0jq?i<Cp6B zqoW?g(v7J{hB{=CR3rQ2=}R|kkgZ#Ohj`J6z5m`Memk+ME_w&20oIpqcwLAnM$cui zj#-gY!Aj*C;hV*GQ2*f;>a}+f?L;M`SP<R$^HajYo@Us9O(ht$Fj#2F-et0N>kr=X zqxjr(!0`BPxA$H6VLJ*OusCt+sL}2HUwdir@0Pj!?wX!IIO;qxv4afhypza5haIPH zxa#Fm@ndUdcxQha8Hd;XjbDanz@BC9H(oXT#r-|^4{zUlQhecZ@#m>paJ9nx7i@fY zqa8o2L_(QXK4xT)UCs!yk}K^pPqS?I>02>8z4Q0qCZ4>nZT8Tz<tr9_;HdwHzyJLQ zHq!UpBR+pK#)#uscp3Hj!}b7e45Q?U-ESaJyHRIFo;uVhyo9=z4=-7C*M0Ne<F#R| ze)xNP``>?PZ<lIf`Pzsulh=d&6%u_j%$lvj%;Do3Hqgb_9HrsnKNyvRXrD#fEZ^Ms z!p&Sppf@^ZN;R;}JJ_?U&?Q4YNP3f9xVfir-G=9$+pxBvr^l<WrEmTEzK%Y(fBd7k z@iA(9tTz9%vZnPX*U!mgdIy8!9*!s2W8_kb5p3TBzqyi+*lFRqhab62JapAn|7e?e z@v7O#=XYTDjrRdIG47&e=da<g0Xe5o5A1mqMDJo-mUYF&z=dzWO9L;zTzqow$2A`g ziBGOuhrJEMf($(bdmb1*Ex3s-5@)kI2^o|<g}mUfnqaPHw&G7d`9wH2tQma#iLK4} z8D-+Iuk(*GH7g^>hEM#Rc<I*WTV?7WhYJO)JXjemsgb=;e_&-O97p(*y?=VRLU@d- z-nqB=K2`>aqPyunSqLkm_cSsRr2F2*uN|jP3y%#~@Os#q%mcEMwWaZ-__Nd46@n^z z_|pr7Ll+ExmL){5L|t!>{3Ng(GORsKu#p-m5>Cgi9R4g@fan!JS~>i;ETnyx>IB|A zp!cC{JhihwnTPn-6~muq3o$D%5Mr{1Kf4gsaCv*$SuR*fm6SG$f4zV=P7N3Gf~+4R zaApLJFxtfaR_+(pC>Zwmo^E>GGac(L>kzkn@(Ep#-P)2blr~?~-nnusFj}&rM1m<D zG;u#{P|)#^w^G590%>R<p18GH{5|bO(c!1CEavdTsvx{6m4#nGV^spdE1T(?pL`-- zCX{S_;_<D#+{h`+tx}F90#PJEB*3njifXYoAAX7#rPv4golF4kSlg^FCJO{TYD;Yf z68q7%P$ELq<7e>02^q`(gR*i~l8u{PYE)R(EPA2pyEu)HeCHM^ybm11<H37`5ORqS zXecP^hhcx2=O@Gd!Vh#Vqb%`{k8f?}a0?_EaHpexN<J@3TYF<<<Gk%M2jgM??SE<t z)Kv@OYFqOYuDfFHbzA1Gu!nA{YnzqZ))vtstW{MdhL{^R&)Wa&nx#YQGJg<%XurJn z$_|}@^+(_@=V~Wp@rX#1!Yq%7+U7$fw9XM<?4!R5i&=gu2hGIb9rM{(y|EWTq45T5 znrJXK-hGE$O8&@OfFPAX>eJRC{v!T}N;zK1PxL4)hqROOJRTKi(Yt@D=fAO+o#1o) z#&bCC6kqD3nP6jVQ)17a%ib?WGf&C-`55b*Ic}c1P(0Q7r-kdjeqQEx`lJvnZWjK6 zR!n5IaFV`)IQ3|zmr4FZmw|&>%aF>1+kTS;L@u!~D;NS}DBY6Uno>P?Zgp>4M+dvl z6@N)En-j9iBh)Fhp1qxsqKedKeQvY#Z0$Yoyxy%nl$z_(XR0-kkEGX`v3fN@$zgqR zAIYF;z$17{iGWOLv$_JQt)wmFi(0GnF<L`YWui(Grx7ZuTH4}_!+)%5ZFBg-bmTlC z3}+z7S*$Z<Tf%vu#OOA06`lMY{hK+fJ=Kz;j<Fc6*)7SL$vRz{ev0qt{if!ah+tDn zt13Kn*O>PlcI=B3g0L?Vu<NlGg{ib`)dT|#TgT%!@r$aSs@5&7pVR2dp30`HTaVw+ z-(SC?cJAET6`)DBuksV*=i^=*J18iZ@+^IY$kNx3>oscLP(R$dy=7<!PJk)OJ2LS( z%lA{W_}Yeg+SIyDdgPpFW^~^w+aJvLfjg~TV|NHU!*Z28ESCl4j^7+Szf6O4qGip^ zHNVTMtDCedc&#=nTKCLWy1jZ~H5>QEkj;r0chEYdQ1D{mPtLqV!kFK{foxBVJ4(nB zhl_<j4PP&W3x{fk-xlEhWA)<Q0Z?91i|ND)ZY;KPkLB3^Nz!dB<;X0N_`>H+2+v zO#E8>k`=3_Ux)}Tk@9@9TyrvRkyP4^o^mtNC~vy<nrnVI+;sSG6Ycx{`yU|0#9PE$ zQQidk7$UsK?UHPtuR1KqL+#w;YdS(LAATsldO6?D`?B=m2>s^dz4xBHSAu)=dDqj< zr<~<c(4FnWaO^3@ITBbAtI=t0$L3p$u}vL$j%|8GSs*76wE=9T8IgHmv-W#zOL5~h z3to>Ke!=+Kg3YvSR?*G>D(IwhcYpXH-%-5m&cG9IR5Uf0zIGz;PI1UDf6vVYe*XYY z!$-cAJuG~P)`_=ZS5n!-!yCjeay}FCgj<IjX?Es+ghdSZ;Um9dujFAS1Kqu;(VN=6 zsS>&6_KF{gA7xX6_;C(0;m78PA5o(_O%mVDMvDBTZ1Fvsm@U35zJsB2^-rQbmlbvl z<$<N7t*7JZ?N!G<%L&`hpOOqEj4a00oi=LW9aFdb%qEoaEzX{5N9QC$zim1T%P2f- ze>li@s@>sdFuRQ3Bi=go_RfiW#b2D-C^MetqZw6A!SmyG(T>N3(qY(~fPLycYRVby zFB{vGsarUc`Ez`WbUI_`L=Xa|u>OqiZ#;{goT9&HHJMI;C}4U6>O`^-Vx}}0jmMF8 zYN*DTStkHs8fSE!)Mo5>Bhxr}!p0;DyKQo&Z1ddBv*RIJGp(_9B5?HjbFogH+qg}W z)_2sTJ03{o84SD=i0Q>?3|jEvBggZ9Fke7FRzfw#<Q;7OL{gx)27N+*Y8E?zZz)zM z0`n8|y<nv^#^$9kyEDU+V^_Y;t~~z8W%S66y{-C^npOL@Ad8gi!{$dG+4lDCBPmse zyDy|SeZcQ;zm58t&G<Xn4XB^34ed&u)5VFED>tlh^SY4s$Rit$+_d}1k=>5k_no+l z_PvcNkL<pQS9{`~dsgxKV7U_3A!i%Yrg)AvtTr8g$k4)-Lk09emc7mSNoYgvwiUe} zk4feBG0*8HtV0sFR+iIkd|o#x!5f+bepq`N<UdogSSCaeIx1&MH~-^}hB*y(TIwt1 zilcd5pR)GeF-Aoj<1&N~kTEXSREx|^uC_WH$<dg94B6Y!CqxWNePT=SG1c<`5{e9T zN4vX^I(xx^|6w?3v_drDf?3uDn7JI0JJB#6Dg2YG7pyTWcHlXpkrz2r-br{u%e+6p zpzxg3A^NE+3!dwZvvVAodz`7?Km+KXtOET@WNWo4hsXh&tJ@r&$xwXS1*`&!sakiT zf;Z2{E{BG~ceVw30yN;W`_AZFlbjwb$3!G@Oz`~it_%*&91~KK28MH%Pb3ntF<Y45 z<1CZ*lztET>(tXSTeQMAC8s@r0e+9)l27EBspnYckBfv~(2+ZSO26RT(dm-I5emQH z#^3H2Tsp<n2OeYNG$?HSANW0lOQxL0IP8&h0I<V+a3;Ut#?dLs*H7{bhQcqn#p(Ar z_lakEzaTw%E>jD~O9<`9`GnkG`hW5Z>Zh3}n9u2F_yt!;JaTrw;2$Qj2yhFV5&VLS z*j!_FD#H#QacH~X58%BL?fgc+;PI*10}*O$Y|)1vy7)Kx1@}$O9t{7ed;|LBI9p*% z$`*&;ykZP{IN)eU`QPdnY@Lcd7#!%|AkO3azx&N;-?aRJz77EPGxG;sG|C?izd2y* z#<>0u{emB!6MH!D((lB}S(U6a_|5&MVGp$N|3zM~c6i|Kli}=1rZutsM^c7UraKuW zrICdt+*VoTmu;wOYOAc!J#9`*u-RIWnEBUtm8$+dgBcY=**Rv5l#_|&Ke`6_k63Nf z<o-2$i*r@t4T)aGfepD;bNj0D>-~!5LLKVJHbz7w70j!x8!SwYfR$Lld7Mdf7vS?@ zI-{H!;CME156Tn$j!FKjv~B@lW^;>$y2&cs{A{|)SsmpK3VPg}UyyFj&P7-t_9m+X zl<L8{s(BWyxLN%S=T`$>4_-e4AfX<p#w68chHZu9iQW1DO^!39{JtQdF{^x_uc)@2 z(qE}Pu0)V&lT%kIQgY@t)eZDCdicuR;;rD(B5I*gGBb}r9aZ4Ch9xN>G_s*4H@Co| z_Vx=_s2YSa@!vG0I6b4lv(PO(2FpbBpX{SsFeikwoP<(@47{`O$Vkc!v^TEiBI7TT ztfN+pR&lvoYV6#|s*?7Zr8N<i&9e&IZ;wwm$HgN_sxDZYI6uzZRZ%v_oFpEu>MOq? zBiUrPn^NGQVe+jV<GLRBM$Dm{J6D*Vh6HU^w)^Ui>S}FaPJVTj#z;@UM1Ot7RGt07 z;re92Ig47!pJX;z8ejoobmYt{`A}8W%;<#Z=mb>UJeUv@lYoH~V87i*j?3)un?Ylf z!}`uC&WiDMZoS!5Z8b#)B80_XdOVCS6E~%1yXOglm!ld7ygL9dTBR&|oHN(&)@!$R z4JB1oZ4x$ad0~qQ=4$cqby9h92g<|N#-K!x7$Lj*E;J%<9QI1MIDyBv@%~GizJv(H z?N#N08LFCaeRWz{rB<tnuPV{7T;<J45mC9hMfrbyOA}|(zVcS32}WoaUQzcnc&*fw zW&^KUBmMaW+MJxh@tVrU|NodztereW?}NU>`5V!TWBD7WfniYDvgr1zO8+clW%JC6 zO3l+2&fnID=#jK=b^lF+>Fd+-^7``O#^dz(5YCR;2HDN_97)bWPKqq0ue&RPiC$k7 zU0Ko5UJ-Betq^~)v{<bzmWLj)4AoT4(<)Q%NiQf!Ps?Q@17lJF#Q6x<a<2(n^Ni;7 z^$85<sIH7G_ZF_MlMUWQn=^7zp5dexJnP~J(7q#UC5Y9PEtKV}lpH9<#ezW{9vyFs zPeI1sJdXmIO0A5JwWg#M=M<LGt)UUR@L-j<pErUu3v#rfp_=fZ7%yKRn<1gFK!VYZ zQ(e7<@0f?zk;~T^2A&J%fK<w*&sJ2J0{nwjCR=_;M1=6&{NlTkWci-f<cEu+XILC? zFNI#nBGTD%7jYJ59`uDf7iU!OZ&PKJRmWBstKBMOv};C0ZPxpLi8Up~9u~h&2xTe= z>WKutR-zu}_hWf{m3F%F%IeL{U7ZM<yq`Az@{6mSkd1P9jPFg5fjwAp>RH=TR=cRC zt+j4(Lxr&M`|rj3fBu;^e~-HLsQW@ZgUA3m+wcejei+yaz7GAG)g5)UGgsB7%xaQV zxl!wZyU#y=-=cz*?u%HMHG_-nr<dbdSgH|w$>1{I*Vw$ht-q&!|3R8`^eD%HmA0Xb zHy+SfnTtT-X~tPk|2p^p^?T$G)LQgLQNdfRK7r|YLLAES9nw^CB#b*Zk2x9GnR?jm zV5eWl_AXQRE{|=GU4g58fqK>g{{CL|3M7!byKz?|J3J3JoTT^Du3eA-aU(Yhf^Y&J zx8HVtUU^OTBCpwQIrbSftwW79jje$*-BaTO8oK7T&rZfaab#9P%22=0lJXdHjrU>q zpw4TCd<N(FbY!X3Iest6g8GU|=ledYPWOEhxkD?<Lmv0CFgte${JJsV2N~xwJ+l{5 z1+}_nKQQfRWUlLQt8w270b)$LE<8e~iwM`%G%jvxTHHv>Cww79%@!Z;pw>v84yPJw zBkXl`_Kf;^@xcjSu(7qkKQlb}+&9a_bKm|vQc2GzH!wLjIR^XBX}UPug2DtV_4C)5 zs#M8YmU-uU<#<=%2u-x{^2jfAh}^_z1J63*pkGcdNyh&wO-hPJn+#L2K(z3c1|WWl z?`jJPjgh72$t=k-ZGa5tw;@^;=eKE%m$`++WHw~Rgt$513|Nri-ojq!{Hn~VH2Ar2 zbG$iCa~cK)8pIdy%KAGW4S9j~z&myp6vWPQV*v*9@8HL|?Gbz1>G|wPx8XP2S$Qj7 zeg#ZyO@8Jx-G0~iTh4Tg8970J;k>}s<%lhq`b@Wv{@XL%AVUQs>UFF;Ac)|vQ|Q>4 zZhD;QHZU;7nQn2g_j%wM^mSZJ;^Z^k;-)y$Evfx%XS%VoSwex!b3N0IxXyIzyX3mL zqi4D`HA!c>tsjg{xo~jq>WOE%!O8|Y;<An^JY<d|-GqSC>H!aZT9)19A0Q%fr2DYA z_y2cixkUm;9>CE#pXHWxwzJ&U&eNq#eU{rRBR}GF<S!-vo^uzSQ%!p%sla3^NaC+_ z4Sz4b#cy1OA0C-S7x8DIFF2odWm|FW4|$b8pKQ{^ruAm)(*&P@n0RMxr=k<AsdI+B zGQ5i7+>PM1DxBr^#kjNFswSP~mWH$3$fUE}$fUE}#?<BTAj1nf#aV9o;P0Q$IR|>h z8FHX^TskoadV}Zq9OyRCr9Z|t39`hI1D&5#z}6-#Fm#$E=s9IEOIqxWNeZEl+EWrT zHILnjH0bw9Y0%%0(x4Yv8WyPSSsI=Q-BdYMB6I<J-o6(CvCs9t$b(+~zsQ3QokP%q zA6XRO)Opb9sdLGL-Y{apS&i@hPjZ}pWKqQ@U)VCcUud^mQ!}&X6_s063CR~W&z?66 zx#Y952aC&Zni~?GkLzSYiGM_Ge8WJ0b4W&UT2e-gO@kcgCB6~02@L~7^&y#s=7fxB zo36?a+07&DYW~V}9SS?n^*G~UY_9FE$K=`;aQeHM{xDtM>Ab1)PTP@x?&m4;&pmsF z{BvevqNjO21Yc&!c5*DDm=tb~OsVfXGa-mlW(4|2XDWo-`5WG!$dNulaZY<vANdV? zQ$0xV$d3qeyN<6n<yZ-r_zVm!$?41Va6pS5V8zW=v3!N;q0`!=HIK!4M{G(=tU5U+ zCb_q~ue`i3sXQ%Rr!%LOm#0}Z8cSM5vKqf$%U^|6v&D@aG(A<NN>vT@m6rCEiZ}L^ z8Vq=2Fx-zXo&PbWi8!;!06vZfA5RYQ)=d%QZ8aN~3stkU_s`2TD-#mSmf(nv8K-5k zuV*|RwWu`Ns5EB|+^_Ad5@>0R4}!ddoBR;u9W*04pdr7|uPJ!xyavY_p#-s2Uyq5c z`q~v+#d5))Cj|f3aY9EC6O>||949pKyEDfLr8>?J25n6hCxpPl6NnR<v%B@*)QC8t ziuJAUkBbwk0v|BhKQT^-%>Yxy2~8^Rkn+y*Q^g6{NA}TpoTCgql%2O602Lc2E<b5+ zXl!h-_fql6wDu>zd9po?@hutIN4}TJvNM<SaK4Ap{=K6ta`+0a!icS;aX8nQ?c^hD zpSN_bF^y|t^>m=kNST_goyMPG)*)M6GYpdn%DAJg7o{>vEPbGrN@tXHR11G&XOx*x z$87wr2EF};^G@tIdSnGVdSr`q^vJdB=#gcP^G?t<&Nbn6|E6<Iu0`d`SmoDBm2Y8{ zuV9t)T&_5;okiiniZk|1l0S`}N%HfAGf83~FP|6WSS{h1>CZE`e%yHmG!yv0dIJ74 zfq&+Ey`DZkS|3~bPL+3kOnvNp*B@}c>np%_9Gj_ODm<5*;Gdl#C-~`e$O(>kR2nDP zN9jngv;E8tIx3`bvR_7jll{W>Gdq4`I3v7|4vabWPO?rh`T`EHQ<~wFt>1wGY44=; zGpDcbgby&U!anBi%C6zGw@8Pgf~=Xvlx}lm*I2nfvNLQ&+j-aTS}^A#AMrD~p57Pe z$gHt?o~p5Rn|N}^Kux<>@O4ju#@W7JobyKijr9mxaptSULCNFKd1GeJGo15wvZjxn z^EO+=Id3}_4{cA;mWZp8Oi>tl=^VL-dHpcWovj6yKWDnr<Q_pHo#|Q<WPDHlf88G2 z-9KG>6q#eDZSVSV?H%C#L%8o*`zPgfn6AlJq<jz4w(346j}$wf?{3~MOvz_!cbY`+ z*69F|PfC?AElisxq)=cvrbb~)WIGYg2HkXdf~JE`{B%;roN2*poR~t#3E#IIcZp1o zIU9U3Zu6JSuA})Zrh`s3G0nxaunkN|e*u1MfMCeMS=`JP1v|YiSm})1fc^4;?m6)> z(ed%oSgi3A#EN3#`4?bi$P2d5Z5QMP!khKbA9b#1cGuZLE?X@-h|B3N%BA!&9KN;j z!sXYt=BDRfIBUT|j~=(YOjAKgoPSPFb5%w253^?ZEV%B1*_8t!A@y0c3zjqmXBA{7 zrrJA7DlOHmmB^FF<P~0C#d>0*4aYR44aW^<!!#o1{1v{=4P$u>oZ7E}*|l+ot<sD= z(TP-PWUCV%zv8J3U$STE(mi>ND`9O&2#tscHN^y4nxo=kW9c({mMqz`<mXk*&8wO( zpAojZu<!+AgkE0FVABa9<Q^&Jm+|~P1*K8Kp+_F!aO;Es@;l)r?kjL%8xy)6%Bw-A zn-O6wHH8}lkN>B=Gl8?Ks1knF>-}}7yOVU%*=QcwCWP1|ojojpCWI{@n?P7XUb<f= z4V~_$7m@%X;1(4b#brbo6=YFRY!Or<CaBR7%|vIIaWamK8dT5;j&W&_ApQN%sk-;R z_xinFAo$JqoA2G<eO0%XQ>RXyI#s9csk&8@>S7;a9edW26?5vw6=S=L9cpYMXQTW; zPnD5#0fb4QtnQ@#$n=IetLFtd&#XOS*35+`NKTABB(K;8{gv&V{=e;z&OQF$v-_%z zEwferoJrSDw0B3ROx9+cFqw6{r0^TxVv7C69#P=FF(5FsM-``iVPJCR*9EdZEucI* zF7~4Nb3wbz>Exu%yX2DyFZ#2zkBD(@0&#L)M%b5w6aJ1!JM<~zuqVNdepFCyPb^p$ z&J|C5^*`*ag7OO_ZW3h<xH9DoM>D`--tGWzYmSJ$sAckQ#-EwA)qh$6tWI*U)6?i1 zmKjI5L!t`W-BDVUaYXF*_M(DrncbS`T%=-aZ@Zx2yx6QWXU5Jei2eTTMH6Psm>}<( zC&&I^K332r`a>YKCUbJ!>_r8W<X@I~N%O3EsbD8CSz$>(H5k)*eG$lOte1kp;^b*H z<EKs?Uo)-XTt6z*b58J_DPC4g1-~l_deqiZTYk`)oQUx&GLP@)D=h`rWFOP7c)dtn zr47Meq@ipe*|mQ43D#V-`ZS@eG^ohT64MvS%)V7;u<K~&PS;)oGt5T@ej+k68leK2 zIXRS>Wfha^E}2-DCNjxA(|#G~?svSo&igGg^xwTd24*jNe}OsDHhO=dskZO%{vyVY zr@Wt2y<$b)&&hPLOTE9;6vy7{{bi<#Go4(yoKh8g!TT%BjDoYge~evK^k?s{G{=^F z!uzXDMalEtKh_kM40!(pGq!Y&_fIq>rDsA@TZkTO#G=*tE&9q=ykEXl^BeCkFeloW z_ZON3-_>&Ii?B=li1!y0{;c<xm`27Lm!{NI#BT8ZGE>L<VHaL*=ElC^{S{_)ft*h( z_>75dFX-_8O0%xyMDMRQlS=k_|5#I6@+a?~V5XNAdjCXIS-QfUW>V~pNtrH_G(EV@ z)T)(`1QufRS@~OtZ-d#!|7z1gc#l~_$_+eUfWMdYt%TR}d<t$SDZ2>SXf_e+Ahi&l zAV$iO)a}Ib`suV(d#WqhlWI=1wkI0qFIbq^ur0B=qrGQMazo;Rp5Erxj{3wY9i7{{ zS~qU$AyG?5qBGUr+}gg8+@}Djiz8}!O&jQRDKgDWR2nI)!(2^*)~=@Bwq(}@J<V@w z?C2omd@$G;W-#ZcHcGsqK7vyUd^^kvtw$zkSJQOhk}9B%S<~8{>giaK2nqyuSK<n- z)oViaBGBnF-5@3;PtXkYG=?<CaXf9H60Ou*no2_Fi!t9tsjlwUj`qZY`uX!09GBS8 z+uGKgm_L6$QLlkk*;%9|yD2Wo-2-Y#3Qw8MO8Tn_>o6_+r&BU)fJAF|BAMvvN;ao9 zC%djrbhIQK$ucSL=_r9o>emJMc0@>m7VYA>U7JW+E7{wXYQHYg*wxz(0~uws9@uLI zuXm3%TlA`jI#Hw6!zUdeYc}=tbgnq|SfpTmo3>hgQ-=gorIA56)?7&H6h_gj_?PzC z=<({#1O3<wH>HkQmFjNY2(l!S+HHYY!nX<jyMYssuSa1gh;<!J2;M>Mh2&Cd0-{SN zl}3;nNoP#@dI~RW!7nLY_YLv{&;+h<jo_W&e=9KBz(5*OLN)_Yx@QYr*mcr*gi1Rk zi5EOK!+DOb8+oPT;@XMboR+>D3<PHfLGTy;?W7!+SIQJ&lH|xS!CiW<#7OO=j4r|* z?*}CaP6D-6`CgbWfSm-k)LZhkak+32MJE#@r3l|h2}4obF?J8>JHd7%@RRt2icJbz zSi1)ZB4q?ip|X@F{ZO7e3GYxGL>f5}DmaL^l(v(uB6W}&2sM(LS8$b<>4JLFra@1a zx}-4RiG#t&xiY=u1>AmYD6o&wj@bm<cJOpmq91K(>1|8&cBiCA_H0TeT9CcniH<IP zXioMd6HSC9=_t*KEv-G95Ys`jL`!R1symU|+SJzDjAwI4b8E{sB=fvPS1Q@vo!Y#C z4yI4-$<6BP?&;{llR!ju_7dCFwk?soHrd*i+|ZUvbf>zmrGH5F=GN|>)(yQqnmXCu zOkA4)t52NVzAe$)-j;<p;-zO>XUE2_Wap;VrbKr~OV5^MR|=Hd+7cU5iO#N$?o?AR z15G`{3zjX-&8<C1%4D04DP5bB@<b`AG4Y%N;#eoHL{=Ot<I^!~TANbs-Jmo&(eWA@ zY1H@(mfJE)H%G&vj7}yRCEduFFP8}4tl?DhCx#wRV{QUCkdifz!9O{M#aNvo6|zEF z%#5&<Hw1BJ(-km&B|1hmv(It7HLJnGYa(yvCt)Kug}12Fuq~})Ju|_+p6RSB%;bI5 zY<3mR;my!ogz`Kl0QC$4GEg=!b6Lb1&=S_EmT?x}3Wm<(v1mV$Z-ShJfM{e`TxCwB zlbmKwH)rrJ{4Bc3+2$PcX7E0b*}??~`?r{j%*EysvzG7DU1lyfSD1C?O0(W1ZGri; zd53wY`MUY2dEUIs+-BZq{@#4n+-nQXd(Dr{+s%i}@68{~`?2BKZoXyy(;PIPFb|qP znLnC-bC3DFdCL5Qc^DzmWIjL(eV^|6UGqKj1GC5cquFbIjd*z4{LuW9`2s@ecjklU zN9JG5zakd?%e-LTW3HkjUybl+qf>v1R=P$7QMZbqYY|evLBL;!P`lo|m6Hy?YVI~~ zGdG%>%+2P2`K{Su{>|(+&ze5-Me_^uOY=4JEAt$dr2EXzZISs8^Aq!o`5CkJpYj=_ z5?gBSv}HDK%grO^OXkbWdUu;g&12@<<`(l!^KSDHC%f)6yKIGd!j8crugX^2v349g zU}~_pn#kD~lk8-^Gcwgq;~T|w_DGvBx0+9~wR*ap!EWAJb~a~j%&|w?xmYC5V?%E} z-*lRfrC<YJN?n8{-4YJkSjJn274|q*(M~WQGoQh}=??SXd_a4pxzF5g?lKRUzcn9b zW&R|4vTd}d*j4sa^SE7YPqU}9i{VUrmR-Zi)aP(i_PMN2oo_F&7uvVji|obbNyBFx z?OJ=Oz06*2ufR6`O7<os?FQR~y+#T<{*88%ZM9d~t8E)r811&hcG_!fm+iJaw%1;3 zx7e+Ao4w9nZ*Sn#iyQ6R>`koD-@^LaJM25{yX?E|cKaUtUi&_Kt9`${&HgQ?SAWpn zZa-u{Y(HW@YX8oD%-&%?Ztt{r*}u1+u%EP_vUl5i?5EjVexJSHK43p%KWiVf582Pz z&)bLX7i^#XqJ6}E$v$cyvtPDfv0vqDw>#|D>=X9ucBkECpS0hw-{ecxyY08_cQ{k@ zyY?yjJ^Ou5GyO-q*Z#o%(EgMCXZy7M7yGaFNA}<BKKt+X$M!$$PwX?CCGk`HGy8M9 z-#*KEn!haRZEs~JxyrdG&-bo-Za8JRJ}+Fp$hjx`=f+dyxnchNrQTiU-A3mwYH;r2 z1<qZna2w_?RXDhdefSdZdN@lxoTXY$!~A7F-!czpnTNY<q06_-!&~OzE%We}d3eh_ zyk*M^PwnmM&`b*!xXcTdIN%GGIN%GGIN%GG1n~~|f+Y_4f+Y_4f+Y_4f+Y_4f+Y^w z1xp-J7A#TXH7r<isw;2F>at{4SI3sNR7+2Z`g%L#>Z<nRBAYw5w7cZXeKE^@G0S~1 z%Y8Af4H_0Sdh{DT`i&m_Mvs1@NB<NDuVI0!M#F;TCCwc@jEtMKyhW!hE@Q-ROEquk z*jjvg1C6t=gaJCavA0tbEN)y_+=Rl_mMT7d!Lr2*9rz^;u69d3HJ5tuOMR0q^-Z?a zH`!9(WJ`UME%i;d)Hm5u-(*W&lbs4rI&w5B+B|FZRyVqET*U)dtGW8r)vL>{OLcYB zxA$)DD(z@bIZw|P7ZUH;)Rl5!Wi1`OT^dWhul4D=TeoUZygPMms@-{0qMN#e?M#%M zPs?a-@7Szms7J~Wk1s>Kt_<gsGBll(q3K*1>UCvkLM_9^cP5)s^(|e=rs8CMM^|%u z@doEKIj7k<Dd)5}XQOjAIj7Y*S2^cu=d?Lzvvb;=)8U*>=Un5QF6VSRr^h+H&bih( zTb#4iIoq6bojRr6T7jOHF*L>o(OoyT*Y~uPHFvb3l;ewcrn;DB_24b(Z0qgDEoBC_ zIVq`#Ywc*3D5Z5zOR=;jj?kHet|f`qb`)1AOuW#Sct>44j<zIF%4!j99fC*&bJ*6V z4);*PWLFVLUDKOvBR0N~X>LzS@GS92mUr{4^VFV}@}}M{l+>ne#20UaSIEH}ROXp@ z$Fy~9Y;8)mwRcG6Dx`8uk+p{9n|s@OT07e$V_9?SwXMy9by-WB%$@PYy+n<?%kWl0 zj-E{&z1_@~c`OkzhFcmytxR?@3EmnYUrxb+zd~vjJXHBw1<#e8%%j^yB-J-1yHi#A zsPagk%QtQ7+(hLhu6hHUcy+2LOgz>HM9C{9Bo!v8(#I&eN|cG@W|46Uaok2$Fxpa^ zJ0h4BIu4z@O5?|e@ez!%*Yu`P9y;1XDCH~|CA&8{d{di4ze1NOJVp5GDL@U102ZHC z-`zcb0bLBIp*)F_0UtSkQgjOSS0_dG^=@uyOKtU$J*>XC$jW4MYpRO{fNqUKsEaNm zAd0)hSy-9eO#5lu@wiB32A;)LU8#+zLga0hbW6&bl3nmmvaP3F`$4ivIIm3oJ-uD+ z1ua*$6mehKs{d^~w{o{th2^*FfHE$8?ro}fL8Y!<y-nq5ab=s6O;TWQQ>m+JZ_}8x zdJ^mq!n2_ZiAcf<1`UT64<%YrVjV4do2oYTwr@;!^=@uU_V!5XutGdk_qI3F;iZE+ z2%<P}${VZN79SRk%<APQU+lJa1^03G6cb~X_bvRp?RW7%W&e%TvWY@;5Xl!eH`$Mw z*s9fQE;N;G$)0xR{St40%<d7=#8?d-UJrRKc_t)jD{~V)y~k{qPGW8o(QQ5~QrmpI zt#xD4d=)jc$Ly2=$?O&}ZobzoAwPr>Tg;DW_XXxB{5P2W{4X@m^S{XamjA`(kNht& zFY~|Dn(p2W-L|;9x3k+;^Z?F|qjmumq?S@w_7d{XZV>dW{2G^}!N!<>c|~F6T>}5S z>ENGNqx@sn!aqA^`F9poSg_;A(uDtn{vW0PyiFoRsApxD4ga-hZD*ogU5d`rhHiQT zTGXw~+wV1>L#KEG&0-IF&QH)v4xlN$Vhe2rTEsN8gn4KJ$J5?xn73cfyu1x)K(upd zLEP9@Eg@ELX2DihV!>Bkioz-0o$lSa-d*k8X3bet*jD(7!XFm)7fo}x7M<wbOT2rd zcl*5iTjv%p^X_fl{hf15)_HfIb4&em=`H^GGp_v7J<cuba(I_L>Ytx?H7h&dp5sfr z3-?Qn;}?0?y%n+Xb^dvScU!!BFYW(1Bj@pnX0lT?3eis<u(y~O()5wX(78m<7*6ZS z)_I&>5@|D^N1u5Z4di30r`(aDodi0LXfK}-{RIrrcKG-D4me)`ecY;mtO-Ob0+IGV z7w!H;^!VZQ_rcoxdh~5s@@zq?Zbg4?M|bXIS?sN7#&@8Xe;Q7_4^8+1^EjONV|3wX z(A|HHK8@bZiTR?ddL0!^chZv*tU)v&SI%W^pbedSJ1YYBqA7nBiIlWAm?E^!i_uiy zj^1B_{&|VHo_Ad@BENQ-Vzkk<rpLY$E7Rk7I@exmdhNT+pV4uP(NZrnzq9W)FIzYf zjrDSK&~7(}(0Gf{Uav5}x9_2coW#?GcAfcyeXse8J(;Js*elH+vCn(eHu7|lU2pzm zZ#4rdFE{XxE{5Lvb$CMF1WDf+PhYmIhOA-@<}F+mgi2o*O9o4S6>gKhV_5?cc`WHg zx&*!g{B^9rh=hr;>T(jkD2Md_0@gW%mQkL3q0Qu#^`IKcn8}LHB35lyu`+WZ*cT91 zL7fVaOcm6$030i*e*yBU0;&{Heg(8DK+04=!2+aKg*_g30`76RHPlV&QO;e=`bRoG zna?p`$IXAUej;zVe#h#KtmgcY^_wV941CJriX5v7no3SXqMy<RtI~3*v|@cru$@i~ zC57cV9d1Bb7bC6Y(n>n{4WC2OR0C7b9~hKAfa~HVWiF^eD*0N3;|2FlbUIH3VDf^U zofGSzhB8JtPKfFzFkc|I;8#QLI#%zp(~ugPUgYZ;q?UK23H?59{`9$XPJ#o4(n~_l zjPQwa<npCsJB4v?ChLpK=<92Sz&RJ3C@dYKj5D*D*Q|iU&ta8uB=w3Q<?^LNuS15; zK{6fB8t1t>-oAeLQJLu_CFrs8-Qp8jNj;xc(iSA@;Vdh6snd}Xu1(KmrFI=Fqg~7< z-k5T8V=xm55%9xBW<6`NJ*=^Af5UMYjE(DQA{(UsGctN*jQ;il5f?KKNWaZ3*+qs2 zQYV5hsihBRLSDr>xXAyQ8wpq^y&g)$;9&Ne9q#o{N<SK`-Hbry0`hIpq23Hcqr1HB zx+5INe+|pd3de4~`iITQFl(!nU9ImWs&%%pjy7&$&d{N=1(_GftiU2yWXvjJY>`oG zI^S^m4j7+d-fZRU&oj&#(N1{!2maUC-Ta?H4y*sgjML(m(X$aMPC+702e-L!Rs)b% zP%^p>_wn59+Gl*TjCIzY#C<Y%BljuXa>{|&-^-Y@kgE)c5p;<u$y_Pc^fKxj<~<K6 z7RBrv7Hr<4c^^~1gY%I3Wj??xMg5)RpJ}RWGS3Kjhw`1J#bm6=)n=FZ5#$^!hc3>s z0{<G;-?dI|ej;4z>{mq(T!e&8*8`{NTwC<O81;8LO7s+K>g?_`l~<>_+M%1o%TFj1 zgA*(DS#%=FTWBtsxaibZFW66L94;v0pYNAK8#$KY7T#4%;a$b2cqjEOu4TM6`8MyP z{()-+?|{C?d#NAsHs%Cdz&oXttmZ!^qg2g@6~CRlJNN+a2kvF<{(1Xb`%(5%uZW!# zyEJwa*SliBD`+U#RIsBkQFv|PqebTwy`$*<q9=-eRCJ(tT=Dwimg2UOI<A=|b4&hM zT3@=TbVW&B=}l!<m2EA1H9kMy7(YGU9`A{NG=4AFBjwY|FD<{R{G;XfmhUXzV?R*- zqw-(y|8j+?7*{c^VtU2#KoqEYRa{iDzM{S21}%Y7%3iH_SH*!bm17cPE**30n4M#G z$L}5UpT#Yui=?c|(#m@(`zm+(|J{}UT=|RGO_jf|npQQtYChKry;fD7Psrs}Emb}C z169{?-&A#b)u*byS+%F?H&w6L4{$WHVq0BNJ-7O#>NBe^sa{vTsk*EB1J$3XexmwE z)z4S|w)!QmSI17Oeq!wOv2(_*9=mnyZDaS~|4(iSnKQ0%+==5l$GvylXU6RxKWY5= z<F}8$ZTwy1zcc>%@xL#vAOA{CtY&7-Ewp0Uz&^WkU?06}*T4bz_+duWKJG7aGe;fh zHxsxg@@4T_Qcc30!t+$pP8&Etp1q906A7v1p2Y29`-$yWh|GZqEj9(@7GHYW<pYn2 z_5+NXfkVt-i-2+fD9^!9bKsyFIH$&}CG26`Jy@5`5=`N-8X(pV><H7Xg&X@!4JGaa z>k5Uq-(!A2aRMK+oY><OuN^=+Q?TU(g&xu!09qd<lNRYTm0D6ek3k#^`psoL-!pKx zxp(02%zXoQnfviSFmSthkmt{HKg=BD3#98K{};I*VF%WC2X>q95A0Q}s!cHvN=YI0 zl$q9%_>UsxmEhim|8X!onmQcAJ&(KI#O?juw2OU`_%YNv4xR@!*GfV}ns#w_bKgPA z*<tRu=6;fJDCNr)lZ$cW5?ag5U&?Oe`AX6xdESJZ2F?5$eE9m1;!_XgJGCbLXd+UJ zF+iOHqy)JHQWAF)P}-oe)JAZ+0Y7*FX}^sP>;S(wH57<-)G%(}gj>(uLVPdK?}Qh3 z@zt3pfjvP>87HL(t$>o?K8jNKE{)<XI19c3p0mN%(M})>1qA0Ewh#X<;)EJiN{vc< z0@Xo`1F_#IJt<9~{u+wAn#a>2FlH4~BWVZW*>SXP4Nz(ao`Q1@0<n&fiQPzWPl9lv z%5;zKN~QJvj@H0%w5~JVl)R1Sn}PK>rT>x<@mJix24}`I_<g^fJ+Rvz4gT}ErA{qD zy_8x9saG916$7ah%9P<A1r{rTDy^HME&)}9qk4gOClGgmaVgl<LFqc=d>s9&hB~Z9 z^OSnjp}UK$pTxiP>E+z6@5owDBp2u<;C-Bz1x3IR9(Da_Eto=idSuY+h3|ZNEDoyB zwu|V^(mwkcKg+<sl6#!;xYXe}t;1Tv+6cP=ST_@PH~#1F|AAaDQ_n;AUx7L??gzny z7N>vr0pHRu<IJIjDiunnDoQv&2~R1NrW32JPu$7)8|m31Z!V*Rb-3C$aHYLkxdn@@ zxHltv?k4<UW}<!ch%XYhhp=Db{)$_$>xV~P1iP2G|BU}-U>~BLUm@LJczzZC09-Ha zd>@$KkNY64^CbBNd$9_B7`z%3d+EKE)OQ@Yr56O8bsV&5MAitlN$ytC^-{WExsB(W zk!#Wig=P;!5hvSgMB13I5&s1D*SU9c?*`U)Nw){gqM96_CVkYTkDByRlO5FLc52c` zP5P+GZfep;P5SKB(0&W^rLElCXw~bqM*X&r+6k9dBANTOFG~%U(~`$g+RA}vz^)%Y zD5B&8v}!*kNNXOj_v7vaE1`#LQ^V}|9w>S*EqLF+)5zhck;A*F+Z^QYUeZ;m{QWv% zJHhoEgnbkIz6;dvL*1_+5q5y{3aI)tJW=EO^FHm*M^b)*l#VZC1c);R!HJ}61d?## zW!&p%3CA1zOcQy8KYB>l%e{>_(H5jn-vKN~dEt{dn8l&|zBCHQ;gx;ncT#U){E_=l z-2L#%i{yWa8vGgeWm@<U_bc3gA?#J+2L|qfcj};c4HU0|;(VZ)nYrVm1D2hAP~MH{ zlYQwTt6g6Z8P?CNRpgbc^9<TU>bsJ=5h|{wZ7u_ssIF2^S3jwjn<)f!>Zcz2sRzB1 zG%s<#%zcRa74BEL2O=Ja?ykM|gO^dNJi=VyQSPq{JVaYPO*`$CcCuf?eF6#;V!32I z2N#jU^$wY%OaOKuUu0ggoYc~0Yr*9*kuB6gW;gqgceS+PRKl0z9;bEON18h37RPHk zng7&*Qw=55=xoS%3=Oie0_biOJ>dEurK}{Z5!h?Nh|-i3oP?l15%x>q{ffIE>b%JP z68E3EUj~Ci<a-7GU$|f89`L=tO51207|Z~ImH>pcKo@x_eAk438};}l?ytE2LSGT- zCu3ZhSp|pQ!~JRQd%5r9zMuO6?$2-w?PU%^ALN!f7VQj$gjbdW6*(_bIZe(_QM$_P zN#=Zgqzfdu)R{Fl$`%>Ux+HlS3H3?Jh&y^~IkX8bS_Nqe@zs%fA8F=j*$PF+8fmTl zTDr_OrA7Bs@_u@rl(N_3<=Wh}_gW|?BTWn|wM(%iYXFnmfd2v3hCWDb<!KI2GkB6U zxuBMlU2h=gI53fMQ+qztSq}G8Tc|JN=zdTAxXurdZS?K~+Oxj}7s)(e59xx|kTJ=P zNBc#B!FM8Oq_4>=qm7(0l8Ib^Lv*%NsIB}k9Pavqybmk_<2bjBThqB$GB%&Y^Lp-w zS?>yF=|3gzXVh~)?z6ZRVa_p{bB;<c2YWSq-C%wS9ezgKeq8w`e0q+_zN|Q9h|CgA zU<NrR`y7)shgG_`dB8;KBds3IuJ?ks)OH52*K&&#(ea3|-P|%lz6>YHNH?1nH~<E6 zsuUvxerbt7CLKljGYDIW+lbuLK22FN(gpH%E6>-H_i<Wj5Arb>xefx;$<#P9HSR|- z8IO1SQB20;y=kM^{W^;6)PCf8zvx14J|9R1p@*y$p9w^I3pH>xjKk3)J^hn%wDczF zGs2tH+g>~{!Cu0bd)DG!I#6#fd-ZvH`M?x=#Xz}TNBEWa*AGll{*-yhe)a7ReSM+t ze)S1_=erDg2v<w4efZoAOfVEpYASfi%vAbSzx;!BA<}GLpdk^ykF+8koenfd=7y9% zfsl#B)dG1E{;Bw<>AdrHN?~58HIpwl&Or{(VIDch&m%AOrAkS)lr8;us!AEr-~=P) zJzi>*m=~bP+06XUA>>@#^SLkJehbp7h}cGZHa+Fd+!t_PNEmB=Q0zS73-BFD&O?OD z9N`6}pu`60j#M9|K<~3D;T&L`H}DK4^b=FZI=oOypa>3>i%$CjZITb8Vp{SLE!j^i z9-;*g(SnC)y+fvu_h3c5?<(TmRS|Ej<W0WJ7h<G7#Iv-4gbIXy-jfv(`wY4J39Ym1 zg(?agc%;0R)+%AfehA+oyJg^@h1V@|-(H9RdeT(b4a78ar?^|VH*t4zcX7L1hsbq^ zT!+X7H3>Zktp2pne&%Z%2yLcMioVdoy^-{raIdD#I&r(W6&`%Nl^YqzY@^Cv56*>( zg~UopQc9V}D}pDm(&1bW6)IKsH-k%xyM=or5I5m=a-&6B=2Lz~nOUOLyMI*mF6K1o zB47pB%Ur1l>}Abx2>O{yUz3C2cn};9dK?de<3Vsd2#x}`2&xo$s>GElV|>n`YUgrp zBd5a#nt;vFIigmO@`9YqV?9kGns21G>2&W=iV6q7O)e)~1`O@{yM5npphZ=`!>vUI zIEf&uuIO&i>p1Q`e#|aqZMBHC)gs<17x7NGh&Rhcyjw0}wY3NfX6dJHo+14mY3L-7 zjsm5+CM2>!AtN8$yrV|OQ<X@ys@1CAM(j97E~l&3AY-b4%iKb9PiEw1d?ZaHW2BDG z$RS1<Yba6l2wAZf?N`=QWS!_q<e1Drq=rGg=YXM{O3V&mwaynke=1K$GLF@%9sV?+ z&ZQ)=!9R-i=as~Wo&9{)xz7N*HCzjMQ*$9}v1_>&GxA*q%yrBfmNI8+hIX<==>*=% zx06#gz%?>5Zi9+9bFJph%KNd_|667$XQQ><!6<(xcJ1de7C&MxVV(bRR(!w7wGJA6 zo0*`ju_kqmbpvg(hZ25@t$s?^r91e#eav*)qwEaxR?Ay`EQN#$w}`#Cc@OsDXPWo% z7V=VaE7m6K&BuAm(TvS{i)}UcU<KaBdD88i(D?xG(yuoUVYz*$d6f4F_nF7A(|*u= z8B6WYnXh1{-Dke4tGbV4nf)Y|_p$mPLtS(9t@F-dv(uZfMLIy+R1F+Lo)z(r%iPC^ zG{S$7>kugjhw^XGkCI3E8+dx)Zn(q@Ji{dzAK*ST@ElM37!9ky`f0+bht$H<amV2e zdXA)n^J^F{r5_FY4eTDcYG4Pj_5({OvR|oj5V+3_aK0vG93Ydd?8^<E92EZJ>W>4t zN=u2m6p~7QLQCN7%SB1SOVc<yW8tKw7#FVfP#Bs<%Fp<L(~XpUz+)wE4BSsJ+K<;^ zEB{qsKz@PiN^}X)E)DdMS=nT$6aEIC8rX&|AIE)~dKsuARNv3@Q_#5v8bc*lBVf3a zYY2Zz(($W7ABj86z~woikdGl!XvY6Rh1}=DNh6eyaKTYpP-r3jUe-%%pr6zzs8bQp zNiXR#sibKJ{ejKv{-Fnt=m!_&;4jI_no8D>no_HXGFj2lqf%JuHHZr&kuOnNdbGcY zYetxpw!dqHNnLA=I5CiSQy1=Gep1i4^w!+zgwr#B1Gf*zN|A7|<4+$QJf*i7Q1jDd z5QTwAdk1hbOAVi@JRckBZ-cQTo%YT!{ji?H!q2QFr`H?IwAZ=9wHG=`yEiAsBy%lA zt7W&tASz{4s79$FLHXz`JwEH_Xgmy^!#sj<ZmctFEE%Mx@*id%(ldOzK`Dl#Mi4)! z&LJX$V&J;H;GI{}ggMoNj-HPinZ02c8XOL;%fu|#(;)igN;KlI*N3wobA~Q$&R}jG zI>U%#UlU|UKaqAL`7yF*_g<eZcmEj?%t7*ZB)LYC=6@1zq~n{7SNd~4`ljd4<sSj> zspQC?E**>X5=P7$ydz4>C)W1<mk}NWj>>)g5Tv-**Sm*8cx3pwu_HemdKa=ckiN`e zcO$o1zm<8&pc0VsVO!2&Y~@ta^xx?E<48x!^b#WfAl&kdA5jkH8y$|4=Ww-PzFsEb zS#g6#)9hL(UMj;zFc;O#qTQv>o+5~&r%0GLm=}Zrug7z^=sXyQHx6<}S^w*)@mHd= z^bV&NjD+GNNfR{VXwn9Goa=H%D->b_BR>hBJnZbt_4o9D&7AM=uSDlGYK%r!ha*Hj z^nLhfU=9W9uTPDkuo->a>yW=W3VY+Ikuj4<TZvO1_n71umDA^EK`L2M>erP$7gCpp zXC?=$5}Hgb5apM~m-0B&T2D4L4iByKU@OQRhF><$hXG`M5NR{!{E4C%W)QT3P%&z0 zR#(C{))=?45zb+>pEpD>oHWdC3EDPj-!N$e*9Cd#A!H3r=LU_*g#5;~RfuX{PbM~b zlchyKPod!OYmAylS6OoE$AfF`=6@sBt@cVw=aSNcA*Z1~$oqQv+36?QU~|zmYZjfI zCHvWN%XaFh^2kLamvmk&Px$w{XJ*gaGip6Yc@r(kwUj&!;?}3K3(WnT0XHK_gh@tl zo`=^<=R9Duf`^i}SxNmPwkH1<eus}5(i72&X=(SviZzr#X=9j1(i<K3)WEeFvQ>B~ zfRNA4=Ahi^vQq`mthM&&d%*YWdjv0&!F;=;#Xz6FdDJ%nyywZ%-Gj2It?L)^j`4N= zMk;BBFXr{*l3vE);|&Kj!j4wXDT^gtlq$p}ee9AHL%g-h#(8*d3QHNiCxdfGp54_w zKLs)&4VP{xxiN?uq0G)KWAsnikVgrDH~AthxMd6vdr&k-;+^t7E{PRa-fIWHv^f$s z=JNKL(I<$cXXpK8<2=f7V>DbhDmuS$E%*jP?#V@FWG7Tgr?a-PuAJsdpDXN*>)nh< zd4K6ROQP2zH-_Rpf#~LlxOe5_yxem*@(#h(3R%ZYr0QK!PsprluKB6fb7YXQ6vzuX zPwNiVj+r=TVj4ZYMrvSRq9eP^Mf3E-?A8v-9EQ%`as??hEHxapBAN{YdB5W~<&995 z1z0&Zz<ChlA>>jTorl8N>rkVF98g2}IUmj$yb+}uA#V(Yvxl6GGc|VW_hN6PKgNgt zP!3{k6odyZ<Exve#<h>Q_%L^nDxVv)O1}8l9)7qWD}}IUbC^UkFX}CO&9i<%I_M;n zaFiL8Dl1d?c(`y50fwIcp^#(jNt4rcE@anCG4`h=Ty<FYmtt*NrdPQs=cMQ{T$OsA zj-~B5PN>2X4olSuT$f_kKha!_6>Kfq#w4y;tc6eJB$O#!=V2u~l^w4~axKJ7U>hsf zG3+Fn&OV75TveQKaWwX|a%w{X*0GDQ4_(eB7zs`*xyE7<donvg8o91e``He)pY6iV z^-3^W&ov%v*Cd!WaZShCwHaLGIQh4*?`jj6%7OBiQR7~$Ww&xQVq3cni`whCR&sXA z4dx`Zv^`6$YnPc%aTQ@<dpCByVqH58yV~8@?TRh!Y<80TlKTCMYbs|)KL-u|n`<3s zCH)SJ4sxyM%%tCg(I2=ruzT;1;Pof2W=_Il@2z=}tA*WgFL4&vpSd=%EAC}1fDdt9 z#m=}_IN|y)Ty5--dzEuH2DsYg5C-hB`AD8wi{0)lzT!9=>)j);-koF4;SA}c&9R*F zaf~Uq^Xxpcg43kmWEOFvbiJ8}4eth1%K2tZoc+;^J#Q_iJE!>GOp9&dYcw0NUZ2TH z&zm^Mq!l~gH*w<gRi>U(pRYFa)#i5rr$29Ir+vF^H%mALy2C8zB<N1|$6bRh@X4GA z-DS?eBDmX}&B@R`=3GvP?ll*2LiDxfa!!ffg2nMxY~iorwCHW7n-in2<MglVu^{eM z3*x^~3*uFr_<X-PmD8Rd!Wvubh-auB@fyx<+lh_#F7~LL$oXnda#nc^>WCbW-C42& zTrAw=1odi8<{QgZ1y_ux?S&&J5LO50&E&Fh=`8mC&gQD+4E3Y&&*iGsbJXP|^*6zb z^_*HU58Leq!i78KJg!Cf7jwzkJ4?vN*OB3~Wn7clH@X6-$8#0ZJ5GQ<PU4!11-Dqj zpUNd4MmQZF6`Sx<`2S4&XK^LeKD->u?z8DBateC_`|k7L`185O(Bm$^FV^E@;Ac6b z>>{qQ^t+3}{t~Wn^u$Z4>*ZWE^pPv5rSyuaaM9J&Y%^CGXSZ}fg-))yoZ|9U=y3}t zm|JYiw?oVKaMf~t`v<Ar?OYQ%#r;G0Kg=l}wVdMdaeDZjoZ~*(e3GkBd&oR2{Kc04 zvz+NZ23zzmA~7D}8pB!XUjolZISFnIcHcXYA7A6dxN&9|R}H6*KS>?G!BwMH>*abf zNG)fne~0v9yM8n$!he@KKE+kYNg>~Zp5N!1sb|t1fi=6^tM)Tm`{!KK*|X+$tvyS~ zFSw>-@BTbI@Efi&&Z_w@_R-9@^UYjNRA0uwoS``vi}$nW6%W`4*zNII`&lzhId2*# zjej0)`-1&~nJuS{6Z<9mB|;wM)V|qj(_YJoGEcBy=j)s&Cnu|23(rJn_leAueVUo4 z_($jW&!UEMO8;`C+)CXmuon5G=j$UW<QyOQ2u82&0k|INBq#KJ3TgB>QfLp-N6xJO z?~JqA`jIFvAxU0Fg1my{c$HJ{I2uyy`;iYv2dDoa2ZlT2aPZ0Qcj{?DasqpwJ7JxV z%il=5n6ke3P0(9*;EH|p0du_S3cR~zMv|uOhJ)cKJj_)O2vk|e62Fe`4M0v?za0@c zhndrh+^nEZX9y$8oGVd?nS+**WHj0rHDQKF?R16{>N!F^)rv9zkL-b&k3w`i1=90K z%yY~|u***m&g~Czk!UvqbF<6b$wwH<N@c%j)zL2-m+a>#W#AL*eyyR_LgrRVs|Ib8 zImF33jXZPu0LEY!%=V?v(|n6i25@Dq$L&p#eI0qZkCOKWw$-F#mJdw!-a4HwD08&9 zWn&h=0s8KN8{HEn1bR?Ti%Z2L%;+^s(Gw#6jeKFcp*-3GSmuR%n#CPi>%tP7l_G$i zMi1Gm5&ZI`4x;nB;N;%v<m3T~9h5g`Sx`6NEixz%=vp1L=A;~fkrUP+;8B3^w!C9X z=Q9_p)Ktx1pmK-3KL@sstE7CTmSQG8aEkIprH;g>nDs?ml$nQceZQlag|^x`G4uL- z)cPLBP?r`+xpHQf7(G$8Xwr8Hr$@GJ;)AC{Zt?qeq_2jUMljSTJNo!J%rvJ9iPpih zc1&gE&;2NC!6L0a{edrI7A3(w*=rk4M;`>obA#-u_CF6HtRJ#CCx-^<vt6VR=dy6I zW~gl@kky*X$s?B@zxD(uoKt3yDxjIRo>JdQiBZam2tO@RXja2}D%scJFmP+-{p^of z6Q%W7-Yu!1YG$t$s#7bs%BGZa`{{)85gp}3tBlbm8+!Ddh8gy;K{%~Q%ToI7fus#$ z2-Q?j@u}>!K0k&DF5yTk<A*?U`CT|qQV*#;`-o^`y@Z3f2-W|v=R_q(z6gF4mhO`_ z28zhM81rG#mCCi0a@CaL%-pJ(#fh#IS6!(JJ$D*$qAL}s?hsSmp;&c?Le(8&symeG zJiJin;bY9txGHrXUZL~wF`NbQEFm%vuh4mTT<77%Iu9?^d3a3c;W2-fz0AOiIDz{! z=(n<m)anepL}%b-Is-4#8F-1#z{{x5+rY2@%w_drx~^Nyq^t^RB&!vC8I|jFt>FT# zp<BI}rS)7UJcy<tYZ&q+TfPU1j#CSLWDP^kRGy4ZCu<n8lXxm=g)SxNED2m$y_ley z<Z{&{SE(jBS2f91s!6&pa;;KL@)Xr1SE(i`XLm0|9~4b;u4<C2RFgbWHOYCZNuHqV zA6E6rH|Z)!Ots2-)hcB@WTn?FPtp~UzflcSK6!UK5Z!)b(JdGIUB{wTE>eARwd#|L zRi9j~`s8BOCs(UJd7A2zC#ybrs;;s)t#YZZwK&~U)?cmwoAq2L>59u_<%|Wob}~`* z$>pj~u26k)uIiJkRG&Of^~qJLPtH|+@)*@8Pf&fbUiHaUs!txP`s8BOCl{(dxmfkd z)v8Y}R(*1b>XWCcKG~?6WTR@53pt<WTX2D_)>NrhIajsH#i~`Fs9NP|s#VsjR=HBO z%Hwrir%-u%f%5cO%F}C<r_WTLK1+Fejq>!F%G0Oo>dqWpxjC9s`e&jU%BoB;8rN(y zRo7#V)b*H2x*l_suE!*FJ*G}I&jwxjI6~JvW~lyohU%YZsD?RLHO%>{VXoHok6K;- zC`H>`0I$lab@IJ9IrCF`?1`*E$#>D@RQI=PU4BX}eh&7}g7x!qVk<q*eNRlkC1&}8 zm<_%eCg0h5kY4u%>1}#CeXRZw(eaMH@R$ZT{C&tTWSz{eRW{u&BL~k;R>=;;9fZh! zFxg+g2}b<OjlG1%?O+tYec*n5b`TEo^fdEhc1<Hqv8TZ8BWyQe+wtG8myG_*Z@J{{ zNI3sUmvbZZ>;7pl<b*rMAI=j5GxQ{p@`}0COio^kgXitUaBfw$^+&FfWb6Q<YI68w zToR~W)~Dyl6-Mg8dl#dT;yKChMnCr-!ApOpbeSc{PWou{$Q(1Hj9EUZHD$<s&|&WV zZZG~pAclJ~6~1V#2WUB+QwVnM$^x75=;#PN!_hg4&O?=4GxaD_USEW(PcnG!G&p1s zH06YF^j6BqOu+FzZK4!N8_ju^9rp604FYiL^Hg$SlE$Yi@*zWLlmVP!++aSY5It86 zSH~bvI_O+s>G7do`6JT(R67nMy@xcD14^WGYIZt#R;}4{tILzG-vtmeq2vk;xXN>$ z?s^ZxC~;8VkQR-giab!v<dlGn7L3w_zOW^ME7H)le|ig~w~TyWh94=@cFs~7X|zl^ zGa|>&<D)&u`Ew*1HYivB8#Yr|6R4t=ltGT+`+bm-x`nlpTv7OFeYBID03n#jYLZ%D zLUU&0j4X~i!M|&Bl{h-;h?JN13EEct@+9YTIK6=$AY7oFAg4X-&=itypV;d}Khc>e zJ(P>`BrV7<;0Cm?D1G2Vf;<Hd#JJqlMl}dRcX5eieJ0|4%9XP(q@H`zcjqhQq9C0@ zlkrjHl8m=9CbQ>{+%gu4U#P>%n_iqW8eXy&P_7-SFEUz7dY?x|X0%xHvJa3Hw{y$L z+{f4~W4*fq2z#ZB@E39nA(3CGEPYJo-chJzs-f0WuAE}9m-9JAqPUjw{Km7KD=Kq@ z-O^LFJw#qbebYhAfU6Xd5~U9-|GCpIB3_ij^Zh6#R|^U}etPzZoYNwBJ8cbm<5Q}; zG@4G<<`gSpWOfu#Sxyg;u^OHXQWH<TgD2+_BJC>Ut^6D$U5#|{#JLsEK(0Iog${&V z=(yi=oXg=#NUvMKNdd&bP3P|*jPi0(#h)sYe!9p|b2Z`n2x8!KcxO`}h|P2*mG+iU zu1I`@Tc)IAUUPp0*TuQ#AcydT@`Z3zT*ql0?Fn@)5^|QKipv*qQUqP#1W-XK%;)j< z^1(leBYMBC-;r}Kny3DhH<%|A=SBoM4ai}VZsFmfLkV4BkgQTVx9j^NQAFBEe^Op> z`0(UI-Luapv>c3|!ju&9(-~qe4sg(2qVOL~a-<ETLr-?9bZVwk1;1O-aFW;C#JIYI zz#@;FL8R@f|3Vd+e<^(=k@m<CKOoDzUCs%TQ<RjVu6_AWo7Is~#tCf=)@^FE_vmhF zLPdh<x|8D6@8yk_5psOM5$cM>7Klg*Irr49X~}s}#LAprDI;f*hzz4Nf5|-acA*71 zMMDyO=`KzOl6P<dO`b$=+9&B{Es|T;%<%1!db(O@>_Y>O0ZGOI?8wQpoAa$66G;yi zb)@BqdhKEjOvXgVId>8AG|&D_qd@wH^n%KiAaaY6v^06rFkD9u_wU0bb@T%tpWlTA z5acPhR0{GcH6@iu+boSy=;g{*I36=XLmmjAXgnAQ7A{^mNuM(07Nw-E&}GX}t%GZ2 zN}vwz4F_wz+B<!Z3F?+!uOKYyor;kkTS98PF<0m9ne!9HTzExzRX9gx03s1&)E3QJ z+D-G(hB9Mtb5Y?HS(l|wzKukC4|ql3s0I#Qb)17TG6Fh2ki2qone?)!2j1_YQw-&a zh8v!ErjUiZb=_Gp6Pn6s=rD9Vqx&ofQ+j)Bw7%fuFej7z;8&McSKKN8Ap(`^62~q0 z``S8a{wc0+Bc#64d$#MfKcq^~gZ3-^ur(DsNGC(-53FB<li(p#*){MG{iF{n_JNJ` zCDtwo=ae$3w_+$O4p;Fc@<q7nMxLMHS-1e18?-4;{+GcISsbdI6(kJYOsY7p&MD0U z>I4~asfGS)JEVn=%IkT>jZac1si(|eIU7#^WnwLK2>E=-a)2Ak1ANSAgXF$Ml`{fM zp528X3UJBWkhFQaq;a_=Msw&HM)>RWS@K95x;TNU{-DG+&V{42G%0apr6_&Fv`!Zq zoHLW^gX8msgncDng1>V3Nb3PtDNSfM;lDKbJRHI*y+V2hsg)B%Gtw0TF9EVrNtwA@ z&Eo<lqyI?{Ny{ZN)5#8BmON#oNK2gUb@M<VDEH^1N-k(n1)Vz+9z9xk)k$#iDV3E{ zj`l7li%Jm;kA<|9m()?*Yx4>HWn2OmnYlSE!tygEKv;r%`zs?8HbyeraWOoLKM0dh zd6xNE;1ALUuJl<_FawZ~I?B`coRWvS%19hta(27BTzMjQWRy@{kko$mM@=M5+Dl5- z{ir-ip6K*ChcN%zzN+N{&5bCMw*iXi30}0Uyf2WSTbD!6(Dutg|4gpRmIJ~gij@M> z($wevqL{QmyuRNEuVnL5*h-l>4#!i#3He}2O>^;lzVuOeGzLXs|GRxd(Q&A_zdF_O z+9e)7EFC0zuN#Bhxw1j8iPo&rs-CysWcCi7<N35sdZfX~@{0U&Gdr2xW%hIT>}HG- zGdP82rniQpUeIs7mLqxn9M31sbkb&?qoeESQfC(WKjmq3b#OA&^9rk<xqjJlR??^r zl9kwvbb%HuX)+T;F`3~*KaIRTxl@9v%%C!Pd59vl=g7#X`12H6Q~42*zND9|Yx#?` z&gb6eYHn8q;cg98wOLIS`NI5!>&{&VCmlIjM)X>_vUJb%RHO4#n$A~r1QNLXA{ij9 zm`=&SpGm=dv$#=Wl06=$QBJWMrqy(eP3!HWD?Kx{QiT?A<p%vCNRww47epIB)5*kl zI4S9JJ6Y-cZlxkao2E5FsNR>p3L9X+T#rlMGP!x0h6~sDmX(<ybwiTM>`-QvgML5{ zLKOp@pSaVL>R20gRv(h9CR`~Nn@5r1K|YC1|H*t4IqriT-ucp|=L`I9McSR+lSP#v zN$C33>+o4UuFl$fa-AmYM<%Vg_;Z&Lg^Ex3P1;G%WydcTTk;EM#`F!hIvnK7s<CUu ze6zTqzbVY{FKov!#CcT4YAv#*t&dOF;v~q|*u`e{^dM|_7kXyFb+SZwRn`LZDJ#YB zP!CIrNE!sx7qD3^kWGa_C1<}S9F$-r0U?!`b@`b~`pJC(2)@dIH>+KONY_I7M$YV3 zaJk@>pvOgE@Oep);mb(y20cVrdd~NHPw+JIVqFeRk1UDmqaoRCJOZ!^0qUni8q|*> zj!J`wq?NZ7qV<Po*VD?ZO=}`qd&S3{F5T1f>-vLGCa4p+<?WxFGdW4AC4-xn_ZpW2 zn>6g<B9B2(R(dZ8!iIL;yBdKMjyw2uRV6KB4m?ODYx8Qk5T#T~IjU4qKSz~3Sos;h zj8ndB<z;#MBtQQ)(!=&WM&3pFkRhD(x5FgM+uMc!kt=GnaD-~vd3@{UhzUy!Y8bd- z#ArM*c6Z9YQ;W6m-(a;Y>p(HJ87|P>r$uTrJO-QLdhD8y<tpJTLSpSHJ5fv3W;m`k z!{ur-T%k6@W7Jx>QtgDR)K0ist%AquzSC*g2Cv3S^faz1SP7qwtP?xo3AzV$qV7SR zs@B4_x(9U<dr;3|Jbg3Q6tx_liskSHSeeQm)LOL}u2Y-ggxU-rr8dLUbr0$c-Ge$) z?SyBg?JTue0>7V{-p2mYBDDuDReRtfwFfR$d*Cv)2OgvLz*SfRKY(rPXSiyx2mUPh zKgcfA8np_pRjc4>Y85<Ht%9eiRqzpN6+B(7f@hj1xu&UY@JzK0u2tLM6157Bsa0@| zS_PM@Rd7PBf~(XjxLU1(XJMmznwelvx2LmP`V4!9nWEoDs<mgaYjld*=oYGt?l`s4 zJ(5-}WH;!Qe7(v23h>Q>mL;_EE!gJXLVM==y%*|CgRZB-38m~ve-F0RvL82a*ZU{; zEOBm+sAUiNDeNHM4(;RE{1(9<hMl7~n``vCk^h^ql)p*svt{S+HU56P*}~q^6W9ZP zwz<x{11tE8$zM$FD?$V>fnN-}(T~EW*ns_2K4u~OD8HF-u)!jJx_OsA8#q|@(+AfL zVJ%!;<p14TC)ukn*G24&mtFdDZ6szQxTjyP7V`f#e>wbv@Ns-8OLp_ibscrQj#THu zwMlX`nYSxt-a$_o?kBsXd)dJ&J8tEFEL>bkYZ+=D)NKj<Z5g)tE3nBwo<1b|b<dy& zokh=)-f^K8l6P%sI21+@AJAWtUZq#$bI(zzF*k<S2tbEPV!Cspn%*XRmuuM#F&P;! zRqe~=duOs&z8;CR2y63|<|N&@9A-Xjp4sevZ)1PPJF(<{Csyt4K<+?>wQ;rMOL9^| z`qe3R>PXHQ_VBX9-ymV<&>QC>GYjbx%YY^O^T*P1C$KMj6%wmP<<-%&^cAGLg<bCR zkV2oNKi$Kw^)rws-(r`;w~+)_sjdDs^!KmB9h|_xZT6gS&kw}?$6K#o;@r*0{2!(Y B?d1Rf literal 0 HcmV?d00001 -- 2.45.3 From 15da80fefbaeff7c363f5baa1ed5c214b76c1204 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From 293a2ccfad0dd9a7fbb58a4e78257c5c8f2deff8 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { <div className='visible-content' data-name={this.props.name}> {this.props.top} <button className='collapse-button' onClick={this.collapse}> - {this.state.closed ? <Icon.MinusSquare /> : <Icon.PlusSquare /> } + {this.state.closed ? <Icon.MinusCircle /> : <Icon.PlusCircle /> } </button> </div> <div className='collapse-content' data-name={this.props.name}> -- 2.45.3 From 6a02d7d169b52ecc51dd5721058458d6b1ad1bfa Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; } -- 2.45.3 From ba9dc3df5376690abbe6e125f34e4ee14feedf20 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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' /> - <Icon.Copy /> + <div className='icon-wrap'> + <Icon.Copy /> + </div> </div> ); } -- 2.45.3 From 58b52a4e9ccbf1ef7050ec8549dd7e82f2b435b0 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { <Row> <SpaceBetween> <a - className='link--brand' + className={'link--brand link--icon direct'} href={`${host}/${claimId}/${name}.${fileExt}`} > - Direct Link + <div className='link-text'>Direct Link</div> + <div className='icon-wrap'> + <Icon.ArrowRightCircle /> + </div> + </a> <a - className={'link--brand'} + className={'link--brand link--icon download'} href={`${host}/${claimId}/${name}.${fileExt}`} download={name} > - Download + <div className='link-text'>Download</div> + <div className='icon-wrap'> + <Icon.ArrowDownCircle /> + </div> </a> <a - className={'link--brand'} + className={'link--brand link--icon report'} target='_blank' href='https://lbry.io/dmca' > - Report + <div className='link-text'>Report</div> + <div className='icon-wrap'> + <Icon.AlertCircle /> + </div> </a> </SpaceBetween> </Row> - <Row> - <p> - Hosted via the <a className={'link--brand'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain - </p> - </Row> + <div className='asset-footer'> + <Row> + <p> + Hosted via the <a className={'link--brand'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain + </p> + </Row> + <div className='claim-address'> + <RowLabeledAlt + label={ + <Label value={'Claim Address'} /> + } + content={ + <a className={'link--brand'} href={'https://lbry.io/get'} target={'_blank'}>Place Claim Address Here</a> + } + /> + </div> + </div> </div> } -- 2.45.3 From 034bedac103689bf3f070495e80f24480de8982d Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; } } -- 2.45.3 From a188adc311cde2b52d17ae7a1383e52517bd57ff Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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={ <span className='text'> - <Link className='link--brand' to={`/${channelName}:${certificateId}`}>{channelName}</Link> + <Link className='link--brand link--hover' to={`/${channelName}:${certificateId}`}>{channelName}</Link> </span> } /> @@ -129,7 +129,7 @@ class AssetInfo extends React.Component { <div className='asset-footer'> <Row> <p> - Hosted via the <a className={'link--brand'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain + Hosted via the <a className={'link--brand link--hover'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain </p> </Row> <div className='claim-address'> @@ -138,7 +138,7 @@ class AssetInfo extends React.Component { <Label value={'Claim Address'} /> } content={ - <a className={'link--brand'} href={'https://lbry.io/get'} target={'_blank'}>Place Claim Address Here</a> + <a className={'link--brand link--hover'} href={'https://lbry.io/get'} target={'_blank'}>Place Claim Address Here</a> } /> </div> -- 2.45.3 From a3c44b805c15461697a230828c9ddd1fa42eb92e Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 ( <div className='share-buttons'> <a - className='link--primary' + className='link--primary twitter' target='_blank' href={`https://twitter.com/intent/tweet?text=${host}/${shortId}/${name}`} > - <img src='/assets/img/icn_twitter.svg' /> + <img src='/assets/img/twitter.svg' /> </a> <a - className='link--primary' + className='link--primary facebook' target='_blank' href={`https://www.facebook.com/sharer/sharer.php?u=${host}/${shortId}/${name}`} > - <img src='/assets/img/icn_facebook.svg' /> + <img src='/assets/img/facebook.svg' /> </a> <a - className='link--primary' + className='link--primary tumblr' target='_blank' href={`http://tumblr.com/widgets/share/tool?canonicalUrl=${host}/${shortId}/${name}`} > - <img src='/assets/img/icn_tumblr.svg' /> + <img src='/assets/img/tumblr.svg' /> </a> <a - className='link--primary' + className='link--primary reddit' target='_blank' href={`https://www.reddit.com/submit?url=${host}/${shortId}/${name}&title=${name}`} > - <img src='/assets/img/icn_reddit.svg' /> + <img src='/assets/img/reddit.svg' /> </a> </div> ); 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="10px" height="17px" viewBox="0 0 10 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>facebook</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded-Copy-2" transform="translate(-878.000000, -918.000000)" fill="#FFFFFF" fill-rule="nonzero"> + <g id="Group-11" transform="translate(0.000000, 656.000000)"> + <g id="Group-10" transform="translate(761.000000, 194.000000)"> + <g id="Group-5"> + <g id="Group-7" transform="translate(62.000000, 61.000000)"> + <path d="M55,16.2457933 L55,13.2217548 L57.6590693,13.2217548 L57.6590693,10.9945913 C57.6590693,9.72775809 58.0205601,8.74529596 58.7435525,8.04717548 C59.4665449,7.349055 60.4293617,7 61.6320317,7 C62.6539537,7 63.4464527,7.04086498 64.0095525,7.12259615 L64.0095525,9.81971154 L62.3724001,9.81971154 C61.774541,9.81971154 61.3713397,9.94230647 61.1627842,10.1875 C60.9542287,10.4326935 60.8499525,10.8004783 60.8499525,11.2908654 L60.8499525,13.2217548 L63.9052753,13.2217548 L63.4985941,16.2457933 L60.8499525,16.2457933 L60.8499525,24 L57.6590693,24 L57.6590693,16.2457933 L55,16.2457933 Z" id="facebook"></path> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="18px" height="16px" viewBox="0 0 18 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>reddit</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded-Copy-2" transform="translate(-961.000000, -918.000000)" fill="#FFFFFF" fill-rule="nonzero"> + <g id="Group-11" transform="translate(0.000000, 656.000000)"> + <g id="Group-10" transform="translate(761.000000, 194.000000)"> + <g id="Group-5"> + <g id="Group-7" transform="translate(62.000000, 61.000000)"> + <path d="M156.004898,15.1197594 C155.976483,14.3425491 155.494238,13.6545068 154.773348,13.3626486 C154.052458,13.0707904 153.227378,13.229551 152.666271,13.7680886 C151.12864,12.7228617 149.321161,12.1454075 147.462339,12.1055335 L148.340925,7.88832069 L151.2335,8.49657254 C151.304534,9.15687714 151.844729,9.66775963 152.507966,9.70188281 C153.171203,9.73600599 153.760976,9.2832597 153.8994,8.6337316 C154.037824,7.98420349 153.683886,7.33033854 153.064365,7.09108696 C152.444844,6.85183538 151.743293,7.09808364 151.409217,7.67205337 L148.097624,7.00973469 C147.988226,6.98573517 147.873773,7.00653061 147.77981,7.06747975 C147.685847,7.1284289 147.620195,7.22445834 147.597506,7.33413567 L146.597269,12.0244333 C144.715584,12.0528011 142.883246,12.6306923 141.325753,13.6869883 C140.756347,13.1512356 139.924346,13.0021476 139.204337,13.3068472 C138.484329,13.6115468 138.012088,14.3125756 138.000228,15.0943133 C137.988369,15.876051 138.439129,16.5910818 139.149563,16.9174815 C139.134345,17.1154345 139.134345,17.3142637 139.149563,17.5122166 C139.149563,20.5399592 142.677424,23 147.029804,23 C151.382184,23 154.910045,20.5399592 154.910045,17.5122166 C154.925264,17.3142637 154.925264,17.1154345 154.910045,16.9174815 C155.590785,16.5791323 156.016659,15.8798572 156.004898,15.1197594 Z M142.48819,16.4714301 C142.48819,15.724923 143.093354,15.1197594 143.839861,15.1197594 C144.586368,15.1197594 145.191532,15.724923 145.191532,16.4714301 C145.191532,17.2179373 144.586368,17.8231009 143.839861,17.8231009 C143.481376,17.8231009 143.137573,17.6806932 142.884086,17.4272057 C142.630598,17.1737183 142.48819,16.8299155 142.48819,16.4714301 Z M150.341398,20.1885248 C149.382418,20.9112013 148.202534,21.2790195 147.002771,21.2293113 C145.803007,21.2790195 144.623123,20.9112013 143.664144,20.1885248 C143.54506,20.0434288 143.555461,19.831664 143.688189,19.6989354 C143.820918,19.5662068 144.032683,19.5558062 144.177779,19.6748899 C144.990443,20.2709755 145.982418,20.5714295 146.989254,20.5264425 C147.997329,20.581264 148.993925,20.2903914 149.814246,19.7019233 C149.910827,19.6077567 150.050309,19.5722686 150.18015,19.608827 C150.309991,19.6453854 150.410466,19.7484362 150.443726,19.8791612 C150.476986,20.0098862 150.437979,20.148425 150.341398,20.2425916 L150.341398,20.1885248 Z M150.098097,17.8771677 C149.35159,17.8771677 148.746426,17.2720041 148.746426,16.525497 C148.746426,15.7789898 149.35159,15.1738262 150.098097,15.1738262 C150.844604,15.1738262 151.449768,15.7789898 151.449768,16.525497 C151.464606,16.8956141 151.326902,17.2556033 151.06884,17.5213305 C150.810779,17.7870576 150.454973,17.935236 150.08458,17.9312346 L150.098097,17.8771677 Z" id="reddit"></path> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="10px" height="16px" viewBox="0 0 10 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>tumblr</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded-Copy-2" transform="translate(-921.000000, -918.000000)" fill="#FFFFFF" fill-rule="nonzero"> + <g id="Group-11" transform="translate(0.000000, 656.000000)"> + <g id="Group-10" transform="translate(761.000000, 194.000000)"> + <g id="Group-5"> + <g id="Group-7" transform="translate(62.000000, 61.000000)"> + <path d="M98,13.3195248 L98,11.139339 C98.6412999,10.9383992 99.1874537,10.6570877 99.6384778,10.2953961 C100.089502,9.92700647 100.45243,9.48494557 100.727273,8.9692001 C101.002116,8.44675665 101.192388,7.79036318 101.298097,7 L103.613108,7 L103.613108,10.8982124 L107.460888,10.8982124 L107.460888,13.3195248 L103.613108,13.3195248 L103.613108,17.2780189 C103.613108,18.188946 103.662438,18.7649647 103.761099,19.0060925 C103.852714,19.2539182 104.035939,19.454855 104.310782,19.6089088 C104.663145,19.8165466 105.075403,19.9203639 105.547569,19.9203639 C106.372097,19.9203639 107.189566,19.665844 108,19.1567966 L108,21.5881559 C107.28118,21.9096595 106.653984,22.127341 106.118393,22.2412069 C105.575755,22.3684688 104.966177,22.4320988 104.289641,22.4320988 C103.549679,22.4320988 102.894295,22.3416772 102.323467,22.1608314 C101.773782,21.9933816 101.287529,21.7422106 100.864693,21.407311 C100.455953,21.0657133 100.177591,20.714074 100.029598,20.3523823 C99.8745588,19.9906907 99.7970402,19.4515104 99.7970402,18.7348251 L99.7970402,13.3195248 L98,13.3195248 Z" id="tumblr"></path> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="17px" height="13px" viewBox="0 0 17 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>twitter</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="Route-4---Expanded-Copy-2" transform="translate(-830.000000, -920.000000)" fill="#FFFFFF" fill-rule="nonzero"> + <g id="Group-11" transform="translate(0.000000, 656.000000)"> + <g id="Group-10" transform="translate(761.000000, 194.000000)"> + <g id="Group-5"> + <g id="Group-7" transform="translate(62.000000, 61.000000)"> + <path d="M7,20.3784787 C7.23887844,20.4052125 7.50505328,20.4185791 7.79853251,20.4185791 C9.33417962,20.4185791 10.7025913,19.9574295 11.9038086,19.0351165 C11.1871733,19.0217496 10.5456237,18.8062123 9.97914051,18.3884981 C9.41265735,17.9707839 9.02363258,17.4377885 8.81205454,16.789496 C9.03728278,16.8229132 9.24544516,16.8396215 9.43654791,16.8396215 C9.73002714,16.8396215 10.0200895,16.8028632 10.3067436,16.7293455 C9.54233258,16.5756266 8.90931421,16.2030311 8.40766949,15.6115478 C7.90602476,15.0200644 7.65520616,14.3333525 7.65520616,13.5513915 L7.65520616,13.5112911 C8.11931284,13.7652614 8.61753755,13.9022696 9.14989521,13.9223199 C8.69943873,13.6282491 8.34112644,13.2439577 8.07494761,12.7694344 C7.80876877,12.294911 7.67568135,11.7802948 7.67568135,11.2255703 C7.67568135,10.6374287 7.82583126,10.0927375 8.12613559,9.59148039 C8.95197248,10.5873111 9.95695313,11.3842979 11.1411077,11.9824647 C12.3252622,12.5806315 13.5930052,12.913127 14.9443747,12.9799613 C14.8897739,12.725991 14.8624739,12.4787079 14.8624739,12.2381045 C14.8624739,11.3425252 15.184955,10.5789551 15.8299268,9.94737114 C16.4748986,9.31578722 17.2546543,9 18.1692175,9 C19.1247313,9 19.9300808,9.3408497 20.5852902,10.0225593 C21.3292259,9.88220734 22.028788,9.62155757 22.6839975,9.24060219 C22.4314688,10.0091964 21.9468941,10.6040125 21.2302588,11.0250685 C21.8649929,10.9582342 22.4997176,10.791151 23.1344517,10.5238139 C22.6771701,11.1787898 22.1243454,11.7368476 21.4759611,12.1980042 C21.4827862,12.2915721 21.4861987,12.431922 21.4861987,12.619058 C21.4861987,13.4879036 21.3565238,14.3550653 21.09717,15.2205692 C20.8378163,16.0860731 20.4436728,16.9164765 19.9147277,17.7118044 C19.3857826,18.5071323 18.7561767,19.2105525 18.0258912,19.8220862 C17.2956056,20.4336198 16.4151812,20.9215027 15.3845913,21.2857495 C14.3540015,21.6499963 13.2517646,21.832117 12.0778477,21.832117 C10.2282461,21.832117 8.53564712,21.3475758 7,20.3784787 L7,20.3784787 Z" id="twitter"></path> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file -- 2.45.3 From 3461443a1095dc1064b92c1fc4d725cc2d031f3f Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { -- 2.45.3 From 8d3b03fd26c712d8c349ec6f6592fe63aacb1df9 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From b8466722138f8ba55cd12067401333261c615592 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 @@ <?xml version="1.0" encoding="UTF-8"?> -<svg width="17px" height="13px" viewBox="0 0 17 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<svg width="18px" height="14px" viewBox="0 0 18 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> <title>twitter</title> <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="Route-4---Expanded-Copy-2" transform="translate(-830.000000, -920.000000)" fill="#FFFFFF" fill-rule="nonzero"> + <g id="Route-4---Expanded-Copy-2" transform="translate(-830.000000, -920.000000)" fill-rule="nonzero"> <g id="Group-11" transform="translate(0.000000, 656.000000)"> <g id="Group-10" transform="translate(761.000000, 194.000000)"> <g id="Group-5"> <g id="Group-7" transform="translate(62.000000, 61.000000)"> - <path d="M7,20.3784787 C7.23887844,20.4052125 7.50505328,20.4185791 7.79853251,20.4185791 C9.33417962,20.4185791 10.7025913,19.9574295 11.9038086,19.0351165 C11.1871733,19.0217496 10.5456237,18.8062123 9.97914051,18.3884981 C9.41265735,17.9707839 9.02363258,17.4377885 8.81205454,16.789496 C9.03728278,16.8229132 9.24544516,16.8396215 9.43654791,16.8396215 C9.73002714,16.8396215 10.0200895,16.8028632 10.3067436,16.7293455 C9.54233258,16.5756266 8.90931421,16.2030311 8.40766949,15.6115478 C7.90602476,15.0200644 7.65520616,14.3333525 7.65520616,13.5513915 L7.65520616,13.5112911 C8.11931284,13.7652614 8.61753755,13.9022696 9.14989521,13.9223199 C8.69943873,13.6282491 8.34112644,13.2439577 8.07494761,12.7694344 C7.80876877,12.294911 7.67568135,11.7802948 7.67568135,11.2255703 C7.67568135,10.6374287 7.82583126,10.0927375 8.12613559,9.59148039 C8.95197248,10.5873111 9.95695313,11.3842979 11.1411077,11.9824647 C12.3252622,12.5806315 13.5930052,12.913127 14.9443747,12.9799613 C14.8897739,12.725991 14.8624739,12.4787079 14.8624739,12.2381045 C14.8624739,11.3425252 15.184955,10.5789551 15.8299268,9.94737114 C16.4748986,9.31578722 17.2546543,9 18.1692175,9 C19.1247313,9 19.9300808,9.3408497 20.5852902,10.0225593 C21.3292259,9.88220734 22.028788,9.62155757 22.6839975,9.24060219 C22.4314688,10.0091964 21.9468941,10.6040125 21.2302588,11.0250685 C21.8649929,10.9582342 22.4997176,10.791151 23.1344517,10.5238139 C22.6771701,11.1787898 22.1243454,11.7368476 21.4759611,12.1980042 C21.4827862,12.2915721 21.4861987,12.431922 21.4861987,12.619058 C21.4861987,13.4879036 21.3565238,14.3550653 21.09717,15.2205692 C20.8378163,16.0860731 20.4436728,16.9164765 19.9147277,17.7118044 C19.3857826,18.5071323 18.7561767,19.2105525 18.0258912,19.8220862 C17.2956056,20.4336198 16.4151812,20.9215027 15.3845913,21.2857495 C14.3540015,21.6499963 13.2517646,21.832117 12.0778477,21.832117 C10.2282461,21.832117 8.53564712,21.3475758 7,20.3784787 L7,20.3784787 Z" id="twitter"></path> + <g id="twitter" transform="translate(6.000000, 7.000000)"> + <rect id="Rectangle" x="0" y="0" width="18" height="16"></rect> + <path d="M1,14.0837077 C1.25368393,14.1120983 1.53635608,14.1262934 1.84802491,14.1262934 C3.47885019,14.1262934 4.93207493,13.6365622 6.20774271,12.6570849 C5.44669091,12.6428896 4.76537856,12.4139935 4.16378524,11.9703896 C3.56219191,11.5267858 3.1490557,10.9607558 2.92436422,10.2722827 C3.16355192,10.307771 3.38461604,10.3255149 3.58756318,10.3255149 C3.89923202,10.3255149 4.20727217,10.2864783 4.51169289,10.2084041 C3.6999043,10.0451579 3.02765196,9.64946919 2.4949157,9.02132618 C1.96217944,8.39318317 1.69581531,7.66390943 1.69581531,6.83348307 L1.69581531,6.79089732 C2.18868695,7.06060844 2.71779122,7.20610831 3.28314398,7.2274013 C2.80476857,6.91510421 2.42424838,6.50699481 2.14157199,6.00306087 C1.85889561,5.49912693 1.71755954,4.95261522 1.71755954,4.36350934 C1.71755954,3.73891516 1.87701562,3.16046446 2.19593256,2.62813987 C3.07295416,3.68569138 4.1402227,4.53207478 5.3977702,5.16731545 C6.6553177,5.80255612 8.00163438,6.15565947 9.43676063,6.22663608 C9.37877573,5.95692495 9.34978372,5.69431543 9.34978372,5.43879963 C9.34978372,4.48771304 9.69225189,3.67681741 10.3771985,3.00608844 C11.0621451,2.33535946 11.8902295,2 12.8614766,2 C13.8762123,2 14.7314768,2.36197529 15.4272956,3.08593673 C16.2173398,2.93688584 16.9602602,2.66008121 17.656079,2.25551452 C17.3878988,3.07174556 16.8732906,3.70342792 16.1122388,4.15058057 C16.7863132,4.07960396 17.4603775,3.9021651 18.134452,3.61825865 C17.6488285,4.31382944 17.0617402,4.90647526 16.3731695,5.39621388 C16.3804176,5.49558113 16.3840416,5.64462978 16.3840416,5.84336429 C16.3840416,6.76606024 16.2463295,7.68696796 15.9709013,8.60611508 C15.695473,9.5252622 15.2769008,10.4071334 14.7151721,11.251755 C14.1534434,12.0963767 13.484815,12.8433943 12.709267,13.4928303 C11.933719,14.1422663 10.9987265,14.6603878 9.90426154,15.0472104 C8.80979657,15.4340329 7.63924398,15.6274413 6.39256865,15.6274413 C4.42833019,15.6274413 2.63082529,15.1128685 1,14.0837077 L1,14.0837077 Z" fill="#FFFFFF"></path> + </g> </g> </g> </g> -- 2.45.3 From a3b826fa87ad007da0f4a60af209cfbd4ea1c9fb Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { <div className='visible-content' data-name={this.props.name}> {this.props.top} <button className='collapse-button' onClick={this.collapse}> - {this.state.closed ? <Icon.MinusCircle /> : <Icon.PlusCircle /> } + {this.state.closed ? <Icon.MinusCircle /> : <Icon.PlusCircle className='plus-icon' /> } </button> </div> <div className='collapse-content' data-name={this.props.name}> -- 2.45.3 From 907604f7a4c2615afc282d01b513c9ffadb88352 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From 24432af4545e9e1508411846ac8038326970bc4d Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { -- 2.45.3 From 33ed0e8f592bcdee4dce34fe1e19a45461c00e91 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; } -- 2.45.3 From 954bc189d72e90d0b870ddbb5fbd9afa9c687c72 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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(/</g, '\\\u003c')} </script> <script src="/bundle/bundle.js"></script> - <script src="/assets/js/feather.min.js"></script> </body> </html> `; -- 2.45.3 From 22a5b2581dd52b0118fb333fa74cf807176b3fc0 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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={ <div className='asset-information'> - {channelName && ( + <div className='tablet-inline-row'> + {channelName && ( + <Row> + <RowLabeledAlt + label={ + <Label value={'Channel'} /> + } + content={ + <span className='text'> + <Link className='link--brand link--hover' to={`/${channelName}:${certificateId}`}>{channelName}</Link> + </span> + } + /> + </Row> + )} + <Row> <RowLabeledAlt label={ - <Label value={'Channel'} /> + <Label value={'Share'} /> } content={ - <span className='text'> - <Link className='link--brand link--hover' to={`/${channelName}:${certificateId}`}>{channelName}</Link> - </span> + <AssetShareButtons + host={host} + name={name} + shortId={shortId} + /> + } + /> + </Row> + </div> + <div className='tablet-inline-row'> + <Row> + <RowLabeledAlt + label={ + <Label value={'Link'} /> + } + content={ + <ClickToCopy + id={'short-link'} + value={`${host}/${shortId}/${name}`} + /> } /> </Row> - )} - <Row> - <RowLabeledAlt - label={ - <Label value={'Share'} /> - } - content={ - <AssetShareButtons - host={host} - name={name} - shortId={shortId} - /> - } - /> - </Row> - - <Row> - <RowLabeledAlt - label={ - <Label value={'Link'} /> - } - content={ - <ClickToCopy - id={'short-link'} - value={`${host}/${shortId}/${name}`} - /> - } - /> - </Row> - - <Row> - <RowLabeledAlt - label={ - <Label value={'Embed'} /> - } - content={ - <div> - {(contentType === 'video/mp4') ? ( - <ClickToCopy - id={'embed-text-video'} - value={`<video width="100%" controls poster="${thumbnail}" src="${host}/${claimId}/${name}.${fileExt}"/></video>`} - /> - ) : ( - <ClickToCopy - id={'embed-text-image'} - value={`<img src="${host}/${claimId}/${name}.${fileExt}"/>`} - /> - )} - </div> - } - /> - </Row> + <Row> + <RowLabeledAlt + label={ + <Label value={'Embed'} /> + } + content={ + <div> + {(contentType === 'video/mp4') ? ( + <ClickToCopy + id={'embed-text-video'} + value={`<video width="100%" controls poster="${thumbnail}" src="${host}/${claimId}/${name}.${fileExt}"/></video>`} + /> + ) : ( + <ClickToCopy + id={'embed-text-image'} + value={`<img src="${host}/${claimId}/${name}.${fileExt}"/>`} + /> + )} + </div> + } + /> + </Row> + </div> <Row> <SpaceBetween> -- 2.45.3 From 7c31510b83dd2e24ea47d212a07a23809ce99784 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { -- 2.45.3 From 6efff66267b52dbdb5345a0b9b2450398651f343 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; } } -- 2.45.3 From e9a8b5288e90cb4b63be8973a5c913b239b68d4d Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From 585e7dada38cc7276db9a1f61121c85835816bda Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { -- 2.45.3 From 7e51a56388c25c09a639ae5278ae3fc4e85d785c Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { <div className={'nav-bar'}> <SpaceBetween > <Logo /> - <SiteDescription /> <NavigationLinks /> </SpaceBetween> </div> 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 { <div className='visible-content' data-name={this.props.name}> {this.props.top} <button className='collapse-button' onClick={this.collapse}> - {this.state.closed ? <Icon.MinusCircle /> : <Icon.PlusCircle className='plus-icon' /> } + {this.state.closed ? <Icon.PlusCircle className='plus-icon' /> : <Icon.MinusCircle /> } </button> </div> <div className='collapse-content' data-name={this.props.name}> 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 ( <div className='asset-information-wrap'> <HorizontalSplit -- 2.45.3 From bb19e4bb3a4fe8e3770775a2cd166388f5c21643 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 { -- 2.45.3 From 35d0da670cf6468247bc3770935425bf33fa9c6f Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 ( <div className='asset-information-wrap'> <HorizontalSplit @@ -135,16 +135,18 @@ class AssetInfo extends React.Component { Hosted via the <a className={'link--brand link--hover'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain </p> </Row> - <div className='claim-address'> - <RowLabeledAlt - label={ - <Label value={'Claim Address'} /> - } - content={ - <a className={'link--brand link--hover'} href={'https://lbry.io/get'} target={'_blank'}>Place Claim Address Here</a> - } - /> - </div> + {address && ( + <div className='claim-address'> + <RowLabeledAlt + label={ + <Label value={'Claim Address'} /> + } + content={ + <a className={'link--brand link--hover'} href={'https://lbry.io/get'} target={'_blank'}>{address}</a> + } + /> + </div> + )} </div> </div> -- 2.45.3 From 7373365ad88d68074b3793829c82184702a7d764 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="14px" height="8px" viewBox="0 0 14 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>chevron-down</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> + <polyline id="chevron-down" stroke="#000000" stroke-width="1.2" fill-rule="nonzero" points="13 1 7 7 1 1"></polyline> + </g> +</svg> \ 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 -- 2.45.3 From 8ade24f501f61b19667524455712e9d40168c733 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From fe2bc7de6974a4e2f102a12d8b27fa0c1c2ce89a Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From 696d39e6c7e4f5589dab006e1f642efe547ee3fd Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From 5c1e8cd808ad9f9cfc628020919cc39f68f203b9 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; + } + } } -- 2.45.3 From be2d3cb3da2e03ff343b68b5583933e91a243e3d Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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'; -- 2.45.3 From e6f634cf9dd437559fe8f91210748f38b0a0be26 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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 ( <div className={'vertical-split'}> <div className='visible-content' data-name={this.props.name}> -- 2.45.3 From 9b210d3ad89476700714f3af3a1a38b097d46c14 Mon Sep 17 00:00:00 2001 From: Minesh Mitha <minesh@mineshs-MBP.local> 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; -- 2.45.3 From 51bd1ba0701006d7540993a793d47ad87fd9c38e Mon Sep 17 00:00:00 2001 From: Sania <hello@sania.io> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="10px" height="17px" viewBox="0 0 10 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>facebook</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded-Copy-2" transform="translate(-878.000000, -918.000000)" fill="#FFFFFF" fill-rule="nonzero"> <g id="Group-11" transform="translate(0.000000, 656.000000)"> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>icn_facebook</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded" transform="translate(-867.000000, -911.000000)" fill-rule="nonzero"> <g id="icn_facebook" transform="translate(867.000000, 911.000000)"> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>icn_reddit</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded" transform="translate(-955.000000, -911.000000)" fill-rule="nonzero"> <g id="icn_reddit" transform="translate(955.000000, 911.000000)"> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>icn_tumblr</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded" transform="translate(-911.000000, -911.000000)" fill-rule="nonzero"> <g id="icn_tumblr" transform="translate(911.000000, 911.000000)"> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>icn_twitter</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded" transform="translate(-823.000000, -911.000000)" fill-rule="nonzero"> <g id="icn_twitter" transform="translate(823.000000, 911.000000)"> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="18px" height="16px" viewBox="0 0 18 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>reddit</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded-Copy-2" transform="translate(-961.000000, -918.000000)" fill="#FFFFFF" fill-rule="nonzero"> <g id="Group-11" transform="translate(0.000000, 656.000000)"> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="10px" height="16px" viewBox="0 0 10 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>tumblr</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded-Copy-2" transform="translate(-921.000000, -918.000000)" fill="#FFFFFF" fill-rule="nonzero"> <g id="Group-11" transform="translate(0.000000, 656.000000)"> 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 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="18px" height="14px" viewBox="0 0 18 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> - <title>twitter</title> - <desc>Created with Sketch.</desc> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Route-4---Expanded-Copy-2" transform="translate(-830.000000, -920.000000)" fill-rule="nonzero"> <g id="Group-11" transform="translate(0.000000, 656.000000)"> -- 2.45.3 From 7b0c7bfee835c2ae83e1fc6afeb084607a33649c Mon Sep 17 00:00:00 2001 From: Minesh <minesh@windows-laptop> 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; } -- 2.45.3 From 68bbf95dcf82a3c44f7eb33cb1b023347b1e2d2f Mon Sep 17 00:00:00 2001 From: Minesh <minesh@windows-laptop> 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 { -- 2.45.3 From 92a9ad2febb7688d8e6ad32ffee233ee8dfdfdca Mon Sep 17 00:00:00 2001 From: Minesh <minesh@windows-laptop> 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; -- 2.45.3 From 41d7f6e56f58ed6cbe60a98c60c391f120daf9f4 Mon Sep 17 00:00:00 2001 From: Minesh <minesh@windows-laptop> 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 ( <div className={'vertical-split'}> - <div className='visible-content' data-name={this.props.name}> - {this.props.top} + <div className='visible-content' data-name={props.name}> + {props.top} <button className='collapse-button' onClick={this.collapse}> - {this.state.closed ? <Icon.PlusCircle className='plus-icon' /> : <Icon.MinusCircle /> } + {state.closed ? <Icon.PlusCircle className='plus-icon' /> : <Icon.MinusCircle />} </button> </div> - <div className='collapse-content' data-name={this.props.name}> - {this.props.bottom} + <div className='collapse-content' data-name={props.name}> + {props.bottom} </div> </div> ); -- 2.45.3 From b33c7b93a93b4b6468f4b01b427d2f72f1647e7f Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman <kauffj@gmail.com> 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 { } })() } - <AssetTitle /> </div> + <AssetTitle /> </div> ); } 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 ( - <div> - {channelName && ( - <Row> - <RowLabeled - label={ - <Label value={'Channel:'} /> - } - content={ - <span className='text'> - <Link to={channelCanonicalUrl}>{channelName}</Link> - </span> - } - /> - </Row> - )} - - {claimViews ? ( - <Row> - <RowLabeled - label={ - <Label value={'Views:'} /> - } - content={ - <span className='text'> - {claimViews} - </span> - } - /> - </Row> - ) : null} - - <Row> - <RowLabeled - label={ - <Label value={'Share:'} /> - } - content={ - <AssetShareButtons - name={name} - assetUrl={assetCanonicalUrl} - /> - } - /> - </Row> - - <Row> - <RowLabeled - label={ - <Label value={'Link:'} /> - } - content={ - <ClickToCopy - id={'short-link'} - value={assetCanonicalUrl} - /> - } - /> - </Row> - - <Row> - <RowLabeled - label={ - <Label value={'Embed:'} /> - } - content={ - <div> - {(contentType === 'video/mp4') ? ( - <ClickToCopy - id={'embed-text-video'} - value={`<iframe src="${host}/video-embed${canonicalUrl}" allowfullscreen="true" style="border:0" /></iframe>`} + <div className='asset-information-wrap'> + <HorizontalSplit + leftSide={ + description && ( + <Row> + <p>{description}</p> + </Row> + ) + } + rightSide={ + <div> + {channelName && ( + <Row> + <RowLabeled + label={ + <Label value={'Channel:'} /> + } + content={ + <span className='text'> + <Link to={channelCanonicalUrl}>{channelName}</Link> + </span> + } /> - ) : ( - <ClickToCopy - id={'embed-text-image'} - value={`<img src="${assetCanonicalUrl}.${fileExt}"/>`} + </Row> + )} + + {claimViews ? ( + <Row> + <RowLabeled + label={ + <Label value={'Views:'} /> + } + content={ + <span className='text'> + {claimViews} + </span> + } /> - )} - </div> - } - /> - </Row> + </Row> + ) : null} - <Row> - <SpaceBetween> - <a - className='link--primary' - href={`${assetCanonicalUrl}.${fileExt}`} - > - Direct Link - </a> - <a - className={'link--primary'} - href={`${assetCanonicalUrl}.${fileExt}`} - download={name} - > - Download - </a> - <a - className={'link--primary'} - target='_blank' - href='https://lbry.io/dmca' - > - Report - </a> - </SpaceBetween> - </Row> + <Row> + <RowLabeled + label={ + <Label value={'Share:'} /> + } + content={ + <AssetShareButtons + name={name} + assetUrl={assetCanonicalUrl} + /> + } + /> + </Row> - {description && ( - <Row> - <p>{description}</p> - </Row> - )} + <Row> + <RowLabeled + label={ + <Label value={'Link:'} /> + } + content={ + <ClickToCopy + id={'short-link'} + value={assetCanonicalUrl} + /> + } + /> + </Row> + <Row> + <RowLabeled + label={ + <Label value={'Embed:'} /> + } + content={ + <div> + {(contentType === 'video/mp4') ? ( + <ClickToCopy + id={'embed-text-video'} + value={`<iframe src="${host}/video-embed${canonicalUrl}" allowfullscreen="true" style="border:0" /></iframe>`} + /> + ) : ( + <ClickToCopy + id={'embed-text-image'} + value={`<img src="${assetCanonicalUrl}.${fileExt}"/>`} + /> + )} + </div> + } + /> + </Row> + + <Row> + <SpaceBetween> + <a + className='link--primary' + href={`${assetCanonicalUrl}.${fileExt}`} + > + Direct Link + </a> + <a + className={'link--primary'} + href={`${assetCanonicalUrl}.${fileExt}`} + download={name} + > + Download + </a> + <a + className={'link--primary'} + target='_blank' + href='https://lbry.io/dmca' + > + Report + </a> + </SpaceBetween> + </Row> + </div> + } /> <Row> <p> Hosted via the <a className={'link--primary'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain </p> </Row> - </div> ); } -- 2.45.3 From 61b8cd9fcfbaf9b99389653381267134b3c10049 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman <kauffj@gmail.com> 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 = () => { <div> <Row> <p className={'text--large'}> - <Link to='/tos'>Terms of Service</Link> + <Link className={'link--primary'} to='/tos'>Terms of Service</Link> <br /> - <Link to='/faq'>Frequently Asked Questions</Link> + <Link className={'link--primary'} to='/faq'>Frequently Asked Questions</Link> </p> </Row> <Row> 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 = () => { <p className={'text--extra-large'}>Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.</p> </Row> <Row> - <p className={'text--large'}> - <a className='link--primary' target='_blank' href='https://twitter.com/spee_ch'>TWITTER</a> - </p> - <p className={'text--large'}> - <a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch'>GITHUB</a> - </p> - <p className={'text--large'}> - <a className='link--primary' target='_blank' href='https://discord.gg/YjYbwhS'>DISCORD CHANNEL</a> - </p> - <p className={'text--large'}> - <a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch/blob/master/README.md'>DOCUMENTATION</a> - </p> + <div className={'text--large'}> + <a className='link--primary' target='_blank' href='https://twitter.com/spee_ch'>TWITTER</a><br/> + <a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch'>GITHUB</a><br/> + <a className='link--primary' target='_blank' href='https://discord.gg/YjYbwhS'>DISCORD CHANNEL</a><br/> + <a className='link--primary' target='_blank' href='https://github.com/lbryio/spee.ch/blob/master/README.md'>DOCUMENTATION</a><br/> + </div> </Row> </div> ); 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 ( + <div className='asset-footer'> + <p> + Hosted via the <a className={'link--primary'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain + </p> + </div> + ); +}; + +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}`} > - <img src='/assets/img/twitter.svg' /> + <img src='/assets/img/icn_twitter.svg' /> </a> <a className='link--primary facebook' target='_blank' href={`https://www.facebook.com/sharer/sharer.php?u=${assetUrl}`} > - <img src='/assets/img/facebook.svg' /> + <img src='/assets/img/icn_facebook.svg' /> </a> <a className='link--primary tumblr' target='_blank' href={`https://tumblr.com/widgets/share/tool?canonicalUrl=${assetUrl}`} > - <img src='/assets/img/tumblr.svg' /> + <img src='/assets/img/icn_tumblr.svg' /> </a> <a className='link--primary reddit' target='_blank' href={`https://www.reddit.com/submit?url=${assetUrl}&title=${name}`} > - <img src='/assets/img/reddit.svg' /> - </a> - <a - className='link--primary' - target='_blank' - href={`https://sharetomastodon.github.io/?title=${name}&url=${assetUrl}`} - > - mastodon - </a> - <a - className='link--primary' - target='_blank' - href={`https://share.diasporafoundation.org/?title=${name}&url=${assetUrl}`} - > - diaspora + <img src='/assets/img/icn_reddit.svg' /> </a> </SocialShareLink> ); }; +// +// Additional icons disabled. If you want to add additional icons, you have to solve +// https://github.com/lbryio/spee.ch/issues/687 +// +// <a +// className='link--primary' +// target='_blank' +// href={`https://sharetomastodon.github.io/?title=${name}&url=${assetUrl}`} +// > +// mastodon +// </a> +// <a +// className='link--primary' +// target='_blank' +// href={`https://share.diasporafoundation.org/?title=${name}&url=${assetUrl}`} +// > +// diaspora +// </a> 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 ( <button type={type} - className={'button button-primary'} + className={'button button--primary'} onClick={onClickHandler} > {value} diff --git a/client/src/components/ButtonPrimaryJumbo/index.jsx b/client/src/components/ButtonPrimaryJumbo/index.jsx index d1631c15..f234ff7e 100644 --- a/client/src/components/ButtonPrimaryJumbo/index.jsx +++ b/client/src/components/ButtonPrimaryJumbo/index.jsx @@ -3,7 +3,7 @@ import React from 'react'; const ButtonPrimaryJumbo = ({ value, onClickHandler }) => { return ( <button - className={'button button-primary button-primary--jumbo'} + className={'button button--primary button--jumbo'} onClick={onClickHandler} > {value} diff --git a/client/src/components/ButtonTertiary/index.jsx b/client/src/components/ButtonTertiary/index.jsx deleted file mode 100644 index a1930a05..00000000 --- a/client/src/components/ButtonTertiary/index.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -const ButtonTertiary = ({ value, onClickHandler }) => { - return ( - <button - className={'button button--tertiary'} - onClick={onClickHandler} - > - {value} - </button> - ); -}; - -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 ( - <div> - <p className={'text--large'}>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 <a className='link--primary' target='_blank' href='/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8'>documenting important events</a>, or making a public repository for <a className='link--primary' target='_blank' href='/@catGifs'>cat gifs</a> (password: '1234'), try creating a channel for it!</p> + <div className={'text--large'}> + <p>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.</p> + <p>You can create 1 channel, or 100, so whether you're <a className='link--primary' target='_blank' href='/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8'>documenting important events</a>, or making a public repository for <a className='link--primary' target='_blank' href='/@catGifs'>cat gifs</a> (password: '1234'), try creating a channel for it!</p> </div> ); }; 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 ( - <div className={'column'}> - {this.props.children} - </div> - ); - } -} - -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 ( <div className={'dropzone-dropit-display'}> - <p className={'text--interactive'}>Drop it.</p> + Drop it. </div> ); } 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 ( <div className={'dropzone-instructions-display'}> <Row> - <p className={'text--large'}>Drag & drop image or video here to publish</p> + <span className={'text--large'}>Drag & drop image or video here to publish</span> </Row> <Row> - <p className={'text--small'}>OR</p> + <span className={'text--small text--secondary'}>OR</span> </Row> { fileError ? ( <div> <Row> - <p className={'text--large text--underline'}>CHOOSE FILE</p> + <span className={'text--large dropzone-instructions-display__chooser-label'}>CHOOSE FILE</span> </Row> <FormFeedbackDisplay errorMessage={fileError} @@ -22,7 +22,7 @@ const DropzoneInstructionsDisplay = ({fileError}) => { /> </div> ) : ( - <p className={'text--large text--underline'}>CHOOSE FILE</p> + <span className={'text--large dropzone-instructions-display__chooser-label'}>CHOOSE FILE</span> )} </div> ); 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 ( <div className={'form-feedback'}> { errorMessage ? ( - <p className={'text--small text--failure'}>{errorMessage}</p> + <span className={'text--small text--failure'}>{errorMessage}</span> ) : ( <div> { defaultMessage ? ( - <p className={'text--small text--secondary'}>{defaultMessage}</p> + <span className={'text--small text--secondary'}>{defaultMessage}</span> ) : ( - <p className={'text--small'}> </p> + <span className={'text--small'}> </span> )} </div> )} 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 ( - <div className={'horizontal-quad-split'}> - <div className={'left-side'}> - <div className={'column-a'}> - <Row> - {this.props.columnA} - </Row> - </div> - <div className={'column-b'}> - <Row> - {this.props.columnB} - </Row> - </div> - </div> - <div className={'right-side'}> - <div className={'column-c'}> - <Row> - {this.props.columnC} - </Row> - </div> - <div className={'column-d'}> - <Row> - {this.props.columnD} - </Row> - </div> - </div> - </div> - ); - } -} - -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 ( <div className={'horizontal-split'}> - <div className={'column'}> + <div className={'horizontal-split__column horizontal-split__column--left'}> {this.props.leftSide} </div> - <div className={'column'}> + <div className={'horizontal-split__column horizontal-split__column--right'}> {this.props.rightSide} </div> </div> 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 ( - <div> - <Row> - <PublishTitleInput /> - </Row> + <div className={'publish-form'}> + <div className={'publish-form__title'}> + <Row> + <PublishTitleInput /> + </Row> + </div> <HorizontalSplit leftSide={<Dropzone />} rightSide={<PublishDetails />} 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 ( - <div className={'row-labeled-alt'}> - <div className={'row-labeled-label'}>{this.props.label}</div> - <div className={'row-labeled-content'}>{this.props.content}</div> - </div> - ); - } -} - -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 ( - <div className='asset-information-wrap'> + <div className='asset-info'> <HorizontalSplit leftSide={ description && ( - <Row> - <p>{description}</p> - </Row> + <p className='asset-info__description'>{description}</p> ) } rightSide={ <div> {channelName && ( - <Row> - <RowLabeled - label={ - <Label value={'Channel:'} /> - } - content={ - <span className='text'> - <Link to={channelCanonicalUrl}>{channelName}</Link> - </span> - } - /> - </Row> + <RowLabeled + label={ + <Label value={'Channel'} /> + } + content={ + <span className='text'> + <Link className='link--primary' to={channelCanonicalUrl}>{channelName}</Link> + </span> + } + /> )} {claimViews ? ( - <Row> - <RowLabeled - label={ - <Label value={'Views:'} /> - } - content={ - <span className='text'> - {claimViews} - </span> - } - /> - </Row> + <RowLabeled + label={ + <Label value={'Views'} /> + } + content={ + <span className='text'> + {claimViews} + </span> + } + /> ) : null} - <Row> - <RowLabeled - label={ - <Label value={'Share:'} /> - } - content={ - <AssetShareButtons - name={name} - assetUrl={assetCanonicalUrl} - /> - } - /> - </Row> + <RowLabeled + label={ + <Label value={'Share'} /> + } + content={ + <AssetShareButtons + name={name} + assetUrl={assetCanonicalUrl} + /> + } + /> - <Row> - <RowLabeled - label={ - <Label value={'Link:'} /> - } - content={ - <ClickToCopy - id={'short-link'} - value={assetCanonicalUrl} - /> - } - /> - </Row> + <RowLabeled + label={ + <Label value={'Link'} /> + } + content={ + <ClickToCopy + id={'short-link'} + value={assetCanonicalUrl} + /> + } + /> - <Row> - <RowLabeled - label={ - <Label value={'Embed:'} /> - } - content={ - <div> - {(contentType === 'video/mp4') ? ( - <ClickToCopy - id={'embed-text-video'} - value={`<iframe src="${host}/video-embed${canonicalUrl}" allowfullscreen="true" style="border:0" /></iframe>`} - /> - ) : ( - <ClickToCopy - id={'embed-text-image'} - value={`<img src="${assetCanonicalUrl}.${fileExt}"/>`} - /> - )} - </div> - } - /> - </Row> + <RowLabeled + label={ + <Label value={'Embed'} /> + } + content={ + <div> + {(contentType === 'video/mp4') ? ( + <ClickToCopy + id={'embed-text-video'} + value={`<iframe src="${host}/video-embed${canonicalUrl}" allowfullscreen="true" style="border:0" /></iframe>`} + /> + ) : ( + <ClickToCopy + id={'embed-text-image'} + value={`<img src="${assetCanonicalUrl}.${fileExt}"/>`} + /> + )} + </div> + } + /> - <Row> - <SpaceBetween> - <a - className='link--primary' - href={`${assetCanonicalUrl}.${fileExt}`} - > - Direct Link - </a> - <a - className={'link--primary'} - href={`${assetCanonicalUrl}.${fileExt}`} - download={name} - > - Download - </a> - <a - className={'link--primary'} - target='_blank' - href='https://lbry.io/dmca' - > - Report - </a> - </SpaceBetween> - </Row> + <SpaceBetween> + <a + className='link--primary' + href={`${assetCanonicalUrl}.${fileExt}`} + > + Direct Link + </a> + <a + className={'link--primary'} + href={`${assetCanonicalUrl}.${fileExt}`} + download={name} + > + Download + </a> + <a + className={'link--primary'} + target='_blank' + href='https://lbry.io/dmca' + > + Report + </a> + </SpaceBetween> </div> } /> - <Row> - <p> - Hosted via the <a className={'link--primary'} href={'https://lbry.io/get'} target={'_blank'}>LBRY</a> blockchain - </p> - </Row> + <AssetInfoFooter/> </div> ); } 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 { </form> ) : ( <div> - <p className={'text--small text--secondary'}>{status}</p> + <span className={'text--small text--secondary'}>{status}</span> <ProgressBar size={12} /> </div> )} 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 ( <div> <Row> - <h3>Log in to an existing channel:</h3> + <h3>Log in to existing channel</h3> <ChannelLoginForm /> </Row> {!this.props.closedRegistration && (<Row> - <h3>Create a brand new channel:</h3> + <h3>Create new channel</h3> <ChannelCreateForm /> </Row>)} </div> 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 { <Row> <SpaceAround> - <ButtonTertiary + <ButtonSecondary value={'Cancel'} onClickHandler={this.props.clearFile} /> 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 ( <div> {this.props.showMetadataInputs && ( - <div> - <PublishDescriptionInput - description={this.props.description} - handleInput={this.handleInput} - /> - <PublishLicenseInput - handleSelect={this.handleSelect} - /> - <PublishNsfwInput - nsfw={this.props.nsfw} - handleInput={this.handleInput} - /> - </div> + <React.Fragment> + <Row> + <PublishDescriptionInput + description={this.props.description} + handleInput={this.handleInput} + /> + </Row> + <Row> + <PublishLicenseInput + handleSelect={this.handleSelect} + /> + </Row> + <Row> + <PublishNsfwInput + nsfw={this.props.nsfw} + handleInput={this.handleInput} + /> + </Row> + </React.Fragment> )} <ButtonSecondary value={this.props.showMetadataInputs ? 'less' : 'more'} diff --git a/client/src/containers/PublishThumbnailInput/view.jsx b/client/src/containers/PublishThumbnailInput/view.jsx index 654fbe1a..e5a01ad0 100644 --- a/client/src/containers/PublishThumbnailInput/view.jsx +++ b/client/src/containers/PublishThumbnailInput/view.jsx @@ -126,7 +126,7 @@ class PublishThumbnailInput extends React.Component { </div> </div> ) : ( - <p className={'text--small text--secondary'}>loading... </p> + <span className={'text--small text--secondary'}>loading... </span> ) } <FormFeedbackDisplay diff --git a/client/src/pages/ShowAssetDetails/view.jsx b/client/src/pages/ShowAssetDetails/view.jsx index 628dc5bc..09c11c5d 100644 --- a/client/src/pages/ShowAssetDetails/view.jsx +++ b/client/src/pages/ShowAssetDetails/view.jsx @@ -6,6 +6,16 @@ import AssetDisplay from '@containers/AssetDisplay'; import AssetInfo from '@containers/AssetInfo'; import ErrorPage from '@pages/ErrorPage'; +/* + + <VerticalCollapsibleSplit + name={'asset-display-collapse'} + top={} + bottom={<AssetInfo />} + /> + + */ + class ShowAssetDetails extends React.Component { render () { const { asset } = this.props; @@ -16,11 +26,8 @@ class ShowAssetDetails extends React.Component { pageTitle={`${name} - details`} asset={asset} > - <VerticalCollapsibleSplit - name={'asset-display-collapse'} - top={<AssetDisplay />} - bottom={<AssetInfo />} - /> + <AssetDisplay /> + </PageLayout> ); } -- 2.45.3 From 33cf063fbb7015d521a0ffd6fce68d29c1983544 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman <kauffj@gmail.com> 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} /> } + </div> </div> <AssetTitle /> </div> -- 2.45.3 From 44b5c27ef59184ec2c9f706cef4eae52242d0106 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman <kauffj@gmail.com> 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 ( - <div className={'vertical-split'}> - <div className='visible-content' data-name={props.name}> - {props.top} - <button className='collapse-button' onClick={this.collapse}> - {state.closed ? <Icon.PlusCircle className='plus-icon' /> : <Icon.MinusCircle />} - </button> - </div> - <div className='collapse-content' data-name={props.name}> - {props.bottom} - </div> - </div> - ); - } -}; - -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 ( - <div className={'asset-display-wrap'}> - <div className={'asset-display'}> - <div className={'asset-display'}> - {(status === LOCAL_CHECK) && - <div> - <p>Checking to see if Spee.ch has your asset locally...</p> - </div> - } - {(status === UNAVAILABLE) && - <div> - <p>Sit tight, we're searching the LBRY blockchain for your asset!</p> - <ProgressBar size={12} /> - <p>Curious what magic is happening here? <a className='link--primary' target='blank' href='https://lbry.io/faq/what-is-lbry'>Learn more.</a></p> - </div> - } - {(status === ERROR) && - <div> - <Row> - <p>Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the following error message in the <a className='link--primary' href='https://chat.lbry.io' target='_blank'>LBRY discord</a>.</p> - </Row> - <Row> - <p id='error-message'><i>{error}</i></p> - </Row> - </div> - } - {(status === AVAILABLE) && - <AvailableContent - contentType={contentType} - sourceUrl={sourceUrl} - name={name} - thumbnail={thumbnail} - /> - } - </div> + <div className={'asset-display'}> + {(status === LOCAL_CHECK) && + <div> + <p>Checking to see if Spee.ch has your asset locally...</p> </div> - <AssetTitle /> + } + {(status === UNAVAILABLE) && + <div> + <p>Sit tight, we're searching the LBRY blockchain for your asset!</p> + <ProgressBar size={12} /> + <p>Curious what magic is happening here? <a className='link--primary' target='blank' href='https://lbry.io/faq/what-is-lbry'>Learn more.</a></p> + </div> + } + {(status === ERROR) && + <div> + <Row> + <p>Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the following error message in the <a className='link--primary' href='https://chat.lbry.io' target='_blank'>LBRY discord</a>.</p> + </Row> + <Row> + <p id='error-message'><i>{error}</i></p> + </Row> + </div> + } + {(status === AVAILABLE) && + <AvailableContent + contentType={contentType} + sourceUrl={sourceUrl} + name={name} + thumbnail={thumbnail} + /> + } </div> ); } 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 ( - <div className='asset-title-wrap'> - <h3 className='asset-title'>{title}</h3> - </div> + <h1 className='asset-title'>{title}</h1> ); }; 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'; - -/* - - <VerticalCollapsibleSplit - name={'asset-display-collapse'} - top={} - bottom={<AssetInfo />} - /> - - */ +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} > <AssetDisplay /> - + <AssetTitle /> + <button className='collapse-button' onClick={this.collapse}> + {this.state.closed ? <Icon.PlusCircle className='plus-icon' /> : <Icon.MinusCircle />} + </button> + { !this.state.closed && <AssetInfo /> } </PageLayout> ); } -- 2.45.3 From 3bbe2582e5349f1bcc9849893d348008e208d30c Mon Sep 17 00:00:00 2001 From: Sean Yesmunt <sean@lbry.io> 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 ( <select id='channel-name-select' - className='select select--arrow' value={selectedChannel} onChange={handleSelection}> { loggedInChannelName && ( diff --git a/client/src/components/FormFeedbackDisplay/index.jsx b/client/src/components/FormFeedbackDisplay/index.jsx index c324c7f0..9050f4e2 100644 --- a/client/src/components/FormFeedbackDisplay/index.jsx +++ b/client/src/components/FormFeedbackDisplay/index.jsx @@ -1,7 +1,7 @@ import React from 'react'; const FormFeedbackDisplay = ({ errorMessage, defaultMessage }) => { - return ( + return (errorMessage || defaultMessage) ? ( <div className={'form-feedback'}> { errorMessage ? ( <span className={'text--small text--failure'}>{errorMessage}</span> @@ -15,7 +15,7 @@ const FormFeedbackDisplay = ({ errorMessage, defaultMessage }) => { </div> )} </div> - ); + ) : null; }; export default FormFeedbackDisplay; diff --git a/client/src/components/HorizontalSplit/index.jsx b/client/src/components/HorizontalSplit/index.jsx index 7b82a2c1..6bcbe6b4 100644 --- a/client/src/components/HorizontalSplit/index.jsx +++ b/client/src/components/HorizontalSplit/index.jsx @@ -2,13 +2,26 @@ import React from 'react'; class HorizontalSplit extends React.Component { render () { + const { leftSide, rightSide, collapseOnMobile } = this.props; + + let className = 'horizontal-split'; + if (collapseOnMobile) { + className += " horizontal-split--mobile-collapse"; + } + + // If there is no left side, move the right side to the left + // This is mostly for content with no description + // It doesn't need to be on the right side with nothing next to it. + const leftComponent = leftSide || rightSide; + const rightComponent = leftSide ? rightSide : null; + return ( - <div className={'horizontal-split'}> + <div className={className}> <div className={'horizontal-split__column horizontal-split__column--left'}> - {this.props.leftSide} + {leftComponent} </div> <div className={'horizontal-split__column horizontal-split__column--right'}> - {this.props.rightSide} + {rightComponent} </div> </div> ); diff --git a/client/src/components/NavBarChannelOptionsDropdown/index.jsx b/client/src/components/NavBarChannelOptionsDropdown/index.jsx index 4274df26..20133416 100644 --- a/client/src/components/NavBarChannelOptionsDropdown/index.jsx +++ b/client/src/components/NavBarChannelOptionsDropdown/index.jsx @@ -6,7 +6,6 @@ function NavBarChannelDropdown ({ channelName, handleSelection, defaultSelection <select type='text' id='nav-bar-channel-select' - className='select select--arrow' onChange={handleSelection} value={defaultSelection} > 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 ( - <div> + <div className="progress-bar__wrapper"> {this.state.bars.map((bar, index) => bar.isActive ? <ActiveStatusBar key={index} /> : <InactiveStatusBar key={index}/>)} </div> ); 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} > <option value=''>Unspecified</option> 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 { </Row> </div> <HorizontalSplit + collapseOnMobile leftSide={<Dropzone />} rightSide={<PublishDetails />} /> 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 ( <div> { !status ? ( - <form onSubmit={this.handleSubmit}> + <form className="form-group" onSubmit={this.handleSubmit}> <ChannelCreateNameInput value={name.value} error={name.error} @@ -69,10 +69,7 @@ class ChannelCreateForm extends React.Component { value={password.value} handlePasswordInput={this.handlePasswordInput} /> - <FormFeedbackDisplay - errorMessage={formError} - defaultMessage={'Choose a name and password for your channel'} - /> + <FormFeedbackDisplay errorMessage={formError} /> <ButtonPrimary type={'submit'} value={'Create Channel'} diff --git a/client/src/containers/ChannelLoginForm/view.jsx b/client/src/containers/ChannelLoginForm/view.jsx index 54dd8ad2..804e6936 100644 --- a/client/src/containers/ChannelLoginForm/view.jsx +++ b/client/src/containers/ChannelLoginForm/view.jsx @@ -49,7 +49,7 @@ class ChannelLoginForm extends React.Component { } render () { return ( - <form onSubmit={this.loginToChannel}> + <form className="form-group" onSubmit={this.loginToChannel}> <ChannelLoginNameInput channelName={this.state.channelName} handleInput={this.handleInput} @@ -58,10 +58,7 @@ class ChannelLoginForm extends React.Component { channelPassword={this.state.channelPassword} handleInput={this.handleInput} /> - <FormFeedbackDisplay - errorMessage={this.state.error} - defaultMessage={'Enter the name and password for your channel'} - /> + <FormFeedbackDisplay errorMessage={this.state.error} /> <ButtonPrimary type={'submit'} value={'Authenticate'} diff --git a/client/src/containers/ChannelSelect/view.jsx b/client/src/containers/ChannelSelect/view.jsx index d04007d5..b8276a3d 100644 --- a/client/src/containers/ChannelSelect/view.jsx +++ b/client/src/containers/ChannelSelect/view.jsx @@ -40,16 +40,16 @@ class ChannelSelect extends React.Component { const { publishInChannel, channelError, selectedChannel, loggedInChannelName, publishOnlyApproved } = this.props; if (publishOnlyApproved) { return ( - <div> + <React.Fragment> <RowLabeled label={<Label value={'Channel:'} />} content={<span>{loggedInChannelName}</span>} /> - </div> + </React.Fragment> ); } return ( - <div> + <React.Fragment> <RowLabeled label={ <ChooseAnonymousPublishRadio @@ -87,7 +87,7 @@ class ChannelSelect extends React.Component { { (selectedChannel === CREATE) && <ChannelCreateForm /> } </div> )} - </div> + </React.Fragment> ); } } 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 ( <div> - <Row> - <h3>Log in to existing channel</h3> - <ChannelLoginForm /> - </Row> - {!this.props.closedRegistration && (<Row> - <h3>Create new channel</h3> - <ChannelCreateForm /> - </Row>)} + <h3 className="form-title">Log in to existing channel</h3> + <ChannelLoginForm /> + {!this.props.closedRegistration && ( + <React.Fragment> + <h3 className="form-title">Create new channel</h3> + <ChannelCreateForm /> + </React.Fragment> + )} </div> ); } 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 ( - <div> + <React.Fragment> {isUpdate && fileExt === 'mp4' ? ( <p>Video updates are currently disabled. This feature will be available soon. You can edit metadata.</p> ) : ( @@ -145,7 +145,7 @@ class Dropzone extends React.Component { </div> </div> )} - </div> + </React.Fragment> ); } }; 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 ( <div> {isUpdate ? (asset && ( - <Row> + <React.Fragment> <RowLabeled label={ <Label value={'Channel:'} /> @@ -56,16 +56,14 @@ class PublishDetails extends React.Component { </span> } /> - </Row> + </React.Fragment> )) : ( <React.Fragment> <Row> <PublishUrlInput /> </Row> - <Row> - <ChannelSelect /> - </Row> + <ChannelSelect /> </React.Fragment> )} 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 { <div> {(showMetadataInputs || isUpdate) && ( <React.Fragment> - <Row> - <PublishDescriptionInput - description={this.props.description} - handleInput={this.handleInput} - /> - </Row> - <Row> - <PublishLicenseInput - handleSelect={this.handleSelect} - /> - </Row> - <Row> - <PublishNsfwInput - nsfw={this.props.nsfw} - handleInput={this.handleInput} - /> - </Row> + <PublishDescriptionInput + description={this.props.description} + handleInput={this.handleInput} + /> + <PublishLicenseInput + handleSelect={this.handleSelect} + /> + <PublishNsfwInput + nsfw={this.props.nsfw} + handleInput={this.handleInput} + /> </React.Fragment> )} {!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'} > <HorizontalSplit + collapseOnMobile leftSide={<AboutSpeechOverview />} rightSide={<AboutSpeechDetails />} /> 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'} > <HorizontalSplit + collapseOnMobile leftSide={<ChannelAbout />} rightSide={<ChannelTools />} /> 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} > - <AssetDisplay /> - <AssetTitle /> - <button className='collapse-button' onClick={this.collapse}> - {this.state.closed ? <Icon.PlusCircle className='plus-icon' /> : <Icon.MinusCircle />} - </button> - { !this.state.closed && <AssetInfo /> } + <div className="asset-main"> + <AssetDisplay /> + <AssetTitle /> + + <button className='collapse-button' onClick={this.collapse}> + {this.state.closed ? <Icon.PlusCircle className='plus-icon' /> : <Icon.MinusCircle />} + </button> + </div> + {!this.state.closed && <AssetInfo />} </PageLayout> ); } 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 +} -- 2.45.3 From 440c12a7aa78a3667cdfb668b51895fa041bcb3b Mon Sep 17 00:00:00 2001 From: Jessop Breth <jessopb@gmail.com> 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 -- 2.45.3 From a740f6dba1bd744a6927cc17dad07deee285580c Mon Sep 17 00:00:00 2001 From: Jessop Breth <jessopb@gmail.com> 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" } -- 2.45.3 From 0b2b7fff929e04433a7da214340425a87f444e9c Mon Sep 17 00:00:00 2001 From: Travis Eden <daovist@gmail.com> 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]; -- 2.45.3 From 0c9c1563e7236be4b079ce2eac3e163916faf148 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt <sean@lbry.io> 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*/ -- 2.45.3 From b5efb5f08f55fb6f7ff0cdc0dccc2ddc0cf3f339 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt <sean@lbry.io> 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<Nc;i$57MNh<_~}pfl{PML_vk<C@2tb{A0PSIEr+Uo~5t6e)Ha&_dai2tafAX z?wuVc8h8Y*i-f%U%gcM;Zn$Lk3L!_d7UIw@{QuSZUEdEUO_o!gAGMCdq+oogOU?&L z3J<xEi=mc=Z#N$Yhq}m5&4CL@013P<fpcU$@|&0RihJ3)^v=QSCc-!*fCP{L5<mh- z00|%gB!C3oKmw*bL%xE#H@e!dcK0)D_wEsINB{{S0VIF~kN^@u0!RP}AOR$R1dzZR zNPsdz{Ii6-1liyJ`|tmMUm)an&@<3apzlGCK>~CZ^cLu^^Mw2idJ1|1dJOs+^aW@i zbQARFImiuq4*CJ~4d^pa2>Rn~LVg5&2f7d11Noq9p!Yx<px>abU%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<GWoFCN+%}XFFVLy5Kg$ zj0;*T<CJx*q)uhNaC$E%>)h6&Axu!Ed1t1KNh6D#wtH_eRzY0T?Y+-CACuNuoKvZ` z+bZucyLS|_P>ckN{9rnnGM;S4UNlNZB8p;f5+{Bb@_<jKefjHIY>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<xRx-QB6mK#wKwnEvtBk@6$w?%LkC%ws|H+uG#S9*7_3Hbq*2Yl8Na_W zmPKV#jXlq^Ib6mK%*dX`ldWV_Lnpgb>*Jzo2A3^&UbVID!O%6d_5p90XG_hKikl<8 zY~q?7Xl>H9^s51a-A#=t^^M``zv><jS->L^c+n>J$0CfU2_1{+W)O+ck9a7;Q4n~e zCLl?LqKiS9FS>VPjdy?6;a~3tusgF8<LD1+k7?a^zgcK|fYWWd^>tQ@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 -- 2.45.3 From eea5d67f02b184a8c2dc414309ae8ea4e79065cf Mon Sep 17 00:00:00 2001 From: Shawn K <skhameneh@gmail.com> 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 { -- 2.45.3 From 9dcf828db2875a062ddcc81dcc758eb8c63bed2d Mon Sep 17 00:00:00 2001 From: Sean Yesmunt <sean@lbry.io> 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 { -- 2.45.3 From 35698ca1c681e7d622db6b9ab5161ca26507a300 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt <sean@lbry.io> 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 -} -- 2.45.3