feat(arts-page): add arts page and fix hero frame - #27
Conversation
| @@ -2,52 +2,61 @@ | |||
| { | |||
| "artId":"ghost", | |||
| "bgColor":"Bgc-$artGhost", | |||
There was a problem hiding this comment.
Тут было бы неплохо сделать рефакторинг. Пусть название css переменной с цветом фона будет формироваться по схеме: $art${artId}. Только id надо будет перевести из cebab-case в camelCase
There was a problem hiding this comment.
Привет. Небольшой вопрос:
Если я переведу id в camelCase, то мне нужно будет переименовывать все файлы в папке arts (например: robotHare.ejs) и переименовать все переменные цвета (например: --ml-artrobotHare: #........). Делать так?
Пока не исправлял.
There was a problem hiding this comment.
Существующий id не меняем. Переводим его только для получения названия CSS переменной. В шаблоне, вместо art.bgColor, будет что-то типа Bgc-$art${cebab2Camel(art.artId)}. CSS переменные с цветами тоже вроде должны быть уже с подходящими названиями. Если какие-то отдельные не будут подходить - поправь
|
|
||
| <% | ||
| const artsPageCSS = { | ||
| card:"W100p H46u Ov-h Bdrd12 Bgc-$core815 Bd3;s;$brand O0.5 O1_h sm_H50u md_H60u xxl_H-a -Ts", |
There was a problem hiding this comment.
Для прозрачности лучше % использовать: O50p
There was a problem hiding this comment.
И опять же, px только в отдельных случаях: Bdrd12 -> Bdrd3u
|
По стилю наведения карточек артов. Делаем вариант №5 из макета. При этом, backdrop-filter надо помутнее, чтобы текст кнопки хорошо читался |
|
В последнем коммите, при xxl, арты автоматически выстраиваются в три колонки и занимают столько места по высоте, сколько передаем в "height": "....." в arts.json При добавлении нового арта, галерея сама перестроится и расположит арты так, чтобы три колонки были примерно одинаковой высоты. |
|
|
||
|
|
||
|
|
||
| <template id="art-card"> |
There was a problem hiding this comment.
Зачем здесь возиться с template? Просто делаешь кастомный элемент для модалки, в модуле art-panel получаешь модалку со страницы через querySelector (до объявления класса), и добавляешь ее в поле инстанса. Там дальше с ней работаешь
| @@ -0,0 +1,66 @@ | |||
| export class ArtModal { | |||
There was a problem hiding this comment.
Переделываем на кастомный элемент, как писал ниже
| this.sandboxLink = clone.querySelector(".art-modal-sandbox a"); | ||
| this.shareBtn = clone.querySelector(".art-modal-share"); | ||
|
|
||
| this.overlay.addEventListener("click", (e) => { |
There was a problem hiding this comment.
закрытие должно быть и по нажатию Esc на клаве
| document.body.appendChild(clone); | ||
| } | ||
|
|
||
| copyArtLink() { |
There was a problem hiding this comment.
Вместо дублирования логики надо модалке передавать колбэки из art-panel
| this.sandboxLink.href = `http://play.mlut.style/?art=${artId}`; | ||
| } | ||
| const artClone = artElement.querySelector(".art").cloneNode(true); | ||
| this.contentContainer.textContent = ""; |
There was a problem hiding this comment.
Почему так очищается контент, а не через innerHTML?
| if (this.sandboxLink) { | ||
| this.sandboxLink.href = `http://play.mlut.style/?art=${artId}`; | ||
| } | ||
| const artClone = artElement.querySelector(".art").cloneNode(true); |
There was a problem hiding this comment.
Модалка клонированием не занимается - туда уже готовый к отображению контент передаем
| this.button.addEventListener('click', () => this.copyArtLink()) | ||
| this.button.addEventListener("click", () => this.copyArtLink()); | ||
| this.addEventListener("click", (e) => { | ||
| if (e.target.closest(".link-button, a")) return; |
There was a problem hiding this comment.
На a цепляться не стоит - лучше более специфичный селектор
There was a problem hiding this comment.
В новой схеме вообще нет смысла в отдельном шаблоне. Это ведь не универсальная модалка, а только для артов
There was a problem hiding this comment.
И сейчас стили модалки не упорядочены. Некоторые арты залезают под кнопки
Уже лучше, но стоит попробовать настоящий masonry сделать, если не сильно долго будет. Наверняка есть готовые vanilla js библиотеки |
|
Привет. По компоненту модального окна - вроде все исправил. Насчет библиотеки masonry: Нашел другую библиотеку, ее можно импортировать как модуль, но только через esm.sh (import Isotope from 'https://esm.sh/isotope-layout@3.0.6';), но работает как-то плохо. Когда заходишь на страницу артов, нужно ждать секунд 5-6, пока библиотека подгрузится. Решил не использовать ее. |
|
И еще. |
| this.container = this.querySelector('.modal-container'); | ||
| this.contentContainer = this.querySelector('.art-modal-content'); | ||
| this.closeBtn = this.querySelector('.art-modal-close'); | ||
| this.sandboxLink = this.querySelector('.art-modal-sandbox a'); |
There was a problem hiding this comment.
Уже писал, что не надо цепляться на a
| this.shareBtn = this.querySelector('.art-modal-share .btn'); | ||
|
|
||
| document.body.appendChild(clone); | ||
| if (this.overlay) { |
There was a problem hiding this comment.
Зачем эти проверки? Элементы обязательные и если кто-то не добавит их - пусть компонент явно упадет
| this.closeBtn = null; | ||
| this.sandboxLink = null; | ||
| this.shareBtn = null; | ||
| this._onShare = null; |
There was a problem hiding this comment.
Если уж делить на публичные и приватные свойства, то тогда все, что не вызывается из вне должно быть приватным. Тем более, внутренние элементы
| this.overlay.classList.add("O0", "Pne"); | ||
| if (this.contentContainer) this.contentContainer.textContent = ""; | ||
| close() { | ||
| if (!this.overlay) return; |
|
|
||
| connectedCallback() { | ||
| if (!modal) { | ||
| this.modal = document.querySelector('art-modal'); |
There was a problem hiding this comment.
Зачем, если модалку получаем даже до объявления класса
|
|
||
| const artDiv = this.querySelector('.art'); | ||
| if (!artDiv) return; | ||
| const artHTML = artDiv.outerHTML; |
| const artDiv = this.querySelector('.art'); | ||
| if (!artDiv) return; | ||
| const artHTML = artDiv.outerHTML; | ||
| const bgClass = this.getAttribute('data-bg-class'); |
There was a problem hiding this comment.
Это кастомный элемент, так что можно использовать кастомный атрибут, без data
| icon.classList.remove("D-n"); | ||
| text.classList.add("D-n"); | ||
| }, 2000); | ||
| const svg = button.querySelector('svg'); |
There was a problem hiding this comment.
На svg подвязываться не надо
| const svg = button.querySelector('svg'); | ||
| const span = button.querySelector('.button-text'); | ||
| if (svg) svg.classList.add('D-n'); | ||
| if (span) span.textContent = 'Copied!'; |
There was a problem hiding this comment.
Перед тем, как менять текст, сохраняем исходный и его же потом восстанавливаем
Привет. Страницу артов сделал grid сеткой, при hover арты немного увеличиваются. Изменение grid позиции у арта, при наведении, сделать можно, но как-то криво смотрится. При клике по арту, модальное окно открывается. Жду комментов)