diff --git a/src/scss/_global.scss b/src/scss/_global.scss index f70b4ae..2ecb8a1 100644 --- a/src/scss/_global.scss +++ b/src/scss/_global.scss @@ -8,16 +8,220 @@ --color-grey-500: #9CA3AF; --color-grey-800: #4B5563; --color-grey-900: #3A3A3A; + --color-grey-950: #1f1f1f; --color-white: #ffffff; --shadow-md: 0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06); --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05); --shadow-xl: 0 25px 50px -12px rgba(0,0,0,0.25); + + --icon-sun: url('data:image/svg+xml,\ + \ + \ + '); + --icon-sun-filter: invert(0.61) sepia(0.8) saturate(5) hue-rotate(0deg) brightness(0.92); + --icon-moon: url('data:image/svg+xml,\ + \ + \ + '); + --icon-moon-filter: invert(0.75); + + + + + + + --color-mode: 'light'; + --color-dark: #141414; + --color-dark-alpha: rgba(0, 0, 0, 0.1); + --color-light: #efefef; + --color-light-alpha: rgba(255, 255, 255, 0.9); + --icon-sun: url('data:image/svg+xml,\ + \ + \ + '); + --icon-sun-filter: invert(0.61) sepia(0.8) saturate(5) hue-rotate(0deg) brightness(0.92); + --icon-moon: url('data:image/svg+xml,\ + \ + \ + '); + --icon-moon-filter: invert(0.75); + --background: #efefef; + --text-color: #141414; + --button-icon: var(--icon-moon); + --button-icon-filter: var(--icon-moon-filter); + --button-background: var(--color-dark); + --button-color: var(--color-light); + --border-color: var(--color-dark-alpha); } +@media (prefers-color-scheme: dark) { + :root { + --color-mode: 'dark'; + } + + :root:not([data-user-color-scheme]) { + --background: var(--color-dark); + --text-color: var(--color-light); + --button-icon: var(--icon-sun); + --button-icon-filter: var(--icon-sun-filter); + --button-background: var(--color-light-alpha); + --button-color: var(--color-dark); + --border-color: var(--color-light-alpha); + + + --color-primary: hsl(from var(--primary-color) h s calc(l - 50)); + --color-secondary: hsl(from var(--secondary-color) h s calc(l + 10)); + + --logo-primary-color: hsl(from var(--primary-color) h s calc(l - 25)); + + --card-color: var(--color-white); + --card-bg: #181A1B; + --card-tag-bg: var(--color-white); + --card-tag-color: var(--color-grey-900); + --card-placeholder: var(--color-grey-400); + + --nav-color: var(--color-white); + --nav-active-bg: #2C2F31; + // --nav-active-color: var(--color-grey-900); + // --nav-hover-color: var(--color-grey-900); + --nav-hover-bg: #2C2F31; + + --tags-color: #c3beb6; + --tags-hover-color: #e8e6e3; + --tags-hover-bg: #3e4345; + --tags-active-color: #e8e6e3; + --tags-active-bg: #3e4345; + + --recipe-placeholder: var(--color-grey-400); + --recipe-color: var(--color-white); + --recipe-serving-color: #e8e6e3; + --recipe-serving-bg: #2c2f31; + --recipe-serving-hover-bg: #3c444f; + + --search-bg: var(--color-grey-950); + --search-border-color: var(--color-grey-500); + --search-input-border-color: var(--color-white); + --search-results-bg: var(--color-grey-950); + --search-results-border-color: var(--color-grey-500); + + --home-gradient-1: #1B1D1E; + --home-gradient-bg: transparent; + + --bgc-grey-100: #1B1D1E; + --site-bg: #181A1B; + --site-color: var(--color-white); + color-scheme: dark; + } +} + +[data-user-color-scheme='dark'] { + --background: var(--color-dark); + --text-color: var(--color-light); + --button-icon: var(--icon-sun); + --button-icon-filter: var(--icon-sun-filter); + --button-background: var(--color-light-alpha); + --button-color: var(--color-dark); + --border-color: var(--color-light-alpha); + + + --color-primary: hsl(from var(--primary-color) h s calc(l - 50)); + --color-secondary: hsl(from var(--secondary-color) h s calc(l + 10)); + + --logo-primary-color: hsl(from var(--primary-color) h s calc(l - 25)); + + --card-color: var(--color-white); + --card-bg: #181A1B; + --card-tag-bg: var(--color-white); + --card-tag-color: var(--color-grey-900); + --card-placeholder: var(--color-grey-400); + + --nav-color: var(--color-white); + --nav-active-bg: #2C2F31; + // --nav-active-color: var(--color-grey-900); + // --nav-hover-color: var(--color-grey-900); + --nav-hover-bg: #2C2F31; + + --tags-color: #c3beb6; + --tags-hover-color: #e8e6e3; + --tags-hover-bg: #3e4345; + --tags-active-color: #e8e6e3; + --tags-active-bg: #3e4345; + + --recipe-placeholder: var(--color-grey-400); + --recipe-color: var(--color-white); + --recipe-serving-color: #e8e6e3; + --recipe-serving-bg: #2c2f31; + --recipe-serving-hover-bg: #3c444f; + + --search-bg: var(--color-grey-950); + --search-border-color: var(--color-grey-500); + --search-input-border-color: var(--color-white); + --search-results-bg: var(--color-grey-950); + --search-results-border-color: var(--color-grey-500); + + --home-gradient-1: #1B1D1E; + --home-gradient-bg: transparent; + + --bgc-grey-100: #1B1D1E; + --site-bg: #181A1B; + --site-color: var(--color-white); + color-scheme: dark; +} + + + + +.no-js .user-toggle { + display: none; + } + +// .user-toggle { +// margin: 2rem auto 0 auto; +// padding-top: 2.5rem; +// max-width: 20rem; +// border-top: 1px solid var(--border-color); +// text-align: center; +// } + + .toggle-button { + display: inline-flex; + background: var(--button-background); + color: var(--button-color); + border: none; + font: inherit; + // font-size: 1.5rem; + gap: .5em; + padding: .4rem .6rem; + align-items: center; + transition: background 500ms ease-in-out, color 200ms ease; + } + + .toggle-button__icon { + background: var(--button-icon); + width: 1.2em; + height: 1.2em; + filter: var(--button-icon-filter); + transform: translateY(1px); /* Optical adjustment */ + transition: filter 500ms ease-in-out; + } + + .toggle-button:focus:focus-visible { + outline: 1px solid var(--button-background); + outline-offset: 0.5rem; + } + + + + + + body { display: flex; flex-direction: column; + background: var(--site-bg, vra(--color-white)); + color: var(--site-color, vra(--color-grey-900)); + transition: background 500ms ease-in-out, color 200ms ease; } main { diff --git a/src/scss/_utility.scss b/src/scss/_utility.scss index 4d4565a..d0bb67a 100644 --- a/src/scss/_utility.scss +++ b/src/scss/_utility.scss @@ -27,7 +27,7 @@ .u-bgc-grey-100 { - background-color: var(--color-grey-100); + background-color: var(--bgc-grey-100, var(--color-grey-100)); } .u-highlight { @@ -46,4 +46,16 @@ .u-mb-large { margin-bottom: 30px; +} + +.visually-hidden { + display: block; + height: 1px; + width: 1px; + overflow: hidden; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(1px); + white-space: nowrap; + position: absolute; } \ No newline at end of file diff --git a/src/scss/components/_card.scss b/src/scss/components/_card.scss index 7a7b688..999e332 100644 --- a/src/scss/components/_card.scss +++ b/src/scss/components/_card.scss @@ -12,17 +12,17 @@ display: flex; flex-direction: column; border-radius: 20px; - background-color: var(--color-white); + background-color: var(--card-bg, var(--color-white)); box-shadow: var(--shadow-md); text-decoration: none; - color: var(--color-grey-900); + color: var(--card-color, var(--color-grey-900)); } .c-card__image { height: auto; aspect-ratio: 16/9; object-fit: cover; - background-color: var(--color-grey-500); // fallback while image is loading + background-color: var(--card-placeholder, var(--color-grey-500)); // fallback while image is loading border-radius: 20px 20px 0 0; } @@ -33,6 +33,7 @@ justify-content: space-between; align-items: center; background-color: var(--color-primary); + min-height: calc(1.5em + (12px * 2)); } .c-card__tag-abbr { @@ -46,8 +47,8 @@ justify-content: center; align-items: center; font-weight: bold; - background-color: var(--color-grey-900); - color: var(--color-white); + background-color: var(--card-tag-bg, var(--color-grey-900)); + color: var(--card-tag-color, var(--color-white)); border-radius: 50%; } @@ -57,7 +58,7 @@ svg { margin-right: 6px; - fill: var(--color-grey-900); + fill: var(--card-color, var(--color-grey-900)); } } @@ -67,7 +68,7 @@ align-items: center; padding: 12px 18px; text-decoration: none; - color: var(--color-grey-900); + color: var(--card-color, var(--color-grey-900)); &::before { content: ""; @@ -85,7 +86,7 @@ &::before { outline: none; box-shadow: var(--shadow-lg); - color: var(--color-grey-900); + color: var(--card-color, var(--color-grey-900)); text-decoration: none; } } diff --git a/src/scss/components/_home.scss b/src/scss/components/_home.scss index 2fbbf8a..020cd5c 100644 --- a/src/scss/components/_home.scss +++ b/src/scss/components/_home.scss @@ -5,8 +5,8 @@ z-index: -10; width: 100%; height: 400px; - background-image: linear-gradient(to bottom, var(--color-primary), var(--color-white)); - background-color: hsla(0, 0%, 100%, .3); + background-image: linear-gradient(to bottom, var(--color-primary), var(--home-gradient-1, var(--color-white))); + background-color: var(--home-gradient-bg, hsla(0, 0%, 100%, .3)); background-blend-mode: overlay; } } diff --git a/src/scss/components/_nav.scss b/src/scss/components/_nav.scss index a0f1ffd..e5cb668 100644 --- a/src/scss/components/_nav.scss +++ b/src/scss/components/_nav.scss @@ -27,7 +27,7 @@ .c-nav__home { display: flex; align-items: center; - color: var(--color-grey-900); + color: var(--nav-color, var(--color-grey-900)); text-decoration: none; &:hover, &:focus { @@ -51,19 +51,19 @@ .c-nav__nav-item { padding: 4px 8px; display: flex; - color: var(--color-grey-900); + color: var(--nav-color, var(--color-grey-900)); text-decoration: none; &:hover, &:focus { text-decoration: none; - background-color: var(--color-grey-900); - color: var(--color-white); + background-color: var(--nav-hover-bg, var(--color-grey-900)); + color: var(--nav-hover-color, var(--color-white)); border-radius: 6px; } } .c-nav__nav-item--active { - background-color: var(--color-grey-900); - color: var(--color-white); + background-color: var(--nav-active-bg, var(--color-grey-900)); + color: var(--nav-active-color, var(--color-white)); border-radius: 6px; } \ No newline at end of file diff --git a/src/scss/components/_recipe-tags.scss b/src/scss/components/_recipe-tags.scss index 2a8d077..d1d8ec5 100644 --- a/src/scss/components/_recipe-tags.scss +++ b/src/scss/components/_recipe-tags.scss @@ -8,7 +8,7 @@ .c-tags__tag { display: inline-flex; padding: 2px 6px; - color: var(--color-grey-900); + color: var(--tags-color, var(--color-grey-900)); text-decoration: none; border: 1px solid currentColor; border-radius: 8px; @@ -16,13 +16,13 @@ &:hover, &:focus { text-decoration: none; - color: var(--color-white); - background-color: var(--color-grey-900); + color: var(--tags-hover-color, var(--color-white)); + background-color: var(--tags-hover-bg, var(--color-grey-900)); } } .c-tag__tag--selected { - color: var(--color-white); - background-color: var(--color-grey-900); + color: var(--tags-active-color, var(--color-white)); + background-color: var(--tags-active-bg, var(--color-grey-900)); border: 1px solid currentColor; } \ No newline at end of file diff --git a/src/scss/components/_recipe.scss b/src/scss/components/_recipe.scss index a140811..e02bb8b 100644 --- a/src/scss/components/_recipe.scss +++ b/src/scss/components/_recipe.scss @@ -5,7 +5,7 @@ object-fit: cover; height: 50vh; min-height: 300px; - background-color: var(--color-grey-500); // fallback while image is loading + background-color: var(--recipe-placeholder, var(--color-grey-500)); // fallback while image is loading } .c-recipe__title { @@ -19,6 +19,7 @@ } input[type="checkbox"] { + accent-color: var(--color-secondary); margin: 0; margin-inline-end: 6px; } @@ -29,7 +30,7 @@ svg { margin-right: 6px; - fill: var(--color-grey-900); + fill: var(--recipe-color, var(--color-grey-900)); } } @@ -74,13 +75,13 @@ display: inline-flex; justify-content: center; align-items: center; - background-color: var(--color-grey-900); + background-color: var(--recipe-serving-bg, var(--color-grey-900)); border: none; border-radius: 50%; - color: var(--color-white); + color: var(--recipe-serving-color, var(--color-white)); &:hover, &:focus { - background-color: var(--color-grey-800); + background-color: var(--recipe-serving-hover-bg, var(--color-grey-800)); } } diff --git a/src/scss/components/_search.scss b/src/scss/components/_search.scss index 386a902..f58ba7c 100644 --- a/src/scss/components/_search.scss +++ b/src/scss/components/_search.scss @@ -26,9 +26,9 @@ top: 60px; right: 0; width: 100%; - background-color: var(--color-white); + background-color: var(--search-bg, var(--color-white)); padding: 24px; - border: 1px solid var(--color-grey-300); + border: 1px solid var(--search-border-color, var(--color-grey-300)); border-radius: 10px; box-shadow: var(--shadow-xl); font-size: 1rem; @@ -69,7 +69,7 @@ .c-search__input { width: 100%; padding: 4px 12px; - border: 2px solid var(--color-grey-900); + border: 2px solid var(--search-input-border-color, var(--color-grey-900)); border-radius: 30px; } @@ -77,7 +77,7 @@ padding: 12px 18px 12px 46px; width: 100%; padding: 12px 18px 12px 46px; - border: 2px solid var(--color-grey-900); + border: 2px solid var(--search-input-border-color, var(--color-grey-900)); } .c-search__close-button { @@ -126,8 +126,8 @@ width: 100%; max-width: 500px; padding: 24px; - background-color: var(--color-white); - border: 1px solid var(--color-grey-300); + background-color: var(--search-results-bg, var(--color-white)); + border: 1px solid var(--search-results-border-color, var(--color-grey-300)); box-shadow: var(--shadow-xl); border-radius: 10px; }