Дарова!
Я тут решил бота сделать с возможностью оплаты подписки (расскажу о нем как закончу). И когда-то у меня была такая тема и платежи работали через провайдера Юкасса. Решил обновить договор и после долгих переписок (по 1 сообщению в день) они мне создали магазин, только говорят с карты платежи не можете принимать, а другими методами можете.
Видимо онидолбоебы малограмотные и не знают что Telegram Payment API работает только с картами.
👉 Отсюда вопрос, если вдруг кто подключал другие провайдеры, поделитесь опытом, буду рад.
А пока я искал другие провайдеры, наткнулся на @donate - бот, который тебе по подписочной модели может организовать подписку людей на приватные группы или каналы. Это не мой кейс (т.к. для бота нельзя), но прикол в другом. Он может организовывать списание денег как за подписку нативно в телеге.
В Telegram Payment API нет подписок, поэтому ты должен просить юзера например раз в месяц опять купить товар (твою подписку). Как бы рабочий воркераунд, но чуток некрасиво. А этот бот может. И стало интересно.
Я полез узнавать, понял, что у него провайдер Smart Glocal (да, именно GloCal, кек). А у них в API есть параметр recurrent, отвечающий за то, что можно после первой оплаты получить токен по которому можно раз в период списывать деньги. Но нюанс в том, что когда работаешь через Telegram Payment API, ты не работаешь с API провайдера и телега все делает сама, и возвращает тебе только определенный набор данных. Есть варик прокинуть какие то кастомные данные в поле provider_data при отправке запроса на оплату, в надежде, что по токену
Кароч интересная тема. Если апрувнут регистрацию на Smart Glocal, попробую докопаться.
Я тут решил бота сделать с возможностью оплаты подписки (расскажу о нем как закончу). И когда-то у меня была такая тема и платежи работали через провайдера Юкасса. Решил обновить договор и после долгих переписок (по 1 сообщению в день) они мне создали магазин, только говорят с карты платежи не можете принимать, а другими методами можете.
Видимо они
👉 Отсюда вопрос, если вдруг кто подключал другие провайдеры, поделитесь опытом, буду рад.
А пока я искал другие провайдеры, наткнулся на @donate - бот, который тебе по подписочной модели может организовать подписку людей на приватные группы или каналы. Это не мой кейс (т.к. для бота нельзя), но прикол в другом. Он может организовывать списание денег как за подписку нативно в телеге.
В Telegram Payment API нет подписок, поэтому ты должен просить юзера например раз в месяц опять купить товар (твою подписку). Как бы рабочий воркераунд, но чуток некрасиво. А этот бот может. И стало интересно.
Я полез узнавать, понял, что у него провайдер Smart Glocal (да, именно GloCal, кек). А у них в API есть параметр recurrent, отвечающий за то, что можно после первой оплаты получить токен по которому можно раз в период списывать деньги. Но нюанс в том, что когда работаешь через Telegram Payment API, ты не работаешь с API провайдера и телега все делает сама, и возвращает тебе только определенный набор данных. Есть варик прокинуть какие то кастомные данные в поле provider_data при отправке запроса на оплату, в надежде, что по токену
provider_success_token, который вернется после успешной оплаты, через API провайдера сможешь найти токен для подписки. Но нигде ничего не описано. Кароч интересная тема. Если апрувнут регистрацию на Smart Glocal, попробую докопаться.
Smart-Glocal
Smart Glocal
Smart payment solutions for glocal businesses
👍7
Всех с Наступающим. По традиции напомню, если у кого недобор по добрым делам в этом году, исправить это можно в пару кликов.
Например донат в
▫️Ночлежку https://homeless.ru/
▫️Фонд "Подари жизнь"https://podari-zhizn.ru/ru
▫️Фонд "Старость в радость" https://starikam.org/
▫️Дом с маяком https://mayak.help/
Всем добра в новом году ✌️
Например донат в
▫️Ночлежку https://homeless.ru/
▫️Фонд "Подари жизнь"https://podari-zhizn.ru/ru
▫️Фонд "Старость в радость" https://starikam.org/
▫️Дом с маяком https://mayak.help/
Всем добра в новом году ✌️
homeless.ru
Ночлежка
Старейшая благотворительная организация, помогающая бездомным людям.
❤6🎄1
This media is not supported in your browser
VIEW IN TELEGRAM
Когда тебе нужно сделать гоночные санки Доминика Туретта, но у тебя есть всего пол часа.
Отдельное спасибо желтому тазу за антураж
Отдельное спасибо желтому тазу за антураж
😁9🔥7👍3🏆1
Нашел кайфовый видос по возможностям Cura в плане модификации моделей: разделение, пересечение и тп. Вообще много че можно нарулить оказывается. Но если нужно по координатам, то не выйдет, придется в CADe этим заниматься.
https://www.youtube.com/watch?v=VNtReFFBedU&ab_channel=SliceAgain%2F%2FTesibius
https://www.youtube.com/watch?v=VNtReFFBedU&ab_channel=SliceAgain%2F%2FTesibius
YouTube
Как Разрезать и Изменить модели в CURA?
PS появился плагин BananaSplit для резки моделей, в ролике с обзором плагинов подробнее
https://youtu.be/eogV1POKiCQ
Небольшая инструкция по редактированию моделей в Ultimaker Cura.
Моделирование для 3д печати лучше проводить в трёхмерных редакторах, однако…
https://youtu.be/eogV1POKiCQ
Небольшая инструкция по редактированию моделей в Ultimaker Cura.
Моделирование для 3д печати лучше проводить в трёхмерных редакторах, однако…
🔥6
Привет.
Решил тут восстановить сайт на вордпресе, но теперь запустить его на другом домене. Сайт в докере (MYSQL + Wordpress + Nginx). Косяк в том, что оказывается, url сайта прописывается в базе данных как настройка и просто поднять контейнеры и радоваться жизни не получится, нужно сперва залезть проапдейтить значения.
С докером знаком только в каких то базовых вещах и подключиться через консоль к бд в контейнере нахрапом не получилось. Но в итоге оказалось не так сложно (чатгпт помог).
Сначала узнаем ip контейнера с бд
Коннектимся c паролем
Переключаемся на нужную базу
Апдейтим
С вами были 5 minutes craft, хорошего дня ☺️
Решил тут восстановить сайт на вордпресе, но теперь запустить его на другом домене. Сайт в докере (MYSQL + Wordpress + Nginx). Косяк в том, что оказывается, url сайта прописывается в базе данных как настройка и просто поднять контейнеры и радоваться жизни не получится, нужно сперва залезть проапдейтить значения.
С докером знаком только в каких то базовых вещах и подключиться через консоль к бд в контейнере нахрапом не получилось. Но в итоге оказалось не так сложно (чатгпт помог).
Сначала узнаем ip контейнера с бд
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_idКоннектимся c паролем
mysql -h 173.15.0.2 -P 3306 --protocol=tcp -u username -pПереключаемся на нужную базу
USE mywordpress
Апдейтим
UPDATE wp_options SET option_value = replace(option_value, 'oldurl.com', 'newurl.com') WHERE option_name = 'home' OR option_name = 'siteurl';UPDATE wp_posts SET guid = replace(guid, 'oldurl.com','newurl.com');UPDATE wp_posts SET post_content = replace(post_content, 'oldurl.com', 'newurl.com'); UPDATE wp_postmeta SET meta_value = replace(meta_value,'oldurl.com','newurl.com');С вами были 5 minutes craft, хорошего дня ☺️
👍8
Привет. Недавно офигел от наглости webhost1.ru
Давай сам теперь звони нам.
На проводе небось девушка сидит, ты ей пароль свой говоришь, она там кому то перезванивает и тебя пускают в личный кабинет)
Давай сам теперь звони нам.
На проводе небось девушка сидит, ты ей пароль свой говоришь, она там кому то перезванивает и тебя пускают в личный кабинет)
😁8👏4🤯1🤮1
Доброй ночи.
В связи с тем, что приватный openvpn не работает уже и на домашнем интернете, нужно искать альтернативы.
Наткнулся на статейку на хабре про Openconnect и доки на linuxbabe. Потратил вечер, настроил, работает 👍
Из требований - придется оформить домен (можно на том же webhost1) и сгенерить ssl сертификат, ну и тачку в облаке иметь (или дома изворачиваться с DDNS)
В связи с тем, что приватный openvpn не работает уже и на домашнем интернете, нужно искать альтернативы.
Наткнулся на статейку на хабре про Openconnect и доки на linuxbabe. Потратил вечер, настроил, работает 👍
Из требований - придется оформить домен (можно на том же webhost1) и сгенерить ssl сертификат, ну и тачку в облаке иметь (или дома изворачиваться с DDNS)
Хабр
OpenConnect: недетектируемый VPN, который вам понравится
Тут недавно проскочила новость, что со следущего месяца Роскомнадзор запрещает писать про VPN и технологии обходов блокировок . Я лично на запреты Роскомнадзора клал <вырезано цензурой> , но...
👍6❤1
Привет!
Тыщу лет назад написал заметки, как я кастомизировал Fender Stratocaster, но чет так и не поделился.
Исправляюсь https://jem-space.ru/custom-fender/
Вообще, кайфую при работе с деревом. Если б еще не на коленке/балконе/общем гараже это делать, а в мастерской, ваще топ был бы.
Тыщу лет назад написал заметки, как я кастомизировал Fender Stratocaster, но чет так и не поделился.
Исправляюсь https://jem-space.ru/custom-fender/
Вообще, кайфую при работе с деревом. Если б еще не на коленке/балконе/общем гараже это делать, а в мастерской, ваще топ был бы.
❤🔥8👍4🔥1🕊1
Sleepless tech | Евгений J
Доброй ночи. В связи с тем, что приватный openvpn не работает уже и на домашнем интернете, нужно искать альтернативы. Наткнулся на статейку на хабре про Openconnect и доки на linuxbabe. Потратил вечер, настроил, работает 👍 Из требований - придется оформить…
Кстати нашёл интересную статейку о том, что всё тлен как вообще происходит детектирование способов обхода. Панацеи по факту нет ☺️
Хабр
Интернет-цензура и обход блокировок: не время расслабляться
Статья опубликована под лицензией Creative Commons BY-NC-SA . Disclaimer: практически всё, описанное в статье, не является чем-то принципиально новым или инновационным - оно давно известно и...
👍4🔥1💩1💯1
Привет.
Сижу на литкоде с задачей про слияние нескольких связных отсортированных списков и не могу вдуплить.
Если использовать
Хотя
По идее не важно откуда ты будешь брать элемент из массива - с начала (shift) или с конца (pop), его все равно нужно будет мержить с другим и сравнивать каждый элемент связного списка.
Кароч, парадокс. Если кому интересно, можете поиграться https://leetcode.com/problems/merge-k-sorted-lists
Сижу на литкоде с задачей про слияние нескольких связных отсортированных списков и не могу вдуплить.
Если использовать
pop() при получении элемента массива со списками, то перфоманс жёстко падает, в сравнении если использовать shift().Хотя
shift вроде как затратнее должен быть, так как весь массив двигается на место 1го элемента, в то время когда pop просто укорачивает длину на 1.По идее не важно откуда ты будешь брать элемент из массива - с начала (shift) или с конца (pop), его все равно нужно будет мержить с другим и сравнивать каждый элемент связного списка.
Кароч, парадокс. Если кому интересно, можете поиграться https://leetcode.com/problems/merge-k-sorted-lists
🤔5👍2🤯2
Привет.
Сегодня настраивал cross-origin запросы с одного приложения на другое. Настроил cors и csp параметры, но авторизационная кука никак не хотела устанавливаться в браузере.
Все потому что для axios нужно явно прописать, что cross-origin куки можно сетать.
Скелетор вернется позже с еще одним неприятным фактом)
Сегодня настраивал cross-origin запросы с одного приложения на другое. Настроил cors и csp параметры, но авторизационная кука никак не хотела устанавливаться в браузере.
Все потому что для axios нужно явно прописать, что cross-origin куки можно сетать.
axios.defaults.withCredentials = true;Скелетор вернется позже с еще одним неприятным фактом)
👍7😁2💯1
Привет.
Пару дней потратил на то, чтобы настроить проксирование на openconnect сервер, чтобы он не занимал 443 порт.
Т. к. openconnect прикидывается обычным https сайтом, то слушает он соответственно 443 порт. А выделять целый vps под один openconnect жалко, хочется еще и хостить свои сайты🤩
Казалось бы, просто заводишь nginx, который будет слушать 443 порт и проксировать запросы на openconnect и остальные твои сайты. Но нет.
Оказалось, важно иметь версию nginx с модулем ssl_preread (благо можно собрать в докере), настроить правильную работу с сертификатами и правильно проксировать данные, что в итоге оказалось невозможно при помощи одного лишь nginx🤩
(думаю основная причина в необходимости proxy v2 для этого)
В итоге решилось все добавлением haproxy, который уже раскидывает запросы на openconnect и на nginx (этот уже сам разруливает дальше).
Инструкцию оставлю тут.
Было сложно. Особенно когда в сетях не особо шаришь. Кстати, пока копался узнал, что можно подцепиться из одного docker-compose файла к volume и network других контейнеров через параметр
Пару дней потратил на то, чтобы настроить проксирование на openconnect сервер, чтобы он не занимал 443 порт.
Т. к. openconnect прикидывается обычным https сайтом, то слушает он соответственно 443 порт. А выделять целый vps под один openconnect жалко, хочется еще и хостить свои сайты
Казалось бы, просто заводишь nginx, который будет слушать 443 порт и проксировать запросы на openconnect и остальные твои сайты. Но нет.
Оказалось, важно иметь версию nginx с модулем ssl_preread (благо можно собрать в докере), настроить правильную работу с сертификатами и правильно проксировать данные, что в итоге оказалось невозможно при помощи одного лишь nginx
(думаю основная причина в необходимости proxy v2 для этого)
В итоге решилось все добавлением haproxy, который уже раскидывает запросы на openconnect и на nginx (этот уже сам разруливает дальше).
Инструкцию оставлю тут.
Было сложно. Особенно когда в сетях не особо шаришь. Кстати, пока копался узнал, что можно подцепиться из одного docker-compose файла к volume и network других контейнеров через параметр
external:true - кайф.Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
nginx-ssl-preread/Dockerfile at master · mkoppanen/nginx-ssl-preread
Nginx docker image with SSL preread module. Contribute to mkoppanen/nginx-ssl-preread development by creating an account on GitHub.
❤4👏4
Привет!
Вчера, внезапно, мой облачный сервак забил память на 100%. Со мной такое уже не первый раз - раньше виновником был менеджер nodeJs процессов
Причем, удалять файл syslog.1, вроде как, не советуют, потому что есть вероятность что-то поломать в системе.
Поэтому копипастнул команду из интернета truncate -s 0 /var/log/syslog и все починилось.
Вообще, вот такой стек команд наковырял, который поможет быстро найти большие файлы и папки
Вчера, внезапно, мой облачный сервак забил память на 100%. Со мной такое уже не первый раз - раньше виновником был менеджер nodeJs процессов
pm2, который написал логов на пару гигабайт. Но я его усмирил плагином pm2-logrotate. В этот раз виновником были обычные системные логи syslog, которые, вроде как, периодически архивируются (не шарю чесн говоря), но все равно хранятся на диске (в этот раз файлы занимали около 17 гигов).Причем, удалять файл syslog.1, вроде как, не советуют, потому что есть вероятность что-то поломать в системе.
Поэтому копипастнул команду из интернета truncate -s 0 /var/log/syslog и все починилось.
Вообще, вот такой стек команд наковырял, который поможет быстро найти большие файлы и папки
df -h - посмотреть какие диски забитыfind / -size +300M -ls - покажет все файлы больше указанного значения (300 Мб)du -ch --max-depth=4 /var/log покажет папки с их размером указанному путиls -lSh /var/log - список файлов с размером🔥4👍3😁1
Привет!
В общем, у меня теперь есть ПРОДУКТ! 🚀
Я, как человек, который очень чутко слышит запросы общества, постарался объединить 2 популярные вещи: эзотерику и котиков (популярных в 2010-х).
*голосом продажника*
Вы только посмотрите на этого бота Астро-Кота. Бот Астро-Кот присылает вам гороскоп (чаще с инфой, что ваш ждёт понос, финансовые неудачи, смерть, но вы теперь информированны, а значит готовы), раскладывает для вас Оракула, позволяет отправить запрос ко Вселенной (можно попросить перенести понос на завтра например, причем голосовухой!) и еще всякие мелочи!
Конечно, часть функционала доступна по подписке (мы же в светлом капиталистическом будущем живем), но она стоит меньше стакана лавандового рафа.
В общем, постарался запилить бота с удобным флоу по общению (не уверен что вышло), какой то адекватной архитектурой (не чистая, но трехслойная, она попроще), а так же реализовал процесс оплаты через ЮКассу (если б они еще TelegramBotAPI работали, было бы вообще норм).
Погрузился в Telegraf.js - штука мощная, предлагает подход конечных автоматов (как раз то, что нужно при общении бота с юзером). Плюс позволяет подключать разные middleware, в итоге можешь прокидывать телеграмовский аптейт по всяким слоям.
Еще попробовал Dokku для удобного деплоя. Как обычно, потратил пару вечеров, чтоб понять, что я делаю не так, но в итоге все работает.
На днях, надеюсь, допишу статью, там расскажу с чем заморочился и че для себя вынес)
Кароч залетайте, смотрите, потыкайте, попробуйте положить)
UPD: есть демо подписка на 7 дней!!!
В общем, у меня теперь есть ПРОДУКТ! 🚀
Я, как человек, который очень чутко слышит запросы общества, постарался объединить 2 популярные вещи: эзотерику и котиков (популярных в 2010-х).
*голосом продажника*
Вы только посмотрите на этого бота Астро-Кота. Бот Астро-Кот присылает вам гороскоп (чаще с инфой, что ваш ждёт понос, финансовые неудачи, смерть, но вы теперь информированны, а значит готовы), раскладывает для вас Оракула, позволяет отправить запрос ко Вселенной (можно попросить перенести понос на завтра например, причем голосовухой!) и еще всякие мелочи!
Конечно, часть функционала доступна по подписке (мы же в светлом капиталистическом будущем живем), но она стоит меньше стакана лавандового рафа.
В общем, постарался запилить бота с удобным флоу по общению (не уверен что вышло), какой то адекватной архитектурой (не чистая, но трехслойная, она попроще), а так же реализовал процесс оплаты через ЮКассу (если б они еще TelegramBotAPI работали, было бы вообще норм).
Погрузился в Telegraf.js - штука мощная, предлагает подход конечных автоматов (как раз то, что нужно при общении бота с юзером). Плюс позволяет подключать разные middleware, в итоге можешь прокидывать телеграмовский аптейт по всяким слоям.
Еще попробовал Dokku для удобного деплоя. Как обычно, потратил пару вечеров, чтоб понять, что я делаю не так, но в итоге все работает.
На днях, надеюсь, допишу статью, там расскажу с чем заморочился и че для себя вынес)
Кароч залетайте, смотрите, потыкайте, попробуйте положить)
UPD: есть демо подписка на 7 дней!!!
Telegram
АстроКот | Астролог с лапками
Я - Кот Астролог 🐈⬛ Я расскажу вам о вашем прошлом, настоящем и будущем.
🔥18🥴1
Привет!
Запилил статейку о том, какие задачи перед собой ставил при разработке АстроКота и какие велосипеды напилил в процессе. Кому интересно, прошу по ссылке.
https://jem-space.ru/tg-bot-with-telegraf/
Запилил статейку о том, какие задачи перед собой ставил при разработке АстроКота и какие велосипеды напилил в процессе. Кому интересно, прошу по ссылке.
https://jem-space.ru/tg-bot-with-telegraf/
Jem Space
Разработка Telegram бота на NodeJs + Telegraf.js
Разработка ботов тема не новая и затертая до дыр. В сети полно туториалов как сделать простого Телеграм-бота или не простого, и каждый спикер предлагает какой-то свой подход. Ведь, действительно, один и тот же функционал можно реализовать по-разному. И, к…
👍4🔥2👏2
Forwarded from UX Live 🔥
This media is not supported in your browser
VIEW IN TELEGRAM
Когда посмотрел уже все на порнхабе и придумал собственный жанр
❤5😁5🔥2❤🔥1🤡1
Дарова!
Щас развоняюсь как дед.
Github ввел двухфакторную аутентификацию. И теперь как дед пытаюсь разобраться с какими то ссаными аутентификаторами. Либо ставь какую то херню на телефон или комп либо расширение для хрома. Отправить мне код на почту они блядь не могут, а смс естественно в Россию не доходят.
Ну это ладно, но то что он предлагают это мать его платные решения типа 1Password. Плати 2 доллара в месяц чтобы логиниться на сайт. Алооо, вы там ох*ели? Либо приложение от Копрософта с битой ссылкой на установку.
Ладно, мож я че не так понял. Пойду разбираться)
Если кто уже понял как сделать чтоб нормально было, черканите деду)
UPD: деду помогли - google authenticator норм тема, ставится как расширение, все бесплатно. Че бы его сразу было не предложить вместо 1Password и копрософт хз)
Щас развоняюсь как дед.
Github ввел двухфакторную аутентификацию. И теперь как дед пытаюсь разобраться с какими то ссаными аутентификаторами. Либо ставь какую то херню на телефон или комп либо расширение для хрома. Отправить мне код на почту они блядь не могут, а смс естественно в Россию не доходят.
Ну это ладно, но то что он предлагают это мать его платные решения типа 1Password. Плати 2 доллара в месяц чтобы логиниться на сайт. Алооо, вы там ох*ели? Либо приложение от Копрософта с битой ссылкой на установку.
Ладно, мож я че не так понял. Пойду разбираться)
Если кто уже понял как сделать чтоб нормально было, черканите деду)
UPD: деду помогли - google authenticator норм тема, ставится как расширение, все бесплатно. Че бы его сразу было не предложить вместо 1Password и копрософт хз)
🙈4👏1🤝1
Ладно, вот вам задачка.
Есть 2стула пакета в node_modules, которые использую третий как зависимость. Но в зависимостях он разной версии.
Один пакет нормально резолвит его. Второй же пытается найти его в общих node_modules, вместо своих внутренних (хотя во внутренних он есть).
Какие есть варианты, чтобы донести до второго пакета, что нужно резолвить его из внутренних модулей?
Если поставить этот пакет в общие модули, сломаются импорты первого пакета 🤯
Пробовал
Надеюсь щас набегут боты в коменты и все мне расскажут)
Есть 2
Один пакет нормально резолвит его. Второй же пытается найти его в общих node_modules, вместо своих внутренних (хотя во внутренних он есть).
Какие есть варианты, чтобы донести до второго пакета, что нужно резолвить его из внутренних модулей?
Если поставить этот пакет в общие модули, сломаются импорты первого пакета 🤯
Пробовал
resolutions в package.json - не помогло. Пока рабочее решения - поправить руками импорты и накатывать патч на postinstall через patch-package.Надеюсь щас набегут боты в коменты и все мне расскажут)
Forwarded from Даниэль Ленц - блог
This media is not supported in your browser
VIEW IN TELEGRAM
Как побороть сдвиг сайта из-за появление скрола
Недавно увидел потрясающий CSS хак как компенсировать сдвиг сайта, когда у вас появляется скролл на странице. Вся верстка будто прыгает, появлется так называемый CLS – content layout shift. Нехорошо. Глаз раздражает и приводит к мискликам (смотри комментарии к посту).
А хак до жути простой:
100vw – ширина всей страницы с учетом скролбара
100% – ширина страницы без учета скролбара
Вычитаем и получаем заветные 15px, когда скролл есть и 0px, когда его нет. А дальше добавляем куда вам нужно – будь это padding, margin, top, left или еще чего. Просто и гениально.
А пост пишу, потому что удалось сразу проверить в проде как оно работает. Весь дифф до и после компенсации видно на видео.
Не забывайте про мелочи (а тем более про CLS) и тогда сайтом будет действительно приятно пользоваться.
@dlents
Недавно увидел потрясающий CSS хак как компенсировать сдвиг сайта, когда у вас появляется скролл на странице. Вся верстка будто прыгает, появлется так называемый CLS – content layout shift. Нехорошо. Глаз раздражает и приводит к мискликам (смотри комментарии к посту).
А хак до жути простой:
padding-left: calc(100vw - 100%); // 15px
100vw – ширина всей страницы с учетом скролбара
100% – ширина страницы без учета скролбара
Вычитаем и получаем заветные 15px, когда скролл есть и 0px, когда его нет. А дальше добавляем куда вам нужно – будь это padding, margin, top, left или еще чего. Просто и гениально.
А пост пишу, потому что удалось сразу проверить в проде как оно работает. Весь дифф до и после компенсации видно на видео.
Не забывайте про мелочи (а тем более про CLS) и тогда сайтом будет действительно приятно пользоваться.
@dlents
🔥6⚡2👍2