Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Прототип тёмной темы #172

Merged

Conversation

vitalybaev
Copy link
Contributor

@vitalybaev vitalybaev commented Jan 21, 2021

Решает #162

Как и обещал, публикую прототип тёмной темы на основе макета для того, чтобы пощупать, понять слабые места и всячески довести до ума.

Живой пример

Основные моменты

  • Выбор темы опирается на сохраненное в localStorage значение или же смотрит prefered-color-scheme
  • Сразу после body добавлен небольшой сниппет кода, который собственно определяет текущую тему и сразу навешивает класс на <html>. Благодаря этому нет мерцания (наподобие FOUC) до загрузки и парсинга CSS. Единственное Eleventy почему-то не хочет его минифицировать
  • Сам JS для отслеживания изменения prefered-color-scheme также предстоит дописать, опыт есть, проблем не ожидаю
  • Еще есть изрядно мест, куда мои руки вообще не дошли или глаза не увидели. Однако уже можно выложить это в паблик на обсуждение
  • С аватарками все оказалось немного прозаичнее - там была svg фигура с fill. Другого способа, кроме как для тёмной темы подменять svg на другую, в которой цвет fill совпадает с цветом фона - я не нашел.
  • Я не лез глубоко в переменные и цвета, добавил новые цвета в переменные не по их названию, а по их назначению
  • Попробовал сделать лого Patreon одноцветным и подвигать его немного

Доработки

  • Переключатель темы
  • Текст цитат в статьях черного цвета
  • Необходимо сбросить цвет фона хедера на десктопе
  • Тёмные якоря копирования ссылки на раздел
  • Hero статья на главной имеет текст самого белого цвета, неприятно глазам
  • Выбранный тег на странице тегов - тёмный

@Holiden
Copy link
Member

Holiden commented Jan 22, 2021

Круто же) Молодец!

Поклацал чуток, нашёл в статьях в цитатах цвет шрифта чёрный и кнопки копирования ссылок у заголовков темноватые.

@higimo
Copy link
Contributor

higimo commented Jan 24, 2021

В целом, код не вызывает никаких вопросов, но надо бы переключалку тем.

За цвет большой плашки статьи, отличный от прочих — лайк.

Потенциальные проблемы:

  • Белая окантовка
    image
  • Цветастость списка ссылок и бледность цепочки
    image
    image
  • Очень разный контрастный баланс жирного текста
    image
    image
  • В шапке в статьях что-то сломалось
    image
  • При клике в код рамка слишком белёсая
    image
  • Визитед сбивают с толку
    image
  • Эмоджи можно притушить?
    image
  • Цитаты
    image

…mode-prototype

# Conflicts:
#	src/layouts/page.njk
#	src/styles/blocks/footer.css
#	src/styles/blocks/header.css
#	src/styles/blocks/logo.css
#	src/styles/blocks/navigation.css
#	src/styles/blocks/page.css
#	src/styles/styles.css
@vitalybaev
Copy link
Contributor Author

  • Добавил переключалку темы
  • По поводу цветастости - она мешает? Ссылки намеренно сделал ярче в темном режиме, но нужно решить, как оставим. Поскольку иконка ссылки сделана SVG, её нужно подредактировать отдельно, когда определимся с цветом
  • С контрастностью текста статей поигрался, но пока замылилсы взгляд )) что-то не до конца нравится
  • Шапка уже обновилась у нас
  • Вот с рамками хрома надо разобраться, да.
  • Визитед често, не пойму какой цвет тут будет уместнее. По смыслу серый отлично вписывается.
  • Эмоджи - часть текста, честно говоря не знаю, как автоматом это сделать и можно ли (ну кроме JS решений)
  • Цвет цитат пофиксил

@monochromer
Copy link
Member

  • Единственное Eleventy почему-то не хочет его минифицировать

Для этого у html-minifier есть опция minifyJS . Но судя по докам, используется устаревший UglifyJS, поэтому возможно было бы лучше сделать nunjucks-фильтр на основе Terser.

