diff --git a/.env.defaults b/.env.defaults index ea7120e6a..2ff979fae 100644 --- a/.env.defaults +++ b/.env.defaults @@ -68,6 +68,7 @@ AUTO_FOLLOW_CHANNELS=lbry://@lbry#3fda836a92faaceedfe398225fb9b2ee2ed1f01a ## FEATURES AND LIMITS SIMPLE_SITE=false +#BRANDED_SITE ENABLE_COMMENT_REACTIONS=true ENABLE_FILE_REACTIONS=false diff --git a/.lintstagedrc.json b/.lintstagedrc.json index f1722f87f..ae253a628 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -3,7 +3,7 @@ "ui/**/*.{js,jsx,scss,json}": ["prettier --write", "git add"], "web/**/*.{js,jsx,scss,json}": ["prettier --write", "git add"], "ui/**/*.{js,jsx}": ["eslint", "flow focus-check --color always", "git add"], - "web/**/*.{js,jsx,scss}": ["eslint", "git add"] + "web/**/*.{js,jsx}": ["eslint", "git add"] }, "ignore": ["node_modules", "web/dist/**/*", "dist/**/*", "package-lock.json"] } diff --git a/config.js b/config.js index 2620d4863..28f0b0f07 100644 --- a/config.js +++ b/config.js @@ -41,7 +41,7 @@ const config = { DEFAULT_LANGUAGE: process.env.DEFAULT_LANGUAGE, AUTO_FOLLOW_CHANNELS: process.env.AUTO_FOLLOW_CHANNELS, UNSYNCED_SETTINGS: process.env.UNSYNCED_SETTINGS, - AVATAR_DEFAULT: process.env.AVATAR_DEFAULT, + // AVATAR_DEFAULT: process.env.AVATAR_DEFAULT, // ENABLE FEATURES ENABLE_COMMENT_REACTIONS: process.env.ENABLE_COMMENT_REACTIONS === 'true', @@ -66,6 +66,7 @@ const config = { CUSTOM_HOMEPAGE: process.env.CUSTOM_HOMEPAGE === 'true', SHOW_TAGS_INTRO: process.env.SHOW_TAGS_INTRO === 'true', LIGHTHOUSE_DEFAULT_TYPES: process.env.LIGHTHOUSE_DEFAULT_TYPES, + BRANDED_SITE: process.env.BRANDED_SITE, }; config.URL_LOCAL = `http://localhost:${config.WEB_SERVER_PORT}`; diff --git a/ui/index.jsx b/ui/index.jsx index 5d473888e..3089f23b0 100644 --- a/ui/index.jsx +++ b/ui/index.jsx @@ -43,7 +43,15 @@ import 'scss/third-party.scss'; // Import our app styles // If a style is not necessary for the initial page load, it should be removed from `all.scss` // and loaded dynamically in the component that consumes it +// @if BRANDED_SITE='odysee' +import '../web/scss/all.scss'; +// @endif +// @if BRANDED_SITE='lbrytv' +import '../web/scss/lbrytv.scss'; +// @endif +// @if TARGET='app' import 'scss/all.scss'; +// @endif // @if TARGET='web' // These overrides can't live in web/ because they need to use the same instance of `Lbry` diff --git a/web/scss/all.scss b/web/scss/all.scss new file mode 100644 index 000000000..0b47598ac --- /dev/null +++ b/web/scss/all.scss @@ -0,0 +1,70 @@ +@charset "utf-8"; + +@import 'init/reset'; +@import 'init/vars'; +@import 'init/mixins'; +@import 'init/gui'; +@import 'init/base-theme'; + +@import 'themes/odysee/light.scss'; +@import 'themes/odysee/dark.scss'; +@import '../../ui/scss/component/ads'; +@import '../../ui/scss/component/animation'; +@import '../../ui/scss/component/badge'; +@import '../../ui/scss/component/block-list'; +@import '../../ui/scss/component/button'; +@import '../../ui/scss/component/card'; +@import '../../ui/scss/component/channel'; +@import '../../ui/scss/component/claim-list'; +@import '../../ui/scss/component/collection'; +@import '../../ui/scss/component/comments'; +@import '../../ui/scss/component/content'; +@import '../../ui/scss/component/dat-gui'; +@import '../../ui/scss/component/embed-player'; +@import '../../ui/scss/component/expandable'; +@import '../../ui/scss/component/expanding-details'; +@import '../../ui/scss/component/file-drop'; +@import '../../ui/scss/component/file-list'; +@import '../../ui/scss/component/file-properties'; +@import '../../ui/scss/component/file-render'; +@import '../../ui/scss/component/footer'; +@import '../../ui/scss/component/form-field'; +@import '../../ui/scss/component/header'; +@import '../../ui/scss/component/icon'; +@import '../../ui/scss/component/main'; +@import '../../ui/scss/component/markdown-editor'; +@import '../../ui/scss/component/markdown-preview'; +@import '../../ui/scss/component/media'; +@import '../../ui/scss/component/menu-button'; +@import '../../ui/scss/component/modal'; +@import '../../ui/scss/component/nag'; +@import '../../ui/scss/component/navigation'; +@import '../../ui/scss/component/notification'; +@import '../../ui/scss/component/nudge'; +@import '../../ui/scss/component/pagination'; +@import '../../ui/scss/component/post'; +@import '../../ui/scss/component/purchase'; +@import '../../ui/scss/component/placeholder'; +@import '../../ui/scss/component/progress'; +@import '../../ui/scss/component/search'; +@import '../../ui/scss/component/claim-search'; +@import '../../ui/scss/component/section'; +@import '../../ui/scss/component/share'; +@import '../../ui/scss/component/snack-bar'; +@import '../../ui/scss/component/spinner'; +@import '../../ui/scss/component/splash'; +@import '../../ui/scss/component/status-bar'; +@import '../../ui/scss/component/superchat'; +@import '../../ui/scss/component/syntax-highlighter'; +@import '../../ui/scss/component/table'; +@import '../../ui/scss/component/livestream'; +@import '../../ui/scss/component/tabs'; +@import '../../ui/scss/component/tooltip'; +@import '../../ui/scss/component/txo-list'; +@import '../../ui/scss/component/videojs'; +@import '../../ui/scss/component/tags'; +@import '../../ui/scss/component/wunderbar'; +@import '../../ui/scss/component/yrbl'; +@import '../../ui/scss/component/empty'; +@import '../../ui/scss/component/stripe-card'; +@import '../../ui/scss/component/wallet-tip-send'; diff --git a/web/scss/component/_file-render.scss b/web/scss/component/_file-render.scss new file mode 100644 index 000000000..ae8feb4fb --- /dev/null +++ b/web/scss/component/_file-render.scss @@ -0,0 +1,755 @@ +.file-page { + .file-page__video-container + .card, + .file-render + .card, + .content__cover + .card, + .card + .file-render, + .card + .file-page__video-container, + .card + .content__cover { + margin-top: var(--spacing-m); + } + + .card + .file-render { + margin-top: var(--spacing-m); + } + + .file-page__md { + .file-viewer--document { + margin-top: var(--spacing-l); + + @media (min-width: $breakpoint-small) { + margin-top: var(--spacing-xl); + } + + .button { + display: inline; + + .button__content { + display: inline; + } + } + + .claim-link { + .button { + display: block; + + .button__content { + display: block; + } + } + } + } + + .media__actions { + justify-content: center; + } + + .file-page__secondary-content { + display: flex; + flex-direction: column; + padding: 0 var(--spacing-m); + } + } + + > * { + width: 100%; + } + + @media (max-width: $breakpoint-medium) { + flex-direction: column; + } +} + +.file-render { + width: 100%; + height: 100%; + z-index: 1; + overflow: hidden; + max-height: var(--inline-player-max-height); +} + +.file-render--video { + background-color: black; + + &:after { + content: ''; + position: absolute; + background-color: black; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 2; + animation: fadeInFromBlack 2s ease; + opacity: 0; + pointer-events: none; + } +} + +@keyframes fadeInFromBlack { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +.file-render--embed { + border-radius: 0; + position: fixed; + max-height: none; +} + +.file-render--img-container { + width: 100%; + aspect-ratio: 16 / 9; +} + +.file-render--post-container { + min-height: 30vh; +} + +.file-render__header { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.file-viewer { + width: 100%; + height: 100%; + + iframe, + webview, + img { + width: 100%; + height: 100%; + object-fit: contain; + max-height: var(--inline-player-max-height); + } + video { + cursor: pointer; + } + .video-js.vjs-user-inactive.vjs-playing { + video { + cursor: none; + } + } +} + +.file-render__viewer--comic { + position: relative; + overflow: hidden; + .comic-viewer { + width: 100%; + height: calc(100vh - var(--header-height) - var(--spacing-m) * 2); + max-height: var(--inline-player-max-height); + } +} + +.file-viewer--iframe { + display: flex; /*this eliminates extra height from whitespace, if someone edits this with a better technique, tell Jeremy*/ + /* + ideally iframes would dynamiclly grow, see for a start at this + for now, since we don't know size, let's make as large as we can without being larger than available area + */ + iframe { + height: calc(100vh - var(--header-height) - var(--spacing-m) * 2); + } +} + +.file-render__viewer--three { + position: relative; + overflow: hidden; + + .three-viewer { + height: calc(100vh - var(--header-height) - var(--spacing-m) * 2); + max-height: var(--inline-player-max-height); + } +} + +.file-viewer__overlay { + position: absolute; + left: auto; + right: auto; + height: 100%; + width: 100%; + z-index: 2; + color: var(--color-white); + font-size: var(--font-body); /* put back font size from videojs change*/ + + background-color: rgba(0, 0, 0, 0.9); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--spacing-l); + + @media (max-width: $breakpoint-small) { + font-size: var(--font-small); + } + + .button--uri-indicator, + .button--link { + color: var(--color-white); + } +} + +.content__viewer--floating { + .file-viewer__overlay-title, + .file-viewer__overlay-secondary { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 100%; + } +} +@media (max-width: $breakpoint-small) { + .file-viewer__overlay-title, + .file-viewer__overlay-secondary { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 100%; + } +} + +.file-viewer__overlay-title { + text-align: center; + font-size: var(--font-large); + margin-bottom: var(--spacing-m); +} +.file-viewer__overlay-secondary { + color: var(--color-text-subtitle); + margin-bottom: var(--spacing-m); +} +.file-viewer__overlay-actions { + .button + .button { + margin-left: var(--spacing-m); + } +} + +.file-viewer__overlay-logo { + height: 3.5rem; + width: 12rem; + display: flex; + align-items: center; + + &:hover { + filter: drop-shadow(1px 2px 10px var(--color-gray-3)); + } + + @media (max-width: $breakpoint-small) { + margin-right: var(--spacing-m); + width: 2.5rem; + + .button__label { + display: none; + } + } +} + +.file-viewer__overlay-logo--videoend { + height: 3.5rem; + width: 12rem; +} + +.file-viewer--is-playing:not(:hover) .file-viewer__embedded-header { + display: none; +} + +.file-viewer__embedded-header { + position: absolute; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + top: 0; + opacity: 1; + z-index: 2; + height: 4rem; + padding-left: var(--spacing-m); + padding-right: var(--spacing-s); + font-size: var(--font-large); + overflow-x: hidden; + overflow-y: hidden; + text-overflow: ellipsis; + white-space: nowrap; + border-top-left-radius: var(--border-radius); + border-top-right-radius: var(--border-radius); + + .button { + color: var(--color-white); + z-index: 2; + + .button__label { + white-space: nowrap; + } + + &:hover { + color: var(--color-white); + } + } + + .credit-amount, + .icon--Key { + margin-right: var(--spacing-m); + } + + @media (min-width: $breakpoint-small) { + padding: 0 var(--spacing-l); + } +} + +.file-viewer__embedded-gradient { + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 2; + background: linear-gradient(#000000, #00000000 70%); + height: 75px; + z-index: 1; +} + +.file-viewer__embedded-title { + max-width: 75%; + z-index: 2; +} + +.file-viewer__embedded-info { + display: flex; + align-items: center; + font-size: var(--font-small); + margin-left: var(--spacing-m); + white-space: nowrap; + position: relative; + overflow: hidden; + + & > *:not(:last-child) { + margin-right: var(--spacing-s); + } +} + +.file-render__content { + width: 100%; + height: 100%; + overflow: auto; + max-width: 100vw; +} + +// +// Custom viewers live below here +// These either have custom class names that can't be changed or have styles that need to be overridden +// + +// Code-viewer +.CodeMirror { + @extend .file-render__content; + + .cm-invalidchar { + display: none; + } + + .CodeMirror .CodeMirror-lines { + // is there really a .CodeMirror inside a .CodeMirror? + padding: var(--spacing-s) 0; + } + + .CodeMirror-code { + @include font-sans; + letter-spacing: 0.1rem; + } + + .CodeMirror-gutters { + background-color: var(--color-gray-1); + border-right: 1px solid var(--color-gray-4); + padding-right: var(--spacing-m); + } + + .CodeMirror-line { + padding-left: var(--spacing-m); + } + + .CodeMirror-linenumber { + color: var(--color-gray-5); + } +} + +// **************************************************************************** +// Video +// **************************************************************************** + +.video-js-parent { + height: 100%; + width: 100%; +} + +// By default no video js play button +.vjs-big-play-button { + display: none; +} + +.video-js { + height: 100%; + width: 100%; + + .vjs-modal-dialog .vjs-modal-dialog-content { + position: relative; + padding-top: 5rem; + // Make sure no videojs message interferes with overlaying buttons + pointer-events: none; + } + + .vjs-control-bar { + // background-color: rgba(0, 0, 0, 0.8); + + .vjs-remaining-time { + display: none; + } + + .vjs-current-time, + .vjs-time-divider, + .vjs-duration { + display: flex; + } + } + + .vjs-picture-in-picture-control { + display: none; + } +} + +// **************************************************************************** +// Video::Overlays +// **************************************************************************** + +.video-js { + .vjs-overlay-playrate, + .vjs-overlay-seeked { + background-color: rgba(0, 0, 0, 0.5); + font-size: var(--font-large); + width: auto; + padding: 10px 30px; + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + + animation: fadeOutAnimation ease-in 0.6s; + animation-iteration-count: 1; + animation-fill-mode: forwards; + } + + @keyframes fadeOutAnimation { + 0% { + opacity: 1; + visibility: visible; + } + 100% { + opacity: 0; + visibility: hidden; + } + } +} + +// **************************************************************************** +// Video - Mobile UI +// **************************************************************************** + +.video-js.vjs-mobile-ui { + .vjs-control-bar { + background-color: transparent; + } + + .vjs-touch-overlay:not(.show-play-toggle) { + .vjs-control-bar { + // Sync the controlBar's visibility with the overlay's + display: none; + } + } + + .vjs-touch-overlay { + &.show-play-toggle, + &.skip { + background-color: rgba(0, 0, 0, 0.5); + } + + // Override the original's 'display: block' to avoid the big play button + // from being squished to the side: + position: absolute; + } +} + +video::-internal-media-controls-overlay-cast-button { + // Push the cast button above vjs-touch-overlay: + z-index: 3; + + // Move it to the upper-right since it will clash with "tap to unmute": + left: unset; + right: 8px; +} + +.video-js.video-js.vjs-user-inactive { + video::-internal-media-controls-overlay-cast-button { + // (1) Android-Chrome's original Cast button behavior: + // - If video is playing, fade out the button. + // - If video is paused and video is tapped, display the button and stay on. + // (2) We then injected another behavior: + // - Display the button when '.vjs-touch-overlay' is displayed. However, + // the 'controlslist' attribute hack that was used to do this results in the + // button staying displayed without a fade-out timer. + // (3) Ideally, we should sync the '.vjs-touch-overlay' visibility with the + // cast button, similar to how to controlBar's visibility is synced above. + // But I have no idea how to grab the sibling '.show-play-toggle' into the + // css logic. + // (4) So, this is the best that I can come up with: Whenever user is idle, + // the button goes away. The only downside I know is the scenario of + // "overlay is up and video is paused, but button goes away due to idle". + // The user just needs to re-tap any empty space on the overlay to get the + // Cast button again. + opacity: 0; + transition: opacity 1s ease; + } +} + +// **************************************************************************** +// Layout and control visibility +// **************************************************************************** + +.video-js.vjs-fullscreen, +.video-js:not(.vjs-fullscreen) { + // --- Unhide desired components per layout --- + &.vjs-layout-x-small { + .vjs-playback-rate { + display: flex !important; + } + } + + &.vjs-layout-small { + .vjs-current-time, + .vjs-time-divider, + .vjs-duration, + .vjs-playback-rate { + display: flex !important; + } + } + + // --- Adjust spacing --- + .vjs-current-time { + padding-right: 0; + } + + .vjs-duration { + padding-left: 0; + } + + .vjs-playback-rate .vjs-playback-rate-value { + // Reduce the gigantic font a bit. Default was 1.5em. + font-size: 1.25em; + line-height: 2.5; + } + + .vjs-playback-rate .vjs-menu { + // Extend the width to prevent a potential scrollbar from blocking the text. + width: 8em; + left: -2em; + } +} + +.video-js.vjs-fullscreen { + .vjs-button--theater-mode { + display: none; + } +} + +// **************************************************************************** +// Tap-to-unmute +// **************************************************************************** + +.video-js--tap-to-unmute { + visibility: hidden; // Start off as hidden. + z-index: 2; + position: absolute; + top: var(--spacing-xs); + left: var(--spacing-xs); + padding: var(--spacing-xs) var(--spacing-m); // Make it comfy for touch. + color: var(--color-gray-1); + background: black; + border: 1px solid var(--color-gray-4); + opacity: 0.9; + + &:hover { + opacity: 1; + color: var(--color-white); + } +} + +// **************************************************************************** +// **************************************************************************** + +.video-js:hover { + .vjs-big-play-button { + background-color: var(--color-primary); + } +} + +.file-render { + .video-js { + /*display: flex;*/ + /*align-items: center;*/ + /*justify-content: center;*/ + } + + .vjs-big-play-button { + @extend .button--icon; + @extend .button--play; + border: none; + /*position: static;*/ + z-index: 2; + + .vjs-icon-placeholder { + display: none; + } + } + + .vjs-menu-item-text, + .vjs-icon-placeholder { + text-transform: capitalize; + } +} + +// **************************************************************************** +// **************************************************************************** + +.file-render--embed { + // on embeds, do not inject our colors until interaction + .video-js:hover { + .vjs-big-play-button { + background-color: var(--color-primary); + } + } + + .vjs-paused { + .vjs-big-play-button { + display: block; + background-color: rgba(0, 0, 0, 0.6); + } + } + + .vjs-ended { + .vjs-big-play-button { + display: none; + } + } + + .video-js--tap-to-unmute { + margin-top: var(--spacing-xl); + margin-left: var(--spacing-s); + + @media (min-width: $breakpoint-small) { + margin-left: calc(var(--spacing-m) + var(--spacing-s)); + } + } + + .file-viewer { + iframe, + webview, + img { + max-height: none; + } + } +} + +.file-viewer--ended-embed .vjs-big-play-button { + display: none !important; // yes this is dumb, but this was broken and the above CSS was overriding +} + +// **************************************************************************** +// Autoplay Countdown +// **************************************************************************** + +.autoplay-countdown { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; +} + +.autoplay-countdown__timer { + width: 100%; + text-align: center; + font-size: var(--font-small); +} +.autoplay-countdown__counter { + margin-top: var(--spacing-m); +} + +.autoplay-countdown__button { + /* Border size and color */ + border: 3px solid transparent; + /* Creates a circle */ + border-radius: 50%; + /* Circle size */ + display: inline-block; + height: 86px; + width: 86px; + /* Use transform to rotate to adjust where opening appears */ + transition: border 1s; + transform: rotate(45deg); + .button { + background-color: transparent; + transform: rotate(-45deg); + &:hover { + background-color: var(--color-primary); + } + } +} +.autoplay-countdown__button--4 { + border-top-color: #fff; +} +.autoplay-countdown__button--3 { + border-top-color: #fff; + border-right-color: #fff; +} +.autoplay-countdown__button--2 { + border-top-color: #fff; + border-right-color: #fff; + border-bottom-color: #fff; +} +.autoplay-countdown__button--1 { + border-color: #fff; +} + +// **************************************************************************** +// **************************************************************************** + +.file__viewdate { + display: flex; + justify-content: space-between; + flex-direction: column; + margin-bottom: var(--spacing-s); + + > :first-child { + margin-bottom: var(--spacing-s); + } + + @media (max-width: $breakpoint-medium) { + flex-direction: row; + justify-content: start; + + > :first-child { + margin-bottom: 0; + margin-right: 1rem; + } + } +} + +.file-page__image { + img { + cursor: pointer; + } +} diff --git a/web/scss/init/_base-theme.scss b/web/scss/init/_base-theme.scss new file mode 100644 index 000000000..02313f1e1 --- /dev/null +++ b/web/scss/init/_base-theme.scss @@ -0,0 +1,199 @@ +// +// Colors are taken from this color palette +// https://tailwindcss.com/docs/customizing-colors +// New colors should be also taken from the same color palette (if possible) +// +:root { + // Generic colors + --color-primary: #047857; + --color-primary-alt: #e4f4ef; + --color-primary-alt-2: #065f46; + --color-primary-alt-3: #10b981; + --color-secondary: #1e3a8a; + --color-secondary-alt: #dbeafe; + --color-secondary-alt-2: #bfdbfe; + --color-secondary-alt-3: #1e40af; + --color-tertiary: #5b21b6; + --color-tertiary-alt: #f5f3ff; + --color-danger: #991b1b; + --color-danger-alt: #fecaca; + --color-warning: #fff58c; + --color-black: #111; + --color-white: #fdfdfd; + --color-white-alt: #fafafa; + --color-gray-1: #f3f4f6; + --color-gray-2: #e5e7eb; + --color-gray-3: #d1d5db; + --color-gray-4: #9ca3af; + --color-gray-5: #71717a; + --color-gray-6: #52525b; + --color-gray-7: #3f3f46; + --color-gray-8: #27272a; + --color-gray-9: #1f1f22; + --color-gray-10: #18181b; + --color-amber: #f26522; + --color-orange: #fb923c; + + // Structure + --color-text: var(--color-black); + --color-text-inverse: #fdfdfd; + --color-background: #fafafa; + --color-background--splash: #212529; + --color-border: #ededed; + --color-background-overlay: #21252980; + --color-card-background: #ffffff; + --color-card-background-highlighted: #f1f7fe; + + // Text + --color-text-selection-bg: var(--color-secondary-alt); + --color-text-selection: var(--color-secondary); + --color-text-empty: #999999; + --color-text-help: #999999; + --color-text-subtitle: #767676; + --color-text-warning: #212529; + --color-help-warning-bg: #fef3c7; + --color-help-warning-text: #555555; + --color-text-warning--background: var(--lbry-yellow-1); + --color-blockquote: var(--color-gray-3); + --color-text-error: var(--color-danger); + --color-error: var(--color-danger-alt); + --color-tooltip-bg: #222; + --color-tooltip-text: #fafafa; + + // Header + --color-header-background: #ffffff; + --color-header-button: var(--color-button-alt-bg); + --color-header-button-active: var(--color-primary-alt); + --color-header-button-hover: var(--color-primary-alt); + + // Button + --color-button-primary-bg: var(--color-primary); + --color-button-primary-text: var(--color-primary-alt); + --color-button-primary-bg-hover: var(--color-primary-alt-2); + --color-button-primary-hover-text: var(--color-primary-alt); + --color-button-secondary-bg: var(--color-secondary-alt); + --color-button-secondary-border: var(--color-secondary-alt); + --color-button-secondary-text: var(--color-secondary); + --color-button-secondary-bg-hover: var(--color-secondary-alt-2); + --color-button-alt-bg: var(--color-gray-1); + --color-button-alt-text: var(--color-text); + --color-button-alt-bg-hover: var(--color-gray-2); + --color-button-toggle-text: var(--color-primary); + --color-button-toggle-bg: var(--color-primary-alt); + --color-button-border: var(--color-gray-3); + --color-link: var(--color-primary); + --color-link-hover: var(--color-black); + --color-link-focus-bg: var(--color-gray-1); + + // Input + --color-input-color: var(--color-black); + --color-input-label: var(--color-gray-5); + --color-input-placeholder: var(--color-gray-8); + --color-input-bg: var(--color-gray-1); + --color-input-border: var(--color-border); + --color-input-border-active: var(--color-secondary); + --color-input-toggle: var(--color-secondary); + --color-input-toggle-bg: var(--color-gray-1); + --color-input-toggle-bg-hover: var(--color-secondary-alt); + --color-input-prefix-bg: var(--color-gray-2); + --color-input-prefix-border: var(--color-gray-5); + --color-input-bg-selected: var(--color-primary-alt); + --select-toggle-background: url("data:image/svg+xml,%3Csvg viewBox='0 0 96 96' xmlns='http://www.w3.org/2000/svg' fill='%23212529'%3E%3Cpath d='M17.172, 31.172c1.562, -1.562 4.095, -1.562 5.656, 0l25.172, 25.171l25.172, -25.171c1.562, -1.562 4.095, -1.562 5.656, 0c1.562, 1.562 1.562, 4.095 0, 5.656l-28, 28c-1.562, 1.562 -4.095, 1.562 -5.656, 0l-28, -28c-0.781, -0.781 -1.172, -1.805 -1.172, -2.828c0, -1.023 0.391, -2.047 1.172, -2.828Z'/%3E%3C/svg%3E%0A"); + + // Navigation + --color-navigation-icon: var(--color-gray-5); + --color-navigation-link: var(--color-gray-5); + --color-navigation-active: var(--color-primary-alt); + --color-navigation-active-text: var(--color-primary); + --color-navigation-hover: var(--color-gray-1); + --color-navigation-hover-text: var(--color-primary); + + // Tags + --color-tag: var(--color-gray-5); + --color-tag-bg: var(--color-button-alt-bg); + --color-tag-hover: var(--color-primary-alt); + --color-tag-bg-hover: var(--color-button-primary-bg); + + // Tags (words) + --color-tag-words: var(--color-gray-5); + --color-tag-words-bg: var(--color-button-alt-bg); + --color-tag-words-hover: var(--color-button-alt-text); + --color-tag-words-bg-hover: var(--color-button-alt-bg-hover); + + // Menu + --color-menu-background: var(--color-header-background); + --color-menu-background--active: var(--color-card-background-highlighted); + --color-menu-icon: var(--color-navigation-link); + + // Comments + --color-comment-menu: var(--color-gray-3); + --color-comment-menu-hovering: var(--color-gray-6); + --color-comment-highlighted: #fff2d9; + --color-comment-threadline: var(--color-gray-1); + --color-comment-threadline-hover: var(--color-gray-4); + + // Icons + --color-follow-bg: #ffd4da; + --color-follow-icon: #e2495e; + --color-view-bg: var(--color-secondary-alt); + --color-view-icon: var(--color-secondary); + + // Snack + --color-snack-bg: var(--color-primary); + --color-snack: var(--color-white); + --color-snack-bg-error: var(--color-danger); + --color-snack-upgrade: var(--color-tertiary); + + // Superchat + --color-superchat-text: var(--color-black); + --color-superchat: var(--color-cost); + --color-superchat__light: #fcd34d50; + --color-superchat-2: #fde68a; + --color-superchat-3: #fef3c7; + --color-superchat-3__light: #fef3c750; + --color-superchat-4: #fffbeb; + + // Editor + --color-editor-cursor: var(--color-text); + --color-editor-quote: #707070; + --color-editor-tag: #ea9400; + --color-editor-attr: #04b0f4; + --color-editor-string: #ff7451; + --color-editor-inline-code-fg: var(--color-text); + --color-editor-inline-code-fg-preview: #2e3439; + --color-editor-inline-code-bg: rgba(157, 161, 165, 0.3); + --color-editor-inline-code-bg-preview: #d0e8ff; + --color-editor-selected: #add6ff; + --color-editor-link: var(--color-link); + --color-editor-url: var(--color-editor-string); + --color-editor-hr: var(--color-editor-tag); + --color-editor-hr-preview: #cccccc; + + // Other + --color-focus: #bfdbfe; + --color-notification: #cc190f; + --color-live: #cc190f; + --color-nag: var(--color-orange); + --color-cost: #fcd34d; + --color-notice: #fef3ca; + --color-purchased: var(--color-cost); + --color-purchased-alt: #ffebc2; + --color-purchased-text: var(--color-gray-5); + --color-thumbnail-background: var(--color-gray-1); + --color-spinner-light: var(--color-white); + --color-spinner-dark: var(--color-black); + --color-placeholder-background: var(--color-gray-1); + --color-file-viewer-background: var(--color-card-background); + --color-tabs-background: var(--color-card-background); + --color-tab-divider: var(--color-primary); + --color-modal-background: var(--color-card-background); + --color-login-graphic-background: var(--color-primary-alt); + + // Ads + --color-ads-background: #fae5ff; + --color-ads-link: var(--color-link); + + // Scrollbar + --color-scrollbar-thumb-bg: rgba(0, 0, 0, 0.2); + --color-scrollbar-track-bg: transparent; +} diff --git a/web/scss/init/_color.scss b/web/scss/init/_color.scss new file mode 100644 index 000000000..70573ea47 --- /dev/null +++ b/web/scss/init/_color.scss @@ -0,0 +1,57 @@ +:root { + // Generic colors + --color-primary: #257761; + --color-primary-alt: #e4f4ef; + --color-primary-alt-2: #4b8576; + --color-secondary: #295284; + --color-secondary-alt: #d9eaff; + --color-tertiary: #552470; + --color-tertiary-alt: #f7e8ff; + --color-danger: #9b2023; + --color-danger-alt: #fccdce; + --color-warning: #fff58c; + --color-cost: #ffd580; + --color-focus: #93cff2; + --color-notification: #f02849; + --color-live: #cc190f; + + --color-black: #111; + --color-white: #fdfdfd; + --color-white-alt: #fafafa; + --color-gray-1: #eff1f4; + --color-gray-2: #d8dde1; + --color-gray-3: #ced4da; + --color-gray-4: #abb1b7; + --color-gray-5: #666a6d; + + // Text + --color-text: var(--color-black); + --color-text-subtitle: var(--color-gray-5); + --color-text-inverse: #fdfdfd; + + // Components + + // Button + --color-button-primary-bg: var(--color-primary); + --color-button-primary-text: var(--color-primary-alt); + --color-button-primary-bg-hover: var(--color-primary-alt-2); + --color-button-primary-hover-text: var(--color-primary-alt); + --color-button-secondary-bg: var(--color-secondary-alt); + --color-button-secondary-border: var(--color-secondary-alt); + --color-button-secondary-text: var(--color-secondary); + --color-button-secondary-bg-hover: #b9d0e9; + --color-button-alt-bg: var(--color-gray-1); + --color-button-alt-text: var(--color-text); + --color-button-alt-bg-hover: var(--color-gray-2); + --color-link: var(--color-primary); + --color-link-hover: var(--color-black); + + // Table + --color-table-highlight: var(--color-white-alt); + + // Tag + --color-tag: var(--color-gray-5); + --color-tag-bg: var(--color-button-alt-bg); + --color-tag-hover: var(--color-button-alt-text); + --color-tag-bg-hover: var(--color-button-alt-bg-hover); +} diff --git a/web/scss/init/_gui.scss b/web/scss/init/_gui.scss new file mode 100644 index 000000000..b6a099283 --- /dev/null +++ b/web/scss/init/_gui.scss @@ -0,0 +1,517 @@ +// Generic html styles used across the App +// component specific styling should go in the component scss file + +*::selection { + background-color: var(--color-text-selection-bg); + color: var(--color-text-selection); +} + +*:focus { + outline: none; +} + +html { + @include font-sans; + height: 100%; + min-height: 100%; + overflow-x: hidden; + + color: var(--color-text); + background-color: var(--color-background); + font-size: 16px; +} + +body { + font-size: 1em; + cursor: default; + line-height: 1.5; + font-weight: 400; + font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; +} + +hr { + height: 1px; + background-color: var(--color-gray-2); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 1rem; +} + +p, +ol, +ul { + & + p, + & + ul, + & + ol { + margin-top: var(--spacing-s); + } +} + +ul, +ol { + li { + position: relative; + list-style-position: outside; + margin: var(--spacing-xs) 0; + margin-left: var(--spacing-s); + margin-bottom: 0; + + @media (min-width: $breakpoint-small) { + margin-left: var(--spacing-xl); + } + } +} + +.ul--no-style { + list-style: none; + margin-bottom: 0; + + li { + margin: 0; + } +} + +dl { + display: flex; + flex-direction: row; + flex-wrap: wrap; + overflow-x: visible; + margin-top: var(--spacing-m); +} + +dt { + flex-basis: 50%; + text-align: left; + font-weight: bold; +} + +.dt__text { + margin-right: var(--spacing-s); +} + +dd { + display: flex; + align-items: center; + justify-content: flex-end; + flex-basis: 45%; + flex-grow: 1; + margin: 0; + text-align: right; + + .help--warning { + margin-bottom: 0; + margin-top: var(--spacing-s); + text-align: left; + } +} + +.dd__text { + display: flex; + justify-content: flex-end; +} + +.dd__button { + margin-right: var(--spacing-s); +} + +dt, +dd { + padding: var(--spacing-m) var(--spacing-s); + border-top: 1px solid var(--color-border); + + &:last-of-type { + border-bottom: 1px solid var(--color-border); + } +} + +blockquote { + padding: 0 0.8rem; + margin-top: var(--spacing-xxs); + margin-bottom: var(--spacing-xxs); + opacity: 0.9; + border-left: 0.2rem solid var(--color-blockquote); + color: var(--color-text-subtitle); +} + +code { + @include font-mono; + font-size: 1.5rem; +} + +hr { + width: 100%; + height: 1px; + background-color: var(--color-border); +} + +img, +a { + -webkit-user-drag: none; +} + +img { + // Hide alt text when an image fails to load + text-indent: -9999px; +} + +textarea { + min-height: calc(var(--height-input) * 2); +} + +.columns { + display: flex; + justify-content: space-between; + align-items: flex-start; + + > * { + flex-grow: 1; + flex-basis: 0; + min-width: 15rem; + margin-bottom: var(--spacing-l); + + &:first-child { + flex-basis: 1px; + margin-right: 1.5rem; + } + } + + @media (max-width: $breakpoint-small) { + flex-direction: column; + + & > * { + margin: 0; + margin-bottom: var(--spacing-m); + width: 100%; + flex-basis: auto; + + &:first-child { + margin-right: 0; + } + } + } +} + +.hidden { + display: none; +} + +.disabled { + opacity: 0.3; + pointer-events: none; +} + +.column { + display: flex; + + .column__item:not(:first-child) { + padding-left: $spacing-width * 2/3; + flex: 1; + } + + .column__item--between { + justify-content: space-between; + } + + @media (max-width: $breakpoint-small) { + flex-direction: column; + .column__item:not(:first-child) { + padding-left: 0; + flex: 1; + } + & > * { + margin: 0; + margin-bottom: var(--spacing-m); + width: 100%; + flex-basis: auto; + + &:first-child { + margin-right: 0; + } + } + } +} + +.truncated-text { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + word-break: break-word; +} + +.busy-indicator__loader { + min-width: 16px; + min-height: 8px; + margin: -1rem 0; + padding: 0 30px; + + background: url('../../static/img/busy.gif') no-repeat center center; + display: inline-block; + vertical-align: middle; + + &:first-child { + padding-left: 2px; + } + + &:last-child { + padding-right: 2px; + } +} + +.help { + display: block; + font-size: var(--font-xsmall); + color: var(--color-text-help); + margin-top: var(--spacing-s); + + &:not(:last-child) { + margin-bottom: var(--spacing-m); + } + + .button--link + .button--link { + margin-left: var(--spacing-s); + } + + @media (min-width: $breakpoint-small) { + font-size: var(--font-small); + } +} + +.help--warning { + @extend .help; + padding: var(--spacing-s); + border-radius: var(--border-radius); + background-color: var(--color-help-warning-bg); + color: var(--color-help-warning-text); + margin-bottom: var(--spacing-s); + border: 1px solid var(--color-border); +} + +.help--notice { + @extend .help--warning; + background-color: var(--color-card-background-highlighted); +} + +.help--inline { + @extend .help; + margin-top: 0; + margin-bottom: 0; + + &:not(:last-child) { + margin-bottom: 0; + } + + .icon--help { + top: 3px; + margin-left: 2px; + } +} + +.help--card-actions { + @extend .help; + margin-top: var(--spacing-m); +} + +.help--dt { + @extend .help; + display: inline-block; + margin-top: 0; +} + +.help--spendable { + margin-left: var(--spacing-xxs); +} + +.empty { + color: var(--color-text-empty); + font-style: italic; +} + +.empty--centered { + text-align: center; + padding: calc(var(--spacing-l) * 3) 0; +} + +.qr-code { + width: 134px; + height: 134px; + border: 3px solid white; + + &.qr-code--right-padding { + margin-right: $spacing-vertical * 2/3; + } + + &.qr-code--top-padding { + margin-top: $spacing-vertical * 2/3; + } +} + +.error__wrapper { + background-color: var(--color-error); + padding: var(--spacing-s); + border-radius: var(--border-radius); +} + +.error__wrapper--no-overflow { + @extend .error__wrapper; + max-height: 10rem; + overflow: hidden; +} + +.error__text { + color: var(--color-text-error); +} + +.help--error { + @extend .help; + color: var(--color-text-error); +} + +.thumbnail-preview { + width: var(--thumbnail-preview-width); + height: var(--thumbnail-preview-height); + background-color: var(--color-thumbnail-background); + padding: var(--spacing-s); + font-size: var(--font-small); + border-radius: var(--border-radius); + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: cover; +} + +.thumbnail-picker__preview { + width: calc(var(--thumbnail-preview-width) * 1.5); + height: calc(var(--thumbnail-preview-height) * 1.5); + background-color: var(--color-thumbnail-background); + padding: var(--spacing-s); + font-size: var(--font-small); + border-radius: var(--border-radius); + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: cover; +} + +.emoji { + font-size: 1.3em; +} + +.download-text { + font-size: var(--font-xsmall); +} + +.notice-message { + position: relative; + border-radius: var(--border-radius); + padding: var(--spacing-l); + background-color: var(--color-primary-alt); + + ~ .card { + margin-top: var(--spacing-m); + } +} + +.notice-message--loud { + @extend .notice-message; + background-color: #fef1f6; + color: var(--color-black); + font-weight: bold; + + .button { + color: #fa6165; + } +} + +.privacy-img { + height: 10rem; +} + +.confirm__label { + @extend label; +} + +.confirm__value { + display: flex; + align-items: center; + margin-bottom: var(--spacing-m); + font-size: var(--font-large); + + &:last-child { + margin-bottom: 0; + } +} + +.confirm__value--no-gap { + margin-bottom: 0; +} + +.confirm__value--subitem { + font-size: var(--font-xsmall); +} + +.mobile-only { + display: none; + + @media (max-width: $breakpoint-small) { + display: block; + } +} + +.mobile-hidden { + @media (max-width: $breakpoint-small) { + display: none !important; + } +} + +.ads-test { + height: 50vh; + position: relative; + + .video-js { + height: 50vh; + } + + .video-js .vjs-tech { + height: 50vh; + } +} + +.adspruce-bannerspot { + height: 5rem; + width: 100%; +} + +.release__notes { + max-height: 50vh; + overflow: scroll; +} + +.signup__odysee-logo { + display: flex; + width: 100%; + align-items: center; + justify-content: center; + + img { + margin-top: var(--spacing-xl); + height: 4rem; + } +} + +.home__meme { + text-align: center; + font-weight: bold; + line-height: 1; + font-size: 1rem; + margin-bottom: var(--spacing-m); + + @media (min-width: $breakpoint-small) { + font-size: 1.2rem; + margin-bottom: var(--spacing-l); + } +} diff --git a/web/scss/init/_mixins.scss b/web/scss/init/_mixins.scss new file mode 100644 index 000000000..3d626e238 --- /dev/null +++ b/web/scss/init/_mixins.scss @@ -0,0 +1,237 @@ +@mixin between { + display: flex; + justify-content: space-between; +} + +@mixin breakpoint-max($breakpoint) { + @media (max-width: #{$breakpoint}px) { + @content; + } +} + +@mixin breakpoint-min($breakpoint) { + @media (min-width: #{$breakpoint}px) { + @content; + } +} + +@mixin center { + align-items: center; + display: inline-flex; + justify-content: center; +} + +@mixin clearfix { + clear: both; + content: ''; + display: block; +} + +// (Smart) text truncation +// Pass in a width to customize how much text is allowed +// Omit value for basic text truncation +@mixin constrict($value: null) { + @if ($value) { + max-width: $value; + } + + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@mixin create-grid($items-per-row: 4) { + grid-template: repeat(1, 1fr) / repeat($items-per-row, 1fr); +} + +// Smart font include +// Simply pass in the font-weight you want to use and the normal/italicized versions will be added +// No more weighing down the front-end with references to unused weights +@mixin font-face($font-weight, $relative-font-path, $font-name) { + @font-face { + font-family: $font-name; + font-style: normal; + font-weight: $font-weight; + // sass-lint:disable indentation + src: url('#{$relative-font-path}/#{$font-weight}.woff2') format('woff2'), + url('#{$relative-font-path}/#{$font-weight}.woff') format('woff'); + // sass-lint:enable indentation + } + + @font-face { + font-family: $font-name; + font-style: italic; + font-weight: $font-weight; + // sass-lint:disable indentation + src: url('#{$relative-font-path}/#{$font-weight}i.woff2') format('woff2'), + url('#{$relative-font-path}/#{$font-weight}i.woff') format('woff'); + // sass-lint:enable indentation + } +} + +@mixin font-mono { + font-family: 'Fira Code', 'Courier New', monospace; +} + +@mixin font-sans { + font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; +} + +@mixin font-serif { + font-family: Georgia, serif; +} + +@mixin hide-text { + border: none; + color: transparent; + font: 0 / 0 a; + text-shadow: none; +} + +// Cross-browser line-clamp support +@mixin line-clamp($element-height: 2rem, $row-count: 2, $fade-color: var(--lbry-white), $computed-position: relative) { + height: $element-height; + overflow: hidden; + position: $computed-position; + + &::after { + width: 50%; + height: calc(#{$element-height} / #{$row-count}); + right: 0; + bottom: 0; + + background-image: linear-gradient(to right, rgba($lbry-white, 0), #{$fade-color} 80%); + content: ''; + position: absolute; + } +} + +@mixin no-user-select { + user-select: none; + + -ms-user-select: none; + -moz-user-select: none; + -webkit-user-select: none; +} + +// Use CSS variables without upsetting Sass-Lint +// https://github.com/sasstools/sass-lint/issues/1161#issuecomment-390537190 +@mixin root-prop($prop: null, $value: null) { + @if ($prop and $value) { + #{$prop}: $value; + } +} + +@mixin selection($background-color: var(--lbry-white), $text-color: var(--lbry-black)) { + &::selection { + background-color: $background-color; + color: $text-color; + text-shadow: none; + } + + &::-moz-selection { + background-color: $background-color; + color: $text-color; + text-shadow: none; + } +} + +@mixin thumbnail { + &::before, + &::after { + content: ''; + } + + &::before { + float: left; + padding-top: var(--aspect-ratio-standard); + } + + &::after { + clear: both; + display: block; + } +} + +@mixin focus { + box-shadow: 0 0 0 3px var(--color-focus); +} + +@mixin linkFocus { + background-color: var(--color-link-focus-bg); + box-shadow: 0 0 0 5px var(--color-link-focus-bg); +} + +@mixin underline($text-color: var(--lbry-black), $whitespace-color: var(--lbry-white)) { + @include selection($text-color, $whitespace-color); + + background-image: linear-gradient($whitespace-color, $whitespace-color), + linear-gradient($whitespace-color, $whitespace-color), linear-gradient($text-color, $text-color); + background-position: 0 88%, 100% 88%, 0 88%; + background-repeat: no-repeat, no-repeat, repeat-x; + background-size: 0.05rem 1px, 0.05rem 1px, 1px 1px; + box-decoration-break: clone; + display: inline; + text-decoration: none; + text-shadow: 0.03rem 0 $whitespace-color, -0.03rem 0 $whitespace-color, 0 0.03rem $whitespace-color, + 0 -0.03rem $whitespace-color, 0.06rem 0 $whitespace-color, -0.06rem 0 $whitespace-color, 0.09rem 0 $whitespace-color, + -0.09rem 0 $whitespace-color, 0.12rem 0 $whitespace-color, -0.12rem 0 $whitespace-color, 0.15rem 0 $whitespace-color, + -0.15rem 0 $whitespace-color; + + @-moz-document url-prefix() { + // sass-lint:disable-line empty-args + background-position: 0 90%, 100% 90%, 0 90%; + } +} + +@mixin placeholder { + animation: pulse 2s infinite ease-in-out; + background-color: var(--color-placeholder-background); + border-radius: var(--card-radius); + border-width: 0; +} + +@mixin mediaThumbHoverZoom { + .media__thumb, + img { + transition: all 0.2s ease; + } + + &:hover { + .media__thumb, + img { + transform: scale(1.05); + } + } +} + +@mixin handleClaimTileGifThumbnail($width) { + .ff-canvas, + .freezeframe-img { + height: calc(#{$width} * (9 / 16)) !important; + width: $width; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } +} + +@mixin handleClaimListGifThumbnail($width) { + .ff-canvas, + .freezeframe-img { + height: calc(#{$width} * (9 / 16)) !important; + width: $width; + } +} + +@mixin handleChannelGif($size) { + height: $size; + width: $size; + + .ff-canvas, + .freezeframe-img { + border-radius: var(--border-radius); + height: $size !important; + width: $size !important; + } +} diff --git a/web/scss/init/_reset.scss b/web/scss/init/_reset.scss new file mode 100644 index 000000000..aff7dd756 --- /dev/null +++ b/web/scss/init/_reset.scss @@ -0,0 +1,245 @@ +html { + box-sizing: border-box; + text-rendering: optimizeLegibility; + + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +*, +*::before, +*::after { + margin: 0; + padding: 0; + + border: none; + box-sizing: inherit; + outline: 0; +} + +[disabled] { + pointer-events: none; + resize: none; +} + +[readonly] { + cursor: not-allowed; +} + +[for], +[role='button'], +[type='button'], +[type='checkbox'], +[type='file'], +[type='radio'], +[type='select'], +[type='submit'] { + cursor: pointer; +} + +a, +area, +button, +[role='button'], +input, +label, +select, +summary, +textarea { + // Remove touch delay on supported devices + touch-action: manipulation; +} + +button, +input, +select, +textarea { + background-color: transparent; + border-radius: 0; + font-family: inherit; + font-size: inherit; + font-weight: inherit; + + -moz-appearance: none; + -webkit-appearance: none; + + &:disabled { + cursor: default; + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: normal; + font-size: 1em; +} + +ol, +ul { + list-style-position: inside; + + > li { + list-style-position: inside; + } +} + +table { + border-spacing: 0; +} + +dd { + width: 80%; + float: left; +} + +dl { + width: 100%; + overflow-x: scroll; + overflow-y: hidden; +} + +dt { + width: 20%; + float: left; +} + +img { + width: auto; + max-width: 100%; + height: auto; + max-height: 100%; + vertical-align: middle; +} + +a { + text-decoration: none; +} + +button { + background-color: transparent; + line-height: inherit; + + &:not(:disabled) { + cursor: pointer; + } + + &:disabled { + opacity: 0.3; + } +} + +hr { + width: 100%; + height: 1px; + background-color: var(--color-gray-1); +} + +input { + background-color: transparent; + color: inherit; + + &::placeholder { + color: inherit; + opacity: 0.2; + } + + &::-webkit-search-cancel-button { + -webkit-appearance: none; + } +} + +select { + outline: none; +} + +textarea { + width: 100%; + min-height: var(--spacing-xxl); + padding: var(--spacing-s); + // border-color should be added in apps for blur/focus + border: 1px solid; + + &:not([disabled]) { + resize: vertical; + } +} + +@media print { + // sass-lint:disable-block no-important + // Intelligent print styles + pre, + blockquote { + border: 1px solid var(--color-gray-5) !important; + page-break-inside: avoid !important; + } + + tr, + img { + page-break-inside: avoid !important; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm !important; + } + + p, + h2, + h3 { + orphans: 3 !important; + widows: 3 !important; + } + + h2, + h3 { + page-break-after: avoid !important; + } + + thead { + display: table-header-group !important; + } + + // Faster, more stable printing + * { + background-color: transparent !important; + background-image: none !important; + color: var(--lbry-black) !important; + filter: none !important; + text-shadow: none !important; + } + + p { + a { + &[href]::after { + // Show hypertext data for links and abbreviations + content: ' (' attr(href) ')' !important; + } + + &[href^='javascript:'], + &[href^='#'] { + &::after { + content: '' !important; + } + } + } + + abbr { + &[title]::after { + content: ' (' attr(title) ')' !important; + } + } + + a, + abbr { + text-decoration: underline !important; + word-wrap: break-word !important; + } + } +} diff --git a/web/scss/init/_vars.scss b/web/scss/init/_vars.scss new file mode 100644 index 000000000..381da76f0 --- /dev/null +++ b/web/scss/init/_vars.scss @@ -0,0 +1,108 @@ +// Both of these should probably die and become variables as well +$spacing-vertical: 2rem; +$spacing-width: 36px; + +$breakpoint-xxsmall: 450px; +$breakpoint-xsmall: 600px; +$breakpoint-small: 900px; +$breakpoint-medium: 1150px; +$breakpoint-large: 1600px; + +:root { + --border-radius: 10px; + --height-input: 2.5rem; + --height-button: 2.5rem; + --height-checkbox: 24px; + --height-radio: 24px; + --height-badge: 24px; + + // Spacing + --spacing-xxs: calc(2rem / 5); + --spacing-xs: calc(2rem / 4); + --spacing-s: calc(2rem / 3); + --spacing-m: calc(2rem / 2); + --spacing-l: 2rem; + --spacing-xl: 3rem; + + // Aspect ratio + --aspect-ratio-bluray: 41.6666666667%; // 12:5 + --aspect-ratio-panavision: 36.3636363636%; // 11:4 + --aspect-ratio-sd: 75%; // 4:3 + --aspect-ratio-standard: 56.25%; // 16:9 + + // Type + --font-mono: 'Fira Code'; + --font-sans: Inter; + --font-serif: Georgia; + --font-weight-base: 400; + --font-weight-light: 300; + --font-weight-bold: 700; + --font-base: 14px; + --font-body: 1rem; + --font-xxsmall: 0.65rem; + --font-xsmall: 0.7344rem; + --font-small: 0.8571rem; + --font-large: 1.3rem; + --font-title: 1.71rem; + --font-heading: 2.94rem; + + // Width & spacing + --page-max-width: 1280px; + --page-max-width--filepage: 1700px; + --mac-titlebar-height: 24px; + --mobile: 600px; + --side-nav-width: 230px; + --side-nav-width--micro: 125px; + + --spacing-main-padding: var(--spacing-xl); + --floating-viewer-width: 32rem; + --floating-viewer-height: 18rem; // 32 * 9/16 + --floating-viewer-info-height: 5rem; + --floating-viewer-container-height: calc(var(--floating-viewer-height) + var(--floating-viewer-info-height)); + --option-select-width: 8rem; + + // Text + --text-max-width: 660px; + --text-link-padding: 4px; + + // Tabs + --tab-indicator-size: 0.5rem; + + // Header + // This is tied to the floating player so it knows where to attach to + // ui/component/fileRenderFloating/view.jsx + --header-height: 80px; + + // Inline Player + --inline-player-max-height: calc(100vh - var(--header-height) - var(--spacing-l) * 2); + + // Card + --card-radius: var(--border-radius); + --card-max-width: 1000px; + --card-box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + + // Modal + --modal-width: 550px; + + // Animation :) + --animation-duration: 0.2s; + --animation-style: ease-in-out; + + // Image + --thumbnail-preview-height: 100px; + --thumbnail-preview-width: 177px; + --cover-photo-height: 210px; + --channel-thumbnail-width: 10rem; + --channel-thumbnail-width--small: 4rem; + --file-list-thumbnail-width: 10rem; + + --tag-height: 1.5rem; + + --livestream-comments-width: 30rem; +} + +@media (max-width: $breakpoint-small) { + :root { + --font-body: 0.8rem; + } +} diff --git a/web/scss/lbrytv.scss b/web/scss/lbrytv.scss new file mode 100644 index 000000000..a47b70c55 --- /dev/null +++ b/web/scss/lbrytv.scss @@ -0,0 +1,70 @@ +@charset "utf-8"; + +@import 'init/reset'; +@import 'init/vars'; +@import 'init/mixins'; +@import 'init/gui'; +@import 'init/base-theme'; + +@import 'themes/lbrytv/light.scss'; +@import 'themes/lbrytv/dark.scss'; +@import '../../ui/scss/component/ads'; +@import '../../ui/scss/component/animation'; +@import '../../ui/scss/component/badge'; +@import '../../ui/scss/component/block-list'; +@import '../../ui/scss/component/button'; +@import '../../ui/scss/component/card'; +@import '../../ui/scss/component/channel'; +@import '../../ui/scss/component/claim-list'; +@import '../../ui/scss/component/collection'; +@import '../../ui/scss/component/comments'; +@import '../../ui/scss/component/content'; +@import '../../ui/scss/component/dat-gui'; +@import '../../ui/scss/component/embed-player'; +@import '../../ui/scss/component/expandable'; +@import '../../ui/scss/component/expanding-details'; +@import '../../ui/scss/component/file-drop'; +@import '../../ui/scss/component/file-list'; +@import '../../ui/scss/component/file-properties'; +@import '../../ui/scss/component/file-render'; +@import '../../ui/scss/component/footer'; +@import '../../ui/scss/component/form-field'; +@import '../../ui/scss/component/header'; +@import '../../ui/scss/component/icon'; +@import '../../ui/scss/component/main'; +@import '../../ui/scss/component/markdown-editor'; +@import '../../ui/scss/component/markdown-preview'; +@import '../../ui/scss/component/media'; +@import '../../ui/scss/component/menu-button'; +@import '../../ui/scss/component/modal'; +@import '../../ui/scss/component/nag'; +@import '../../ui/scss/component/navigation'; +@import '../../ui/scss/component/notification'; +@import '../../ui/scss/component/nudge'; +@import '../../ui/scss/component/pagination'; +@import '../../ui/scss/component/post'; +@import '../../ui/scss/component/purchase'; +@import '../../ui/scss/component/placeholder'; +@import '../../ui/scss/component/progress'; +@import '../../ui/scss/component/search'; +@import '../../ui/scss/component/claim-search'; +@import '../../ui/scss/component/section'; +@import '../../ui/scss/component/share'; +@import '../../ui/scss/component/snack-bar'; +@import '../../ui/scss/component/spinner'; +@import '../../ui/scss/component/splash'; +@import '../../ui/scss/component/status-bar'; +@import '../../ui/scss/component/superchat'; +@import '../../ui/scss/component/syntax-highlighter'; +@import '../../ui/scss/component/table'; +@import '../../ui/scss/component/livestream'; +@import '../../ui/scss/component/tabs'; +@import '../../ui/scss/component/tooltip'; +@import '../../ui/scss/component/txo-list'; +@import '../../ui/scss/component/videojs'; +@import '../../ui/scss/component/tags'; +@import '../../ui/scss/component/wunderbar'; +@import '../../ui/scss/component/yrbl'; +@import '../../ui/scss/component/empty'; +@import '../../ui/scss/component/stripe-card'; +@import '../../ui/scss/component/wallet-tip-send'; diff --git a/web/scss/themes/lbrytv/dark.scss b/web/scss/themes/lbrytv/dark.scss new file mode 100644 index 000000000..b244eefa6 --- /dev/null +++ b/web/scss/themes/lbrytv/dark.scss @@ -0,0 +1,159 @@ +[theme='dark'] { + // Color overrides + --color-primary: #2bbb90; + --color-primary-alt: #3e675d; + --color-primary-alt-2: #065f46; + --color-primary-alt-3: #34e5b0; + --color-secondary: #204166; + --color-secondary-alt: #dbeafe; + --color-secondary-alt-2: #bfdbfe; + --color-secondary-alt-3: #2c5c8c; + + // Structure + --color-background: var(--color-gray-9); + --color-background-overlay: #21252999; + --color-border: #333338; + --color-card-background: var(--color-gray-8); + --color-card-background-highlighted: var(--color-gray-7); + + // Text + --color-text: var(--color-white); + --color-text-subtitle: var(--color-gray-4); + --color-text-empty: var(--color-text-subtitle); + --color-text-help: #bbbbbb; + --color-text-warning: #212529; + --color-text-warning--background: var(--lbry-yellow-1); + --color-text-error: #f87171; + --color-error: #61373f; + + // Tags (words) + --color-tag-words: var(--color-text); + --color-tag-words-bg: var(--color-gray-5); + --color-tag-words-hover: var(--color-white); + --color-tag-words-bg-hover: var(--color-gray-4); + + // Header + --color-header-background: var(--color-gray-8); + --color-header-button: var(--color-gray-6); + --color-header-button-hover: var(--color-gray-6); + --color-header-button-active: var(--color-gray-6); + + // Button + --color-button-primary-bg: var(--color-primary-alt); + --color-button-primary-bg-hover: var(--color-primary-alt-2); + --color-button-primary-text: var(--color-gray-2); + --color-button-primary-hover-text: var(--color-primary-alt); + --color-button-secondary-bg: var(--color-secondary); + --color-button-secondary-border: var(--color-secondary); + --color-button-secondary-bg-hover: var(--color-secondary-alt-3); + --color-button-secondary-text: var(--color-gray-2); + --color-button-alt-bg: var(--color-gray-7); + --color-button-alt-bg-hover: var(--color-gray-6); + --color-button-alt-text: var(--color-gray-1); + --color-button-border: var(--color-gray-5); + --color-button-toggle-text: var(--color-gray-1); + --color-link: var(--color-primary-alt-3); + --color-link-hover: var(--color-text); + --color-link-focus-bg: var(--color-gray-7); + + // Input + --color-input: var(--color-white); + --color-input-label: var(--color-gray-3); + --color-input-placeholder: var(--color-gray-1); + --color-input-bg: var(--color-header-button); + --color-input-bg-copyable: var(--color-gray-6); + --color-input-border: var(--color-border); + --color-input-border-active: var(--color-secondary); + --color-input-toggle: var(--color-primary-alt-3); + --color-input-toggle-bg: var(--color-input-bg); + --color-input-toggle-bg-hover: var(--color-secondary); + --color-input-bg-selected: var(--color-primary-alt); + --color-input-prefix-bg: var(--color-gray-5); + --color-input-prefix-border: var(--color-gray-4); + --select-toggle-background: url("data:image/svg+xml,%3Csvg viewBox='0 0 96 96' xmlns='http://www.w3.org/2000/svg' fill='%23ffffff'%3E%3Cpath d='M17.172, 31.172c1.562, -1.562 4.095, -1.562 5.656, 0l25.172, 25.171l25.172, -25.171c1.562, -1.562 4.095, -1.562 5.656, 0c1.562, 1.562 1.562, 4.095 0, 5.656l-28, 28c-1.562, 1.562 -4.095, 1.562 -5.656, 0l-28, -28c-0.781, -0.781 -1.172, -1.805 -1.172, -2.828c0, -1.023 0.391, -2.047 1.172, -2.828Z'/%3E%3C/svg%3E%0A"); + + // Navigation + --color-navigation-icon: var(--color-gray-4); + --color-navigation-link: var(--color-gray-4); + --color-navigation-active: var(--color-gray-7); + --color-navigation-active-text: var(--color-gray-3); + --color-navigation-hover: var(--color-gray-6); + --color-navigation-hover-text: var(--color-gray-3); + + // Tags + --color-tag: var(--color-primary-alt-3); + --color-tag-bg: var(--color-gray-7); + --color-tag-hover: var(--color-white); + --color-tag-bg-hover: var(--color-primary-alt); + + // Menu + --color-menu-background: var(--color-header-background); + --color-menu-background--active: var(--color-gray-7); + --color-menu-icon: var(--color-gray-4); + + // Comments + --color-comment-menu: var(--color-gray-5); + --color-comment-menu-hovering: var(--color-gray-2); + --color-comment-threadline: #434b54; + --color-comment-threadline-hover: var(--color-gray-4); + --color-comment-highlighted: #484734; + + // Snack + --color-snack-bg: var(--color-secondary); + + // Superchat + --color-superchat-text: var(--color-black); + --color-superchat-text__light: var(--color-text); + --color-superchat: #fcd34d; + --color-superchat__light: #ef4e1647; + --color-superchat-2: #fde68a; + --color-superchat-3: #fef3c7; + --color-superchat-3__light: #58066087; + --color-superchat-4: #fffbeb; + + // Other + --color-focus: #93c5fd50; + --color-nag: var(--color-orange); + --color-tab-text: var(--color-white); + --color-tabs-background: var(--color-card-background); + --color-tab-divider: var(--color-white); + --color-modal-background: var(--color-card-background); + --color-notice: #58563b; + --color-purchased: #ffd580; + --color-purchased-alt: var(--color-purchased); + --color-purchased-text: var(--color-gray-5); + --color-thumbnail-background: var(--color-gray-5); + --color-tooltip-bg: #2f3337; + --color-help-warning-bg: #d97706; + --color-help-warning-text: white; + --color-blockquote: var(--color-gray-5); + --color-placeholder-background: #4e5862; + --color-spinner-light: #5a6570; + --color-spinner-dark: #212529; + --color-login-graphic-background: var(--color-background); + + // Editor + --color-editor-cursor: var(--color-text); + --color-editor-quote: #d3d3d3; + --color-editor-tag: #efbe5d; + --color-editor-attr: #68ccf9; + --color-editor-string: #ff8b6b; + --color-editor-inline-code-fg: #ce9178; + --color-editor-inline-code-fg-preview: #e8b692; + --color-editor-inline-code-bg: rgba(20, 68, 102, 0.3); + --color-editor-inline-code-bg-preview: #464b50; + --color-editor-selected: #264f78; + --color-editor-link: var(--color-link); + --color-editor-url: var(--color-editor-string); + --color-editor-hr: var(--color-editor-tag); + --color-editor-hr-preview: #a0a0a0; + + // Ads + --color-ads-background: #475057; + --color-ads-text: #111; + --color-ads-link: var(--color-primary-alt); + + // Scrollbar + --color-scrollbar-thumb-bg: rgba(255, 255, 255, 0.2); + --color-scrollbar-track-bg: transparent; +} diff --git a/web/scss/themes/lbrytv/light.scss b/web/scss/themes/lbrytv/light.scss new file mode 100644 index 000000000..5a4260fca --- /dev/null +++ b/web/scss/themes/lbrytv/light.scss @@ -0,0 +1,2 @@ +:root { +} diff --git a/web/scss/themes/odysee/dark.scss b/web/scss/themes/odysee/dark.scss new file mode 100644 index 000000000..6cae5e194 --- /dev/null +++ b/web/scss/themes/odysee/dark.scss @@ -0,0 +1,143 @@ +[theme='dark'] { + // Color overrides + --color-primary: #e50054; + --color-primary-alt: #66001880; + --color-fire: #ff6635; + --color-fire-outside: #ff9b20; + + // Structure + --color-background: #140e1b; + --color-background-overlay: #0c0d0e95; + --color-border: #30243d; + --color-card-background: #181021; + --color-card-background-highlighted: #241c30; + + // Text + --color-text: var(--color-gray-1); + --color-text-subtitle: var(--color-gray-4); + --color-text-empty: var(--color-text-subtitle); + --color-text-help: #bbbbbb; + --color-text-warning: #212529; + --color-text-warning--background: var(--lbry-yellow-1); + --color-text-error: var(--color-danger); + --color-error: var(--color-danger-alt); + --color-blockquote: var(--color-gray-5); + --color-blockquote-bg: var(--color-card-background-highlighted); + --color-help-warning-text: var(--color-white-alt); + --color-help-warning-bg: #fbbf2450; + + // Tags (words) + --color-tag-words: var(--color-text); + --color-tag-words-bg: var(--color-gray-5); + --color-tag-words-hover: var(--color-white); + --color-tag-words-bg-hover: var(--color-gray-4); + + // Header + --color-header-button: #38274c; + --color-header-background: #231830; + + // Button + --color-button-primary-text: white; + --color-button-primary-hover-text: var(--color-primary-alt); + --color-button-secondary-bg: #2c1543; + --color-button-secondary-border: #4f1c82; + --color-button-secondary-bg-hover: #3b1c5b; + --color-button-secondary-text: #efefef; + --color-button-alt-bg: var(--color-header-button); + --color-button-alt-bg-hover: #2b2037; + --color-button-toggle-text: var(--color-text); + --color-button-toggle-bg: var(--color-primary-alt); + --color-button-toggle-bg-hover: var(--color-primary-alt); + --color-button-alt-text: #e2e9f0; + --color-button-border: #5b4475; + --color-link: var(--color-primary); + --color-link-hover: #d75673; + --color-link-active: #ec1d4c; + --color-link-focus-bg: #3d2d4e; + + // Input + --color-input: #f4f4f5; + --color-input-label: #a7a7a7; + --color-input-placeholder: #f4f4f5; + --color-input-bg: var(--color-header-button); + --color-input-bg-copyable: #4c3861; + --color-input-border: var(--color-border); + --color-input-border-active: var(--color-secondary); + --color-input-toggle: var(--color-primary-alt-3); + --color-input-toggle-bg: var(--color-input-bg); + --color-input-toggle-bg-hover: var(--color-secondary); + --color-input-bg-selected: var(--color-primary-alt); + --color-input-prefix-bg: var(--color-input-bg-copyable); + --color-input-prefix-border: var(--color-gray-4); + --select-toggle-background: url("data:image/svg+xml,%3Csvg viewBox='0 0 96 96' xmlns='http://www.w3.org/2000/svg' fill='%23ffffff'%3E%3Cpath d='M17.172, 31.172c1.562, -1.562 4.095, -1.562 5.656, 0l25.172, 25.171l25.172, -25.171c1.562, -1.562 4.095, -1.562 5.656, 0c1.562, 1.562 1.562, 4.095 0, 5.656l-28, 28c-1.562, 1.562 -4.095, 1.562 -5.656, 0l-28, -28c-0.781, -0.781 -1.172, -1.805 -1.172, -2.828c0, -1.023 0.391, -2.047 1.172, -2.828Z'/%3E%3C/svg%3E%0A"); + + // Navigation + --color-navigation-icon: #76808a; + --color-navigation-link: #b9c3ce; + --color-navigation-active: #2b2037; + --color-navigation-active-text: #c6bcd2; + --color-navigation-hover: #21182a; + --color-navigation-hover-text: #c6bcd2; + + // Tags + --color-tag: #ff85b1; + --color-tag-bg: var(--color-navigation-hover); + --color-tag-hover: var(--color-white); + --color-tag-bg-hover: var(--color-primary-alt-2); + --color-tag-mature-bg: var(--color-primary-alt-2); + + // Menu + --color-menu-background: var(--color-header-background); + --color-menu-background--active: var(--color-primary-alt); + --color-menu-icon: #928b9b; + --color-menu-icon-active: #d6d6d6; + + // Comments + --color-comment-menu: #6a6a6a; + --color-comment-menu-hovering: #e0e0e0; + --color-comment-highlighted: #484734; + --color-comment-threadline: #24192f; + --color-comment-threadline-hover: var(--color-gray-4); + + // Other + --color-tab-text: var(--color-white); + --color-tabs-background: var(--color-card-background); + --color-tab-divider: var(--color-white); + --color-modal-background: var(--color-card-background); + --color-notice: #58563b; + --color-purchased: #ffd580; + --color-purchased-alt: var(--color-purchased); + --color-purchased-text: black; + --color-thumbnail-background: var(--color-gray-5); + --color-tooltip-bg: #2f3337; + --color-focus: #e91e6329; + --color-placeholder-background: #261a35; + --color-spinner-light: white; + --color-spinner-dark: #212529; + --color-login-graphic-background: var(--color-background); + + // Editor + --color-editor-cursor: var(--color-text); + --color-editor-quote: #d3d3d3; + --color-editor-tag: #efbe5d; + --color-editor-attr: #68ccf9; + --color-editor-string: #ff8b6b; + --color-editor-inline-code-fg: #ce9178; + --color-editor-inline-code-fg-preview: #e8b692; + --color-editor-inline-code-bg: rgba(20, 68, 102, 0.3); + --color-editor-inline-code-bg-preview: #464b50; + --color-editor-selected: #264f78; + --color-editor-link: var(--color-link); + --color-editor-url: var(--color-editor-string); + --color-editor-hr: var(--color-editor-tag); + --color-editor-hr-preview: #a0a0a0; + + // Ads + --color-ads-background: #475057; + --color-ads-text: #111; + --color-ads-link: var(--color-primary-alt); + + // Scrollbar + --color-scrollbar-thumb-bg: rgba(255, 255, 255, 0.2); + --color-scrollbar-track-bg: transparent; +} diff --git a/web/scss/themes/odysee/light.scss b/web/scss/themes/odysee/light.scss new file mode 100644 index 000000000..fe75e4586 --- /dev/null +++ b/web/scss/themes/odysee/light.scss @@ -0,0 +1,155 @@ +:root { + // Color overrides + --color-primary: #fa6165; + --color-primary-alt: #fef1f6; + --color-primary-alt-2: #fb7e82; + --color-primary-alt-3: #fbcbdd; + --color-secondary: #f9902a; + --color-secondary-alt: #fee8d2; + --color-secondary-alt-2: #fefcf6; + + // Structure + --color-border: #ededed; + --color-background: #fafafa; + --color-background-overlay: #21252980; + --color-card-background: #ffffff; + --color-card-background-highlighted: #fff5f5; + + // Text + --color-text-selection-bg: var(--color-primary-alt); + --color-text-selection: var(--color-primary); + --color-text-error: var(--color-danger); + --color-text-empty: #999999; + --color-text-help: #999999; + --color-text-subtitle: #767676; + --color-text-warning: #212529; + --color-help-warning-bg: #fef3c7; + --color-text-warning--background: var(--lbry-yellow-1); + --color-blockquote: var(--color-gray-3); + --color-blockquote-bg: var(--color-gray-1); + --color-tooltip-bg: #222; + --color-tooltip-text: #fafafa; + + // Header + --color-header-button: var(--color-button-alt-bg); + --color-header-background: #ffffff; + + // Button + --color-button-alt-bg: var(--color-gray-1); + --color-button-alt-bg-hover: var(--color-gray-2); + --color-button-alt-text: black; + --color-button-primary-bg: var(--color-primary); + --color-button-primary-bg-hover: var(--color-primary-alt-2); + --color-button-primary-text: var(--color-primary-alt); + --color-button-primary-hover-text: var(--color-white); + --color-button-secondary-bg: var(--color-primary-alt); + --color-button-secondary-border: var(--color-primary-alt-3); + --color-button-secondary-text: var(--color-primary); + --color-button-secondary-bg-hover: var(--color-primary-alt-3); + --color-button-toggle-text: var(--color-primary); + --color-button-toggle-bg: var(--color-primary-alt); + --color-button-toggle-bg-hover: var(--color-primary-alt); + --color-button-border: var(--color-gray-3); + --color-link-active: var(--color-primary); + --color-link-focus-bg: #f1f1f1; + --color-link: var(--color-primary); + + // Input + --color-input-bg-selected: var(--color-primary-alt); + --color-input-color: #111111; + --color-input-label: var(--color-gray-5); + --color-input-placeholder: #212529; + --color-input-bg: var(--color-gray-1); + --color-input-border: var(--color-border); + --color-input-border-active: var(--color-secondary); + --color-input-toggle: var(--color-secondary); + --color-input-toggle-bg: var(--color-gray-1); + --color-input-toggle-bg-hover: var(--color-secondary-alt); + --color-input-prefix-bg: var(--color-gray-2); + --color-input-prefix-border: var(--color-gray-5); + --select-toggle-background: url("data:image/svg+xml,%3Csvg viewBox='0 0 96 96' xmlns='http://www.w3.org/2000/svg' fill='%23212529'%3E%3Cpath d='M17.172, 31.172c1.562, -1.562 4.095, -1.562 5.656, 0l25.172, 25.171l25.172, -25.171c1.562, -1.562 4.095, -1.562 5.656, 0c1.562, 1.562 1.562, 4.095 0, 5.656l-28, 28c-1.562, 1.562 -4.095, 1.562 -5.656, 0l-28, -28c-0.781, -0.781 -1.172, -1.805 -1.172, -2.828c0, -1.023 0.391, -2.047 1.172, -2.828Z'/%3E%3C/svg%3E%0A"); + + // Navigation + --color-navigation-icon: var(--color-gray-5); + --color-navigation-link: var(--color-gray-5); + --color-navigation-active: var(--color-primary-alt); + --color-navigation-active-text: var(--color-primary); + --color-navigation-hover: var(--color-gray-1); + --color-navigation-hover-text: #3f3f3f; + + // Tags + --color-tag: var(--color-primary-alt-2); + --color-tag-bg: #f9f6f7; + --color-tag-hover: var(--color-button-alt-text); + --color-tag-bg-hover: var(--color-button-alt-bg-hover); + + // Menu + --color-menu-background: var(--color-header-background); + --color-menu-icon: var(--color-navigation-link); + --color-menu-icon-active: var(--color-navigation-link); + --color-menu-background--selected: var(--color-secondary-alt); + --color-menu-background--active: var(--color-primary-alt); + + // Comments + --color-comment-menu: #e0e0e0; + --color-comment-menu-hovering: #6a6a6a; + --color-comment-highlighted: #fff2d9; + --color-comment-threadline: var(--color-gray-1); + --color-comment-threadline-hover: var(--color-gray-4); + + // Superchat + --color-superchat-text: var(--color-black); + --color-superchat: #fcd34d; + --color-superchat__light: #fcd34d50; + --color-superchat-2: #fde68a; + --color-superchat-3: #fef3c7; + --color-superchat-3__light: #fef3c750; + --color-superchat-4: #fffbeb; + + // Color + --color-focus: #8dbff0; + --color-nag: #fa8700; + --color-error: #fcafca; + --color-notice: #fef3ca; + --color-purchased: var(--color-cost); + --color-purchased-alt: #ffebc2; + --color-purchased-text: black; + --color-thumbnail-background: var(--color-gray-1); + --color-spinner-light: #ffffff; + --color-spinner-dark: #212529; + --color-placeholder-background: #f0f0f0; + --color-file-viewer-background: var(--color-card-background); + --color-tabs-background: var(--color-card-background); + --color-tab-divider: var(--color-primary); + --color-modal-background: var(--color-card-background); + + // Icons + --color-follow-bg: #ffd4da; + --color-follow-icon: #e2495e; + --color-view-bg: var(--color-secondary-alt); + --color-view-icon: var(--color-secondary); + + // Editor + --color-editor-cursor: var(--color-text); + --color-editor-quote: #707070; + --color-editor-tag: #ea9400; + --color-editor-attr: #04b0f4; + --color-editor-string: #ff7451; + --color-editor-inline-code-fg: var(--color-text); + --color-editor-inline-code-fg-preview: #2e3439; + --color-editor-inline-code-bg: rgba(157, 161, 165, 0.3); + --color-editor-inline-code-bg-preview: #d0e8ff; + --color-editor-selected: #add6ff; + --color-editor-link: var(--color-link); + --color-editor-url: var(--color-editor-string); + --color-editor-hr: var(--color-editor-tag); + --color-editor-hr-preview: #cccccc; + + // Ads + --color-ads-background: #fae5ff; + --color-ads-link: var(--color-link); + + // Scrollbar + --color-scrollbar-thumb-bg: rgba(0, 0, 0, 0.2); + --color-scrollbar-track-bg: transparent; +} diff --git a/web/webpack.config.js b/web/webpack.config.js index 3d6d70283..7c4f4f7b6 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -1,4 +1,4 @@ -const { WEBPACK_WEB_PORT, LBRY_WEB_API } = require('../config.js'); +const { WEBPACK_WEB_PORT, LBRY_WEB_API, BRANDED_SITE } = require('../config.js'); const path = require('path'); const fs = require('fs'); const merge = require('webpack-merge'); @@ -153,6 +153,7 @@ const webConfig = { exclude: /node_modules/, options: { TARGET: 'web', + BRANDED_SITE: BRANDED_SITE, ppOptions: { type: 'js', },