@vitalybaev
Copy link
Contributor Author

@monochromer спасибо за комментарии, надеюсь, к концу недели буду свободен и пройдусь по многим пунктам. Правки наподобие использования дизайн-токенов я бы вынес на обсуждение для следующей итерации, иначе боюсь этот пул реквест слишком затянется.

@vitalybaev vitalybaev force-pushed the feature/162-dark-mode-prototype branch from 58bc616 to e8de3c0 Compare May 8, 2021 17:30
@monochromer
Copy link
Member

Часть js-кода размещена прямо в HTML для избежания мерцания темы. Другая была в отдельном файле. Перенёс весь код в один отдельный js-файл, он также инлайнится в html. Также для этого добавил настройки минификации для пакета html terser.

@monochromer
Copy link
Member

Вроде все конфликты поправил. Думаю, можно глядеть.

@pepelsbey
Copy link
Member

pepelsbey commented Aug 19, 2024

Работает красиво, вроде. Надо бы только придумать, как объяснить переключатель пользователю, поскольку он не трёхпозиционный. Мне пришлось долго кликать по нему, прежде чем я понял принцип его работы.

  1. Изначально иконка соответствует системной теме.
  2. Ты нажимаешь её и форсишь противоположную тему, то есть вжимаешь кнопку.
  3. Если ты хочешь вернуться к системной теме, ты отжимаешь кнопку и тема забывается.

К сожалению, эти состояния никак не отображаются: ни визуально, ни в коде, ни в лейбле.

Как я это вижу на уровне кода:

<!-- Зашёл первый раз со светлой темой -->
<button aria-label="Включить тёмную тему и запомнить выбор">

<!-- Зашёл первый раз с тёмной темой -->
<button aria-label="Включить светлую тему и запомнить выбор">

<!-- Сразу после нажатия или если скрипт нашёл запомненную тему -->
<button aria-label="Вернуться к системной теме">

А вот как визуально это показать — это вопрос. Надо подумать.

@monochromer
Copy link
Member

Если оставаться в рамках одной кнопки, то можно работать с "Включить тёмную тему / Выключить тёмную тему":

<!-- изначально ничего не выбрано -->
<button>
  <span>Включить тёмную тему</span>
</button>
<!-- выбрана тёмная тема -->
<button>
  <span>Выключить тёмную тему</span>
</button>

Можно сделать две кнопки и менять им aria-pressed:

<!-- изначально ничего не выбрано -->
<div>
  <button aria-pressed="false">Включить тёмную тему</button>
  <button aria-pressed="true">Включить светлую тему</button>
</div>

@monochromer
Copy link
Member

Ну или давайте сделаем переключатель из 3-х кнопок - "авто (системная)", "светлая", "тёмная"

@pepelsbey
Copy link
Member

pepelsbey commented Aug 22, 2024

Ну или давайте сделаем переключатель из 3-х кнопок - "авто (системная)", "светлая", "тёмная"

Мне кажется так будет лучше всего с точки зрения понятности. У Доки есть эталон этого контрола. Нужно просто копипастнуть :)

image

@vitalybaev
Copy link
Contributor Author

Мне кажется так будет лучше всего с точки зрения понятности. У Доки есть эталон этого контрола. Нужно просто копипастнуть :)

Я тоже плюсую за трёх-секционный переключатель. Когда я открывал PR, в ходу были в основном однокнопочные контролы и не все ещё понимали, что их логика окончательно не приживётся и всё ещё будет сложна для понимания

@monochromer
Copy link
Member

Поменял принцип переключения тем.

Сделал переключатель из трёх кнопок, где выбранная активная тема обозначается через aria-pressed="true". Тут ещё нужно поменять положение самого переключателя, так как он находится внутри элемента списка меню, что, скорее всего, некорректно.

Для удобства смены цветов заведены токены, значения которых задаются в файлах light.css и dark.css. Эти файлы, как скрипт для переключения инлайнятся в html, чтобы не было мерцаний при загрузке страницы. Было бы неплохо назвать переменные для цветов тёмной темы в файле styles.css как цвета, а не как токены.

Copy link
Member

@pepelsbey pepelsbey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чуть поправил лого и цвета иконок — и стало совсем хорошо :) Спасибо всем! Мне кажется, что можно мёржить.

Я бы может сделал потом второй подход и отрефакторил принцип установки переменных: мне кажется, что класть вообще все токены в корень не совсем правильно. Плюс есть сложный микс глобальных цветов, светлых и тёмных вариаций и специфических цветов компонентов. Кажется можно лучше, но уже на следующем этапе. Согласны? Я попробую сформулировать ишью с идеей, как это улучшить.

@monochromer
Copy link
Member

monochromer commented Sep 4, 2024

Можно ещё вёрстку поправить:

нужно поменять положение самого переключателя, так как он находится внутри элемента списка меню, что, скорее всего, некорректно.

или тоже на следующей итерации

@pepelsbey
Copy link
Member

pepelsbey commented Sep 4, 2024

Можно ещё вёрстку поправить

У меня была шальная мысль убрать несчастное мобильное выпадающее меню, раз пункта всего два (скоро будет ещё третий) и прятать полезные вещи от людей как-то нехорошо. Так что можно оставить до тех пор.

@monochromer
Copy link
Member

monochromer commented Sep 4, 2024

скоро будет ещё третий

😃

Согласны?

👍

@pepelsbey pepelsbey merged commit d01e8b4 into web-standards-ru:main Sep 4, 2024
6 checks passed
pepelsbey added a commit that referenced this pull request Sep 4, 2024
* Прототип тёмной темы

* Правит мобильное меню в тёмной теме

* Правит очевидные ошибки стилей после обновления верстки

* Добавляет переключатель тёмной/светлой темы

* Прототип тёмной темы

* Правит мобильное меню в тёмной теме

* Правит очевидные ошибки стилей после обновления верстки

* Добавляет переключатель тёмной/светлой темы

* Правит цвет выбранного тега

* Merge remote-tracking branch 'upstream/master' into feature/162-dark-mode-prototype

# Conflicts:
#	src/includes/header.njk
#	src/scripts/index.js

* Синхронизирует ветку, обновляет названия переменных, правит ошибки верстки

* Меняет цвет посещенных ссылок в тёмной теме

* Обновляет svg иконки соцсетей

* Обновляет использование масок фотографий для темной темы

* Обновляет цвет буквицы в темной теме

* Обновляет стили таблиц в темной теме

* Обновляет Browserlist и версию Node.js

* Добавляет Yaml Lint (#152)

* Добавляет Yaml Lint

* Добавляет отступ

* Обновляет версии экшенов

---------

Co-authored-by: Pavel Mineev <pavel@mineev.me>
Co-authored-by: Vadim Makeev <hi@pepelsbey.dev>

* Переносит весь код скрпитов в html

* Делает весь скрипт отдельным файлом, но инлайнит его в HTML

* Удаляет иконки github'а

* Правит ошибки стиля в js-коде

* Правит стиль кавычек

* Удаляет лишнюю запятую

* Меняет принцип переключения тем

* Правит стили

* Правит цвета блоков с кодом в статье об OKLCH

* Удаляет пустой блок

* Правит опечатку в названии атрибута

* Правит вложенность элементов

* Добавляет игнорирование атрибутов `media` на элементах `meta` для html-валидатора

* Добавляет префикс для токенов

* Добавляет обводку лого

* Делает иконки контрастнее

---------

Co-authored-by: Vadim Makeev <hi@pepelsbey.dev>
Co-authored-by: Paul <paul@mineev.me>
Co-authored-by: Pavel Mineev <pavel@mineev.me>
Co-authored-by: monochromer <monochromer@mail.ru>
Co-authored-by: monochromer <monochromer@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants