Forwarded from <divelopers>
Стилизация тултипов
Два года назад я писал о проблеме с
Общая практика такова, что стоит избегать использования атрибута
Свойство
Это решает многие проблемы с тултипом
- Появляется при наведении и фокусе;
- Стилизуется как обычный псевдо-элемент;
- Задержка появления контролируется свойством
- Реагирует на изменение размера шрифта;
- Закрывается при нажатии
- Можно навести курсор на контент.
Но некоторые проблемы доступности не решаются. Вспомогательные технологии работают с
В качестве альтернативы предлагается новый атрибут
С точки зрения доступности рекомендации для стилизуемых тултипов выглядят так:
- Не переопределяют имя элемента;
- Встроенная роль
- Элемент ссылается на тултип через
Но есть и другой способ создания тултипов — сочетание уже существующих Popover API и Interest Invokers. Вместо атрибута можно использовать элемент, связать его с триггером через Anchor Positioning и добавить поведение через атрибуты:
В свежем 547 выпуске Веб-стандартов обсуждалась статья Патрика. Ведущие задались вопросом: зачем нам два разных способа создания тултипов, когда Popover и Interest Invokers решают задачу? Я вижу это как решения разных задач.
Простые задачи должны решаться просто. Атрибут
В более сложных сценариях, когда нужны тултипы с HTML или тонкий контроль, в дело вступают Interest Invokers. Но с ними нужно больше повозиться, чтобы сделать хорошо. Часть магии браузера не будет автоматически применяться.
Поэтому нужно вручную:
- Добавить отдельный элемент с
- Позиционировать тултип относительно триггера через Anchor Positioning;
- Добавить триггеру
- Стилизовать тултип.
Это немного больше работы, чем просто указать текст в атрибуте и стилизовать в CSS через псевдо-элемент. Поэтому оба подхода уместны на мой взгляд. Патрик пишет, что даже стили остаются, меняется только селектор.
Можно оставить обратную связь по предложению Edge.
#html #css #ui
Два года назад я писал о проблеме с
title и о принятом рабочей группой CSS предложении добавить псевдо-элемент ::tooltip от Лии Веру. Похоже, команда Edge займётся тултипами, о чём можно судить по статье Патрика Броссета.Дисклеймер: это обзор раннего предложения новых функций. Синтаксис может измениться в будущем или от функций могут отказаться
Общая практика такова, что стоит избегать использования атрибута
title из-за ряда проблем. Патрик описывает эти проблемы в статье. Текущее решение команды Edge — добавить опциональный «сброс», как это сделано в стилизуемом <select>:<style>
/*
Новый псевдо-элемент,
выбирает все тултипы
*/
::tooltip {
/* Включение стилизации */
appearance: base;
/* Стили тултипа */
}
</style>
<button title="Это тултип">
Наведи на меня
</button>
Свойство
appearance: base включает стилизацию. Системный тултип заменяется на псевдо-элемент с базовыми стилями. Он привязан к элементу с помощью Anchor Positioning и работает под капотом на основе Popover API и Interest Invokers.Это решает многие проблемы с тултипом
title:- Появляется при наведении и фокусе;
- Стилизуется как обычный псевдо-элемент;
- Задержка появления контролируется свойством
interest-delay;- Реагирует на изменение размера шрифта;
- Закрывается при нажатии
Esc;- Можно навести курсор на контент.
Но некоторые проблемы доступности не решаются. Вспомогательные технологии работают с
title непоследовательно. Кроме того, в сообществе есть стойкое убеждение, что title это плохо и его не стоит использовать.В качестве альтернативы предлагается новый атрибут
tooltip. Он работает как title, но без отображения системного тултипа, с определённой семантикой и связями и ограничен <button>, <a>, <input>, <textarea>, <select>:<style>
::tooltip {
/* Стили тултипа */
}
</style>
<button tooltip="Это тултип">
Наведи на меня
</button>
С точки зрения доступности рекомендации для стилизуемых тултипов выглядят так:
- Не переопределяют имя элемента;
- Встроенная роль
tooltip;- Элемент ссылается на тултип через
aria-describedby.Но есть и другой способ создания тултипов — сочетание уже существующих Popover API и Interest Invokers. Вместо атрибута можно использовать элемент, связать его с триггером через Anchor Positioning и добавить поведение через атрибуты:
<!--
interestfor связывает кнопку
с тултипом и отображает
при наведении и фокусе
-->
<button
interestfor="my-tooltip"
aria-describedby="my-tooltip"
>
Наведи на меня, у меня есть тултип с HTML
</TMLbutton>
<!--
popover делает элемент
всплывающим и позволяет
добавить любой контент
-->
<div
id="my-tooltip"
popover
role="tooltip"
>
Это тултип с <span>HTML</span>
</div>
В свежем 547 выпуске Веб-стандартов обсуждалась статья Патрика. Ведущие задались вопросом: зачем нам два разных способа создания тултипов, когда Popover и Interest Invokers решают задачу? Я вижу это как решения разных задач.
Простые задачи должны решаться просто. Атрибут
title/tooltip и псевдо-элемент ::tooltip как раз для простых задач, где нужно вывести короткий текст или подпись к элементу. Браузер сам сделает магию связывания и доступности.В более сложных сценариях, когда нужны тултипы с HTML или тонкий контроль, в дело вступают Interest Invokers. Но с ними нужно больше повозиться, чтобы сделать хорошо. Часть магии браузера не будет автоматически применяться.
Поэтому нужно вручную:
- Добавить отдельный элемент с
popover, id и role;- Позиционировать тултип относительно триггера через Anchor Positioning;
- Добавить триггеру
interestfor и aria-describedby;- Стилизовать тултип.
Это немного больше работы, чем просто указать текст в атрибуте и стилизовать в CSS через псевдо-элемент. Поэтому оба подхода уместны на мой взгляд. Патрик пишет, что даже стили остаются, меняется только селектор.
Можно оставить обратную связь по предложению Edge.
#html #css #ui
Patrick Brosset
Patrick - Opening the can of tooltips
Tooltips seem simple, until you look closer. The title attribute can't be styled and isn't accessible to everyone, while custom tooltips come with plenty of complexity. What would it take to build a native tooltip that's customizable, accessible, and easy…
❤7👎1🔥1
#ссылка дня
Недавно в нашем чате был жаркий спор на тему доступности. Мол, нормально делай — нормально будет и вообще морочить себе голову не надо, таких людей единицы.
Оно как бы и да и нет. Например, давайте представим себе на минуту средних дизайнеров сайтов и приложений.
Чаще всего они сидят в условиях, близких к идеальным. На стуле, перед большим монитором. И рисуют, не знаю, приложение для оплаты парковки. Он или она молоды и здоровы, мышка твёрдо лежит в руке. Идиллия.
Как по их представлению человек будет пользоваться приложением? Припарковался, устроился поудобнее и оплатил?
Да хрен там плавал. На бегу к офису, с документами в свободной руке. В этот момент здоровый человек превращается в инвалида, который в кнопку-то с трудом попадает. Телефон скользит, экран бликует. Это уж точно не идеальные условия.
И так с любым проектом. Думать надо.
Собственно, вот и ссылка на сегодня: https://a11ymyths.com/ru/
Мифы о доступности на разных языках. Всем читать, котаны.
#a11y #бородач
Недавно в нашем чате был жаркий спор на тему доступности. Мол, нормально делай — нормально будет и вообще морочить себе голову не надо, таких людей единицы.
Оно как бы и да и нет. Например, давайте представим себе на минуту средних дизайнеров сайтов и приложений.
Чаще всего они сидят в условиях, близких к идеальным. На стуле, перед большим монитором. И рисуют, не знаю, приложение для оплаты парковки. Он или она молоды и здоровы, мышка твёрдо лежит в руке. Идиллия.
Как по их представлению человек будет пользоваться приложением? Припарковался, устроился поудобнее и оплатил?
Да хрен там плавал. На бегу к офису, с документами в свободной руке. В этот момент здоровый человек превращается в инвалида, который в кнопку-то с трудом попадает. Телефон скользит, экран бликует. Это уж точно не идеальные условия.
И так с любым проектом. Думать надо.
Собственно, вот и ссылка на сегодня: https://a11ymyths.com/ru/
Мифы о доступности на разных языках. Всем читать, котаны.
#a11y #бородач
A11Ymyths
Мифы о веб-доступности
Небольшой проект, который опровергает распространённые мифы о веб-доступности.
❤5👍1
#инструмент дня
TanStack Charts 1.0 — Таннер Линсли довёл до стабильного релиза свою библиотеку графиков.
Вот это, конечно, эффективность у человека.
Анонс: https://tanstack.com/blog/tanstack-charts-1-0
Каталог: https://tanstack.com/charts/catalog
Charts устроен не как коллекция
По умолчанию используется SVG, но тяжёлый слой можно отдельно перевести на Canvas, оставив оси, подписи и интерактивность в SVG. Canvas, анимации и более тяжёлые части не попадают в bundle, пока они действительно не понадобились.
Линсли пришёл к этой архитектуре после D3, работы над Chart.js 2.0 и собственного react-charts. Последний тоже со временем упёрся в ограничения заранее заданных видов графиков. Поэтому Charts построен ближе к Grammar of Graphics: визуализация складывается из отдельных частей, а не выбирается целиком из списка готовых типов.
Линсли пишет, что идеи для API копил около десяти лет, архитектуру и поведение проектировал сам, а почти всю реализацию отдал coding agents. Для Charts уже есть отдельный гайд по AI authoring — как агенту выбирать примитивы, проверять результат и не выдумывать несуществующие API. Собственный Skill через TanStack Intent тоже запланирован, но пока не выпущен.
В результате Charts рассчитан даже не столько на графики, это весьма решённая проблема, сколько на все придури вашего дизайнера :)
#charts #tanstack
TanStack Charts 1.0 — Таннер Линсли довёл до стабильного релиза свою библиотеку графиков.
Вот это, конечно, эффективность у человека.
Анонс: https://tanstack.com/blog/tanstack-charts-1-0
Каталог: https://tanstack.com/charts/catalog
Charts устроен не как коллекция
<LineChart>, <BarChart> и <PieChart>. График собирается из меток (marks), шкал (scales), осей (axes) и взаимодействий (interactions): можно начать с линии, добавить поверх точки, снизу столбцы, свои аннотации или вообще собственную метку (mark) — без поиска нового компонента под каждую комбинацию.По умолчанию используется SVG, но тяжёлый слой можно отдельно перевести на Canvas, оставив оси, подписи и интерактивность в SVG. Canvas, анимации и более тяжёлые части не попадают в bundle, пока они действительно не понадобились.
Линсли пришёл к этой архитектуре после D3, работы над Chart.js 2.0 и собственного react-charts. Последний тоже со временем упёрся в ограничения заранее заданных видов графиков. Поэтому Charts построен ближе к Grammar of Graphics: визуализация складывается из отдельных частей, а не выбирается целиком из списка готовых типов.
Линсли пишет, что идеи для API копил около десяти лет, архитектуру и поведение проектировал сам, а почти всю реализацию отдал coding agents. Для Charts уже есть отдельный гайд по AI authoring — как агенту выбирать примитивы, проверять результат и не выдумывать несуществующие API. Собственный Skill через TanStack Intent тоже запланирован, но пока не выпущен.
В результате Charts рассчитан даже не столько на графики, это весьма решённая проблема, сколько на все придури вашего дизайнера :)
#charts #tanstack
❤10🤩4
Media is too big
VIEW IN TELEGRAM
#дичь дня
Лукас Бономи сделал GSS (GPU Style Sheets) — язык, на котором можно создавать полноценную 3D-графику, используя практически обычный CSS. И чем дальше читаешь документацию, тем больше вопросов к автору.
Объекты объявляются через
А дальше начинается прекрасное. Тут есть каскад, специфичность, `!important`, `:nth-child()`, `:hover` и даже `:has()`. Последний позволяет, например, менять внешний вид куба при наведении на соседнюю сферу. Да, теперь можно три часа выяснять, почему CSS не красит бублик.
Материалы тоже описываются стилями:
Причём это не какая-то хитрая обёртка над Three.js. GSS компилирует сцену в GPU-шейдеры GLSL или WGSL, а геометрия строится через SDF (функции расстояния) и raymarching. Никаких привычных полигональных мешей — видеокарта сама вычисляет поверхности объектов при отрисовке.
У проекта есть интерактивная песочница, npm-пакет, интеграция с Vite и даже расширение для VS Code. Всё это пока экспериментальное, но вполне работающее.
Не знаю, кому пришло в голову, что трёхмерной графике не хватает CSS-каскада и проблем со специфичностью, но теперь я хочу увидеть, как кто-нибудь будет отлаживать сцену с сотней объектов и
https://www.gss-lang.dev/
#3d #webgpu
Лукас Бономи сделал GSS (GPU Style Sheets) — язык, на котором можно создавать полноценную 3D-графику, используя практически обычный CSS. И чем дальше читаешь документацию, тем больше вопросов к автору.
Объекты объявляются через
@scene. Хотите куб? Пишите cube. Сферу? sphere. Трёхмерный бублик? torus. Можно назначить им классы и идентификаторы, расположить в пространстве и стилизовать привычными селекторами.
@scene {
sphere#ball;
}
#ball {
translate: 0 1 0;
color: #ff5a36;
material: glass(1.5, frosted 0.3);
animation: float 2s ease-in-out alternate;
}
@keyframes float {
from {
translate: 0 1 0;
}
to {
translate: 0 1.5 0;
}
}
А дальше начинается прекрасное. Тут есть каскад, специфичность, `!important`, `:nth-child()`, `:hover` и даже `:has()`. Последний позволяет, например, менять внешний вид куба при наведении на соседнюю сферу. Да, теперь можно три часа выяснять, почему CSS не красит бублик.
Материалы тоже описываются стилями:
metal(), glass(), jelly(), iridescent(). Есть градиенты, текстуры, освещение, тени, туман и фильтры. Анимации задаются через @keyframes, работают переходы и управление сценой через прокрутку страницы.Причём это не какая-то хитрая обёртка над Three.js. GSS компилирует сцену в GPU-шейдеры GLSL или WGSL, а геометрия строится через SDF (функции расстояния) и raymarching. Никаких привычных полигональных мешей — видеокарта сама вычисляет поверхности объектов при отрисовке.
У проекта есть интерактивная песочница, npm-пакет, интеграция с Vite и даже расширение для VS Code. Всё это пока экспериментальное, но вполне работающее.
Не знаю, кому пришло в голову, что трёхмерной графике не хватает CSS-каскада и проблем со специфичностью, но теперь я хочу увидеть, как кто-нибудь будет отлаживать сцену с сотней объектов и
!important.https://www.gss-lang.dev/
#3d #webgpu
❤7👍4🫡2🔥1
#статья дня
У vlt.io есть собственный коммерческий реестр npm-пакетов. Казалось бы, зачем кому-то альтернатива бесплатному npmjs.org? Но разработчики vlt решили покопаться в том, как npm передаёт метаданные пакетов, и нашли довольно много лишнего.
Например, полный документ с метаданными 759 версий Vite занимает 4,41 МБ даже после gzip. У npm есть сокращённый формат, но в нём не хватает некоторых полей, поэтому пакетным менеджерам иногда приходится запрашивать полную версию со всей накопившейся за годы историей.
В vlt переработали формат, убрали ненужные данные и сократили тот же документ Vite до 104 КБ. В среднем объём передаваемых метаданных уменьшился на 70%, а холодная установка зависимостей в их тестах ускорилась на 20–70%.
Причём менять пакетный менеджер не требуется: обычные npm, pnpm и Bun могут работать с альтернативным реестром. То есть значительную часть оптимизаций удалось сделать исключительно на стороне сервера.
Конечно, тесты проводились без lockfile, а в проектах с кешированием выигрыш будет скромнее. Но сама история показательна: спустя столько лет развития npm в его протоколе всё ещё остаются неэффективности, которые можно устранить, даже не меняя клиентский код.
https://www.vlt.io/blog/registry-metadata-70-percent-smaller
#npm #pnpm
У vlt.io есть собственный коммерческий реестр npm-пакетов. Казалось бы, зачем кому-то альтернатива бесплатному npmjs.org? Но разработчики vlt решили покопаться в том, как npm передаёт метаданные пакетов, и нашли довольно много лишнего.
Например, полный документ с метаданными 759 версий Vite занимает 4,41 МБ даже после gzip. У npm есть сокращённый формат, но в нём не хватает некоторых полей, поэтому пакетным менеджерам иногда приходится запрашивать полную версию со всей накопившейся за годы историей.
В vlt переработали формат, убрали ненужные данные и сократили тот же документ Vite до 104 КБ. В среднем объём передаваемых метаданных уменьшился на 70%, а холодная установка зависимостей в их тестах ускорилась на 20–70%.
Причём менять пакетный менеджер не требуется: обычные npm, pnpm и Bun могут работать с альтернативным реестром. То есть значительную часть оптимизаций удалось сделать исключительно на стороне сервера.
Конечно, тесты проводились без lockfile, а в проектах с кешированием выигрыш будет скромнее. Но сама история показательна: спустя столько лет развития npm в его протоколе всё ещё остаются неэффективности, которые можно устранить, даже не меняя клиентский код.
https://www.vlt.io/blog/registry-metadata-70-percent-smaller
#npm #pnpm
❤5👍5
#инструмент дня
Когда надоело, что ссылки из рабочего Slack открываются в личном профиле Chrome, а мемчики из Telegram — в рабочем.
Встречайте — ContextRoute! Создано мной с любовью для вас, котаны. Пока только для macOS.
Работает просто: выбираете, в каком браузере или профиле открывать ссылки из конкретных приложений.
Например, всё из Slack отправляется в рабочий профиль Chrome, из Telegram — в личный, а из остальных приложений — как принятно в macOS aka в последнее окно. Чуть меньше раздражения.
Альтернативы, конечно, существуют. Но мне они как-то не зашли.
Такие утилиты, во-первых, очень opinionated, а во-вторых, любят обрастать настройками. А я люблю минимум.
Вот, например, Yojam. У него только тёмная тема. И не просто тёмная, а чёрная! В сочетании с обилием, несомненно, прекрасных настроек пользоваться этим мне показалось невозможным. Skill issue.
Finicky — прекрасный инструмент, но зачем мне писать конфиг на TypeScript, чтобы открывать ссылки в браузере? Я вот не понял.
Поэтому и сделал свою утилиту. Пока она умеет только маршрутизировать ссылки по приложениям, из которых их открывают. Никаких правил по доменам, сложных условий и прочих радостей автоматизации. Всё это появится позже, но сейчас мне хотелось решить одну конкретную проблему.
Надеюсь, что смогу вовремя остановиться. Хотя, наверное, разработчик Yojam тоже так считал.
#swift #macos
Когда надоело, что ссылки из рабочего Slack открываются в личном профиле Chrome, а мемчики из Telegram — в рабочем.
Встречайте — ContextRoute! Создано мной с любовью для вас, котаны. Пока только для macOS.
Работает просто: выбираете, в каком браузере или профиле открывать ссылки из конкретных приложений.
Например, всё из Slack отправляется в рабочий профиль Chrome, из Telegram — в личный, а из остальных приложений — как принятно в macOS aka в последнее окно. Чуть меньше раздражения.
Альтернативы, конечно, существуют. Но мне они как-то не зашли.
Такие утилиты, во-первых, очень opinionated, а во-вторых, любят обрастать настройками. А я люблю минимум.
Вот, например, Yojam. У него только тёмная тема. И не просто тёмная, а чёрная! В сочетании с обилием, несомненно, прекрасных настроек пользоваться этим мне показалось невозможным. Skill issue.
Finicky — прекрасный инструмент, но зачем мне писать конфиг на TypeScript, чтобы открывать ссылки в браузере? Я вот не понял.
Поэтому и сделал свою утилиту. Пока она умеет только маршрутизировать ссылки по приложениям, из которых их открывают. Никаких правил по доменам, сложных условий и прочих радостей автоматизации. Всё это появится позже, но сейчас мне хотелось решить одну конкретную проблему.
Надеюсь, что смогу вовремя остановиться. Хотя, наверное, разработчик Yojam тоже так считал.
#swift #macos
❤14👍1👎1
This media is not supported in your browser
VIEW IN TELEGRAM
#такое дня
Сидим, разрабатываем дизайн систему, следуем WCAG, вычитываем эксплейнеры с https://open-ui.org/, следуем всем законам о доступности...
Но мы все лишь грязь под ногтями дизайнеров Apple, потому что спроектировать убегающий из под курсора компонент в их понимании абсолютно нормально.
Что дозволено Юпитеру, не дозволено быку, да?
#apple #ui
Сидим, разрабатываем дизайн систему, следуем WCAG, вычитываем эксплейнеры с https://open-ui.org/, следуем всем законам о доступности...
Но мы все лишь грязь под ногтями дизайнеров Apple, потому что спроектировать убегающий из под курсора компонент в их понимании абсолютно нормально.
Что дозволено Юпитеру, не дозволено быку, да?
#apple #ui
🤩10🤡8🫡2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍1👏1
#заметка дня
Когда Гарри Каспаров проиграл DeepBlue в шахматы, всем, в целом, стало понятно, что шахматисты не победят ботов.
Помешало ли это шахматам с переменным успехом быть самой популярной игрой? Нет. Помешало ли это шахматистам снова достигать уровня практически рок-звёзд? Тоже нет. Признание, процесс, обучение, скандалы — всё на месте.
Это я к чему. Ну, собственно, что меня зацепило — оно на иллюстрации. «Ни одна модель». Ссылка на X. Вызов принят!
Задача предельно ясна: закрыть картинку и видео-файл "скелетоном", все только через css, видео-элементу нельзя добавлять никакие атрибуты и доп. css-классы, разметку менять нельзя, можно только менять css root элемента, работать должно везде.
И, собственно, GPT 6.1 Sol Max прекрасно справился, по пути выдав весьма интересное решение: через filter.
Вот оно: https://codepen.io/editor/alinaki/pen/01a13fa3-609c-71ea-b6ae-8fc97433cae8
Лучше ли оно предложенного? Хороший вопрос! Я пока предложенное не видел, но оно, как минимум, использует сильно более новые возможности, которые гораздо менее доступны в браузерах.
Одну проблему своего решения я уже знаю — маска анимации заставляет фон просвечиваться. Но я уверен, что это можно решить, и проблемой стать не должно.
Но целая ночь против 10 минут. Никогда не говори никогда, короче.
#css #skeleton
Когда Гарри Каспаров проиграл DeepBlue в шахматы, всем, в целом, стало понятно, что шахматисты не победят ботов.
Помешало ли это шахматам с переменным успехом быть самой популярной игрой? Нет. Помешало ли это шахматистам снова достигать уровня практически рок-звёзд? Тоже нет. Признание, процесс, обучение, скандалы — всё на месте.
Это я к чему. Ну, собственно, что меня зацепило — оно на иллюстрации. «Ни одна модель». Ссылка на X. Вызов принят!
Задача предельно ясна: закрыть картинку и видео-файл "скелетоном", все только через css, видео-элементу нельзя добавлять никакие атрибуты и доп. css-классы, разметку менять нельзя, можно только менять css root элемента, работать должно везде.
И, собственно, GPT 6.1 Sol Max прекрасно справился, по пути выдав весьма интересное решение: через filter.
Вот оно: https://codepen.io/editor/alinaki/pen/01a13fa3-609c-71ea-b6ae-8fc97433cae8
Лучше ли оно предложенного? Хороший вопрос! Я пока предложенное не видел, но оно, как минимум, использует сильно более новые возможности, которые гораздо менее доступны в браузерах.
Одну проблему своего решения я уже знаю — маска анимации заставляет фон просвечиваться. Но я уверен, что это можно решить, и проблемой стать не должно.
Но целая ночь против 10 минут. Никогда не говори никогда, короче.
#css #skeleton
❤7👍2
#статья дня, даже две
Помните, я недавно рассказывал, почему появился Git и чем он отличается от SVN? Кажется, пора снова вспомнить о централизованных системах контроля версий.
Anthropic отказалась от Git и написала собственную VCS — Scion. Причём архитектурно она ближе к старому доброму SVN.
В мае компания вливала в свой монорепозиторий около 2500 изменений в день, а к сентябрю — уже больше 30 тысяч. История главной ветки приблизилась к 100 ГБ, CI выполнял 25 миллионов checkout в сутки. Git перестал справляться, несмотря на сотни зеркал и прочие оптимизации.
В Scion коммиты, слияния и ребейзы выполняются на сервере, а клиенты загружают файлы по необходимости. По данным Anthropic, это сократило потребление CPU и памяти инфраструктурой в 200 раз.
На разработку ушло пять месяцев и работа семи инженеров. Разумеется, при участии Claude, из-за которого вся эта проблема и возникла.
Но объёмы генерируемого агентами кода создают проблемы не только для Git, но и для платформ вокруг него.
Разработчик Йови де Крок представил экспериментальный проект gittifacts, в котором предлагает пересмотреть привычный процесс Pull Request. Вместо чтения каждого диффа человек согласовывает план и критерии приёмки, агент пишет код, а система собирает результаты тестов, покрытие, изменения API и зависимостей. На их основании изменение отправляется на ревью или автоматически сливается, если это разрешено настройками.
В отличие от Scion, gittifacts не заменяет Git, а пытается решить проблему человеческого ревью, которое тоже плохо масштабируется вместе с количеством сгенерированного кода.
В общем, за каких-то двадцать лет мы прошли путь от централизованного SVN к распределённому Git, а теперь снова выясняем, что централизованная архитектура может быть удобнее. И заодно думаем, зачем заставлять людей читать весь код, который генерируют машины.
Scion — статья Anthropic
gittifacts — статья автора
#git #svn #ai
Помните, я недавно рассказывал, почему появился Git и чем он отличается от SVN? Кажется, пора снова вспомнить о централизованных системах контроля версий.
Anthropic отказалась от Git и написала собственную VCS — Scion. Причём архитектурно она ближе к старому доброму SVN.
В мае компания вливала в свой монорепозиторий около 2500 изменений в день, а к сентябрю — уже больше 30 тысяч. История главной ветки приблизилась к 100 ГБ, CI выполнял 25 миллионов checkout в сутки. Git перестал справляться, несмотря на сотни зеркал и прочие оптимизации.
В Scion коммиты, слияния и ребейзы выполняются на сервере, а клиенты загружают файлы по необходимости. По данным Anthropic, это сократило потребление CPU и памяти инфраструктурой в 200 раз.
На разработку ушло пять месяцев и работа семи инженеров. Разумеется, при участии Claude, из-за которого вся эта проблема и возникла.
Но объёмы генерируемого агентами кода создают проблемы не только для Git, но и для платформ вокруг него.
Разработчик Йови де Крок представил экспериментальный проект gittifacts, в котором предлагает пересмотреть привычный процесс Pull Request. Вместо чтения каждого диффа человек согласовывает план и критерии приёмки, агент пишет код, а система собирает результаты тестов, покрытие, изменения API и зависимостей. На их основании изменение отправляется на ревью или автоматически сливается, если это разрешено настройками.
В отличие от Scion, gittifacts не заменяет Git, а пытается решить проблему человеческого ревью, которое тоже плохо масштабируется вместе с количеством сгенерированного кода.
В общем, за каких-то двадцать лет мы прошли путь от централизованного SVN к распределённому Git, а теперь снова выясняем, что централизованная архитектура может быть удобнее. И заодно думаем, зачем заставлять людей читать весь код, который генерируют машины.
Scion — статья Anthropic
gittifacts — статья автора
#git #svn #ai
❤5👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
#статья дня
В Base UI написали целую статью о том, как добавить поиск в выпадающее меню. Не о том, как фильтровать массив по строке — с этим как раз никаких проблем.
Допустим, есть меню с командами Rename, Duplicate и Delete. Добавляем поле поиска, начинаем печатать, стрелками выбираем нужный пункт, Enter выполняет действие.
А теперь вопрос: что это за компонент с точки зрения доступности?
Первым напрашивается
В Base UI в итоге выбрали
Но с семантикой разобрались — осталась клавиатура. Например,
Отдельная история с подменю: если оно открылось при наведении мыши, нельзя сразу переводить фокус на его поле поиска. Пользователь мог просто провести указателем мимо.
И всё это ещё нужно проверить с VoiceOver, NVDA и TalkBack. Кстати, по ходу работы команда обнаружила несколько багов доступности даже в обычном компоненте Menu.
Ну что же, давайте снова поговорим о том, что AI избавит нас от необходимости писать код. Допустим, агент за минуту напишет весь JSX, фильтрацию и обработчики клавиатуры. Но кто-то всё равно должен определить, какое поведение мы вообще хотим получить, почему именно такое и соответствует ли оно ожиданиям пользователей.
Особенно тех, кто взаимодействует с интерфейсом не так, как его разработчик.
Отдельный вопрос, конечно, нельзя ли просто заменить все меню на одно обращение в чат.
В общем, очень рекомендую почитать разбор Base UI. Там много интересных деталей, о которых легко не задуматься, даже если весь код пишешь собственноручно.
А ещё обратите внимание, у них видеоиллюстрации отдельные для тёмной и светлой темы 🫠
#ui #a11y #aria
В Base UI написали целую статью о том, как добавить поиск в выпадающее меню. Не о том, как фильтровать массив по строке — с этим как раз никаких проблем.
Допустим, есть меню с командами Rename, Duplicate и Delete. Добавляем поле поиска, начинаем печатать, стрелками выбираем нужный пункт, Enter выполняет действие.
А теперь вопрос: что это за компонент с точки зрения доступности?
Первым напрашивается
combobox. Но комбобокс предполагает выбор значения для поля ввода, а здесь мы выполняем команду. aria-autocomplete тоже не подходит: он предполагает определённое поведение списка подсказок, которого наше меню не обеспечивает.В Base UI в итоге выбрали
dialog, внутри которого находятся поле поиска и настоящее menu.Но с семантикой разобрались — осталась клавиатура. Например,
Home и End в текстовом поле перемещают курсор, а в меню — выделение. Стрелками нужно перемещаться между пунктами, сохраняя возможность продолжать печатать. Причём DOM-фокус остаётся в поле ввода, а активный пункт определяется через aria-activedescendant.Отдельная история с подменю: если оно открылось при наведении мыши, нельзя сразу переводить фокус на его поле поиска. Пользователь мог просто провести указателем мимо.
И всё это ещё нужно проверить с VoiceOver, NVDA и TalkBack. Кстати, по ходу работы команда обнаружила несколько багов доступности даже в обычном компоненте Menu.
Ну что же, давайте снова поговорим о том, что AI избавит нас от необходимости писать код. Допустим, агент за минуту напишет весь JSX, фильтрацию и обработчики клавиатуры. Но кто-то всё равно должен определить, какое поведение мы вообще хотим получить, почему именно такое и соответствует ли оно ожиданиям пользователей.
Особенно тех, кто взаимодействует с интерфейсом не так, как его разработчик.
Отдельный вопрос, конечно, нельзя ли просто заменить все меню на одно обращение в чат.
В общем, очень рекомендую почитать разбор Base UI. Там много интересных деталей, о которых легко не задуматься, даже если весь код пишешь собственноручно.
А ещё обратите внимание, у них видеоиллюстрации отдельные для тёмной и светлой темы 🫠
#ui #a11y #aria
1❤8
#заметка дня
Всего три месяца назад Microsoft выпустила TypeScript 7 на Go, который должен был решить проблемы с производительностью. А за последние недели появилось сразу несколько альтернативных реализаций компилятора. Только ленивый не переписал компилятор TypeScript на Rust или на что-то ещё.
Отчасти виноват сам переход на Go: новый компилятор стал нативным бинарником, а инструменты, использовавшие JavaScript API, теперь вынуждены общаться с ним через отдельный протокол. И ещё когда стало известно об этом — кругом сразу поднялся визг: «Почему не на Rust?!».
А теперь следите за руками:
• ts-rust — экспериментальный Rust-порт от команды Theo Browne. Проверяет типы в VS Code за 4,8 секунды против 9,6 у Go-версии.
• bun check — реализация от Bun, по их тестам в 3–6,4 раза быстрее Go-компилятора.
• tsc-ts — Vercel решила вернуть компилятор на TypeScript, но собирать его в нативный бинарник.
• tsrs — Rust-порт от Cloudflare и VoidZero, обещающий до 8 раз больше скорости и на 70% меньше потребления памяти.
Причём Cloudflare собирается объединить tsrs с проектом Theo Browne и развивать их как единую реализацию.
Сам Тео — персонаж офигеть какой неоднозначный. Его категоричность, бесконечные споры и провокации это нечто. А теперь его эксперимент с AI-портированием компилятора становится частью проекта Cloudflare.
У Cloudflare, впрочем, есть практический интерес: запуск TypeScript через WebAssembly внутри браузеров и Workers, в том числе для облачных IDE и AI-агентов.
Ещё недавно переписывание компилятора было многолетней инженерной задачей. Теперь портов столько, что разработчикам приходится договариваться, какие из них объединять.
Позиция Microsoft при этом, скорее, благодарная: какие-то оптимизации прекрасно бэкпортятся, и TypeScript 7.1 на Go уже стал в два раза быстрее.
#typescript #rust #cloudflare
Всего три месяца назад Microsoft выпустила TypeScript 7 на Go, который должен был решить проблемы с производительностью. А за последние недели появилось сразу несколько альтернативных реализаций компилятора. Только ленивый не переписал компилятор TypeScript на Rust или на что-то ещё.
Отчасти виноват сам переход на Go: новый компилятор стал нативным бинарником, а инструменты, использовавшие JavaScript API, теперь вынуждены общаться с ним через отдельный протокол. И ещё когда стало известно об этом — кругом сразу поднялся визг: «Почему не на Rust?!».
А теперь следите за руками:
• ts-rust — экспериментальный Rust-порт от команды Theo Browne. Проверяет типы в VS Code за 4,8 секунды против 9,6 у Go-версии.
• bun check — реализация от Bun, по их тестам в 3–6,4 раза быстрее Go-компилятора.
• tsc-ts — Vercel решила вернуть компилятор на TypeScript, но собирать его в нативный бинарник.
• tsrs — Rust-порт от Cloudflare и VoidZero, обещающий до 8 раз больше скорости и на 70% меньше потребления памяти.
Причём Cloudflare собирается объединить tsrs с проектом Theo Browne и развивать их как единую реализацию.
Сам Тео — персонаж офигеть какой неоднозначный. Его категоричность, бесконечные споры и провокации это нечто. А теперь его эксперимент с AI-портированием компилятора становится частью проекта Cloudflare.
У Cloudflare, впрочем, есть практический интерес: запуск TypeScript через WebAssembly внутри браузеров и Workers, в том числе для облачных IDE и AI-агентов.
Ещё недавно переписывание компилятора было многолетней инженерной задачей. Теперь портов столько, что разработчикам приходится договариваться, какие из них объединять.
Позиция Microsoft при этом, скорее, благодарная: какие-то оптимизации прекрасно бэкпортятся, и TypeScript 7.1 на Go уже стал в два раза быстрее.
#typescript #rust #cloudflare
🫡6❤3👏1
#такое дня
Вчера, 21 октября, был какой-то особенно весёлый день для тех, кто отвечает за продакшен. Да и вся неделя удалась.
— PHP2Shell — две критические уязвимости в самом PHP, позволяющие при определённых условиях получить RCE без авторизации. Патчи вышли вчера, сейчас бэкпортят на старые версии.
А о возможности такой проблемы знали с 2024 года как минимум.
— Node.js — сразу пачка исправлений: RCE в декодере Brotli, обходы проверки TLS-сертификатов, проблемы с DNS.
— LiteLLM — взломали аккаунты разработчиков и опубликовали заражённую версию 1.107.0 в PyPI и Docker Hub. Внутри — кража ключей и возможность удалённого выполнения кода.
— Plex2Shell — цепочка из четырёх уязвимостей Plex Media Server уже используется для установки майнеров и прокси.
— eMudhra — у восьми промежуточных центров сертификации оказались настолько слабые приватные ключи, что их можно восстановить из публичных. Mozilla пришлось срочно отзывать доверие к сертификатам.
Это было вообще слишком смешно, чтобы быть правдой, но как есть.
— Next.js — две критические RCE с оценкой 9.5, связанные с оптимизацией изображений и use cache. Исправления вышли ещё 14 октября.
— TiDB Cloud — подтвердили утечку клиентских и служебных данных после кражи учётных данных. Заявленные злоумышленниками 10,6 ТБ пока не подтверждены.
В общем, иногда npm audit fix — это наименьшая из ваших проблем.
Вчера, 21 октября, был какой-то особенно весёлый день для тех, кто отвечает за продакшен. Да и вся неделя удалась.
— PHP2Shell — две критические уязвимости в самом PHP, позволяющие при определённых условиях получить RCE без авторизации. Патчи вышли вчера, сейчас бэкпортят на старые версии.
А о возможности такой проблемы знали с 2024 года как минимум.
— Node.js — сразу пачка исправлений: RCE в декодере Brotli, обходы проверки TLS-сертификатов, проблемы с DNS.
— LiteLLM — взломали аккаунты разработчиков и опубликовали заражённую версию 1.107.0 в PyPI и Docker Hub. Внутри — кража ключей и возможность удалённого выполнения кода.
— Plex2Shell — цепочка из четырёх уязвимостей Plex Media Server уже используется для установки майнеров и прокси.
— eMudhra — у восьми промежуточных центров сертификации оказались настолько слабые приватные ключи, что их можно восстановить из публичных. Mozilla пришлось срочно отзывать доверие к сертификатам.
Это было вообще слишком смешно, чтобы быть правдой, но как есть.
— Next.js — две критические RCE с оценкой 9.5, связанные с оптимизацией изображений и use cache. Исправления вышли ещё 14 октября.
— TiDB Cloud — подтвердили утечку клиентских и служебных данных после кражи учётных данных. Заявленные злоумышленниками 10,6 ТБ пока не подтверждены.
В общем, иногда npm audit fix — это наименьшая из ваших проблем.
🔥7❤6🤩2🫡1
#событие дня
Тимлидство — это не только раздавать задачи, проводить 1:1 и следить за дедлайнами. Чем больше команда, тем чаще приходится разбираться в людях, бизнесе и собственных управленческих решениях.
VK проводит два бесплатных TeamLead Meetup — 24 октября в Москве и 28 октября в Петербурге.
В Москве обсудят переход от управления отдельными задачами к управлению системой, а в Петербурге — насколько глубоко тимлиду вообще стоит погружаться в бизнес и стратегию компании.
Кроме докладов и дискуссий будет практика на выбор:
— Личная встреча с тимлидом VK, на которой можно разобрать собственные управленческие проблемы.
— Мастер-класс по теории ограничений Голдратта: как отделять факты от интерпретаций и проверять причинно-следственные связи, прежде чем принимать решения.
— «Своя игра» с разбором управленческих ситуаций и обсуждением решений.
В общем, разговор скорее о том, как управлять командой, а не о том, как заставить Jira работать за тебя.
Участие бесплатное, нужна регистрация.
Тимлидство — это не только раздавать задачи, проводить 1:1 и следить за дедлайнами. Чем больше команда, тем чаще приходится разбираться в людях, бизнесе и собственных управленческих решениях.
VK проводит два бесплатных TeamLead Meetup — 24 октября в Москве и 28 октября в Петербурге.
В Москве обсудят переход от управления отдельными задачами к управлению системой, а в Петербурге — насколько глубоко тимлиду вообще стоит погружаться в бизнес и стратегию компании.
Кроме докладов и дискуссий будет практика на выбор:
— Личная встреча с тимлидом VK, на которой можно разобрать собственные управленческие проблемы.
— Мастер-класс по теории ограничений Голдратта: как отделять факты от интерпретаций и проверять причинно-следственные связи, прежде чем принимать решения.
— «Своя игра» с разбором управленческих ситуаций и обсуждением решений.
В общем, разговор скорее о том, как управлять командой, а не о том, как заставить Jira работать за тебя.
Участие бесплатное, нужна регистрация.
👍2👎2
This media is not supported in your browser
VIEW IN TELEGRAM
#ссылка дня
Мой любимый UI-компонент, пожалуй, вообще за всё время — bottom sheet. Та самая панель, которая выезжает снизу экрана, тянется пальцем и фиксируется на разной высоте. Особенно активно используется в картографических приложениях вроде Google Maps и Apple Maps.
И вот pure-web-bottom-sheet — любопытная реализация для веба, почти полностью построенная на CSS.
Вместо обработки перетаскивания через JavaScript используется обычный браузерный скролл.
Контейнер получает
Для вложенного скролла применяется CSS Scroll-driven Animations. Через
Всё упаковано в Web Component, есть обёртки для React и Vue, поддерживаются нативные
Ну и, конечно, не обошлось без Safari. Из-за бага WebKit пришлось добавлять невидимый горизонтальный overflow шириной в один пиксель, чтобы жесты прокрутки вообще нормально обрабатывались. Куда же без этого.
GitHub · Демо · Подробный технический разбор автора
#scroll #widget
Мой любимый UI-компонент, пожалуй, вообще за всё время — bottom sheet. Та самая панель, которая выезжает снизу экрана, тянется пальцем и фиксируется на разной высоте. Особенно активно используется в картографических приложениях вроде Google Maps и Apple Maps.
И вот pure-web-bottom-sheet — любопытная реализация для веба, почти полностью построенная на CSS.
Вместо обработки перетаскивания через JavaScript используется обычный браузерный скролл.
Контейнер получает
overflow-y: scroll и scroll-snap-type: y mandatory. Внутри создаётся невидимая область прокрутки, а точки остановки задаются элементами с scroll-snap-align и CSS-переменной --snap. В результате панель перемещается вместе с прокруткой, а браузер самостоятельно обрабатывает жесты, инерцию и фиксацию в ближайшей точке. Никаких вычислений координат пальца на каждом pointermove и анимаций через requestAnimationFrame.Для вложенного скролла применяется CSS Scroll-driven Animations. Через
scroll-timeline и animation-timeline высота панели привязывается к положению внешнего скролла, а содержимое может прокручиваться независимо. Правда, анимация height вызывает перерасчёт layout, поэтому предусмотрена экспериментальная оптимизация с transform, при которой JavaScript вычисляет необходимые смещения в начале прокрутки.Всё упаковано в Web Component, есть обёртки для React и Vue, поддерживаются нативные
<dialog>, Popover API и SSR.Ну и, конечно, не обошлось без Safari. Из-за бага WebKit пришлось добавлять невидимый горизонтальный overflow шириной в один пиксель, чтобы жесты прокрутки вообще нормально обрабатывались. Куда же без этого.
GitHub · Демо · Подробный технический разбор автора
#scroll #widget
❤17🔥3👎1
#молния дня
Срочно в номер! На странице 404 Apple Music находится функционирующий iPod первого поколения!
У меня всё.
Срочно в номер! На странице 404 Apple Music находится функционирующий iPod первого поколения!
У меня всё.
❤7🤩4🔥3
Друзья из Tbilisi JS проводят уже девятый митап! 🤟
А если считать спецвыпуски, то и все 14!
24 октября, уже завтра, в Тбилиси соберутся разработчики, дизайнеры и любители веб-технологий. А для тех, кто не в Грузии, будет трансляция на YouTube.
В программе пять докладов:
🟡 Алексей Красиков (Paper, «Веб-стандарты») — «Веб-сайт — это вам не продукт».
🟡 Александр Островский (TradingView) — «Код подешевел, решения — нет. Как мы строим дизайн-систему с помощью AI-агентов».
🟡 Денис Митрофанов (Lightspeed) — «Как привычки людей отражаются в поведении AI-ассистента».
🟡 Макар Главанарь (Solvery, Pulsar Digital) — «Фреймворки для ИИ-агентов: что они делают за свои токены».
⭐️ Специальный гость — Андрей Ситник из Злых Марсиан, автор PostCSS, Nano ID и других опенсорс-проектов. Расскажет об архитектуре приложений, которые не следят за пользователями.
📅 24 октября, суббота
📺 Трансляция на YouTube — с 14:00 мск
📍 Terminal, Абашидзе 34, Тбилиси
🌍 Доклады на русском языке
Вход бесплатный, но нужна регистрация.
А если считать спецвыпуски, то и все 14!
24 октября, уже завтра, в Тбилиси соберутся разработчики, дизайнеры и любители веб-технологий. А для тех, кто не в Грузии, будет трансляция на YouTube.
В программе пять докладов:
🟡 Алексей Красиков (Paper, «Веб-стандарты») — «Веб-сайт — это вам не продукт».
🟡 Александр Островский (TradingView) — «Код подешевел, решения — нет. Как мы строим дизайн-систему с помощью AI-агентов».
🟡 Денис Митрофанов (Lightspeed) — «Как привычки людей отражаются в поведении AI-ассистента».
🟡 Макар Главанарь (Solvery, Pulsar Digital) — «Фреймворки для ИИ-агентов: что они делают за свои токены».
⭐️ Специальный гость — Андрей Ситник из Злых Марсиан, автор PostCSS, Nano ID и других опенсорс-проектов. Расскажет об архитектуре приложений, которые не следят за пользователями.
📅 24 октября, суббота
📺 Трансляция на YouTube — с 14:00 мск
📍 Terminal, Абашидзе 34, Тбилиси
🌍 Доклады на русском языке
Вход бесплатный, но нужна регистрация.
❤4🔥4
Проект от подписчика!
Напоминаю, что я выкачу любую статью или проект от вас, не стесняйтесь писать.
Презентация? Выступили на митапе? Хотите поделиться интересной статьёй — добро пожаловать!
votby.ru
Привет! Меня зовут Виктор. На днях мы с командой запустили наш проект и я бы хотел поделиться его историей.
Когда я был студентом, то постоянно пытался придумывать идеи для новых приложений и сервисов. Их были сотни, но каждый раз возникал один и тот же вопрос: нужна ли эта идея кому-то ещё?
Проверить это до начала разработки было практически негде. Так появилась мысль о платформе, на которой можно рассказать о своей идее, показать её другим людям и заранее оценить интерес аудитории.
Много лет эта мысль осталась просто записью на бумаге. Но наступил 2026 год, отрасль IT начала резко сжиматься и на горизонте начало маячить моё сокращение. И тут я решил, что было бы неплохо обеспечить себе хотя бы какой-то запасной вариант.
Я рассказал об идее подписчикам своего канала и предложил вместе создать такую площадку. За один день собралась команда приблизительно из десяти человек. Почти никого из них я не знал лично — большинство просто читали канал. Кто-то пришёл за опытом, кого-то заинтересовала возможность получить часть в будущем бизнесе, но всех объединило желание создать настоящий продукт с нуля.
Мы поставили себе довольно смелую цель — запустить MVP за месяц. Несмотря на сложности с организацией процессов большой команды, мы уложились в срок.
После запуска мнения разделились. Нас много поддерживали, но хватало и критики: кому-то не понравился дизайн, кто-то ожидал от команды из десяти человек гораздо большего. Для нас это тоже стало частью проверки идеи — только теперь проверяли уже не концепцию, а реальный продукт.
Сегодня "Вот бы!" продолжает развиваться. К нам регулярно приходят новые люди, а вокруг платформы постепенно формируется сообщество преданных пользователей. Они делятся своими идеями, предлагают улучшения и помогают определять, куда двигаться дальше.
Наверное, самым ценным результатом для меня стал даже не сам запуск, а поддержка всех тех людей, которые поверили в его идею и помогли превратить его в действительно крутой продукт!
Напоминаю, что я выкачу любую статью или проект от вас, не стесняйтесь писать.
Презентация? Выступили на митапе? Хотите поделиться интересной статьёй — добро пожаловать!
votby.ru
Привет! Меня зовут Виктор. На днях мы с командой запустили наш проект и я бы хотел поделиться его историей.
Когда я был студентом, то постоянно пытался придумывать идеи для новых приложений и сервисов. Их были сотни, но каждый раз возникал один и тот же вопрос: нужна ли эта идея кому-то ещё?
Проверить это до начала разработки было практически негде. Так появилась мысль о платформе, на которой можно рассказать о своей идее, показать её другим людям и заранее оценить интерес аудитории.
Много лет эта мысль осталась просто записью на бумаге. Но наступил 2026 год, отрасль IT начала резко сжиматься и на горизонте начало маячить моё сокращение. И тут я решил, что было бы неплохо обеспечить себе хотя бы какой-то запасной вариант.
Я рассказал об идее подписчикам своего канала и предложил вместе создать такую площадку. За один день собралась команда приблизительно из десяти человек. Почти никого из них я не знал лично — большинство просто читали канал. Кто-то пришёл за опытом, кого-то заинтересовала возможность получить часть в будущем бизнесе, но всех объединило желание создать настоящий продукт с нуля.
Мы поставили себе довольно смелую цель — запустить MVP за месяц. Несмотря на сложности с организацией процессов большой команды, мы уложились в срок.
После запуска мнения разделились. Нас много поддерживали, но хватало и критики: кому-то не понравился дизайн, кто-то ожидал от команды из десяти человек гораздо большего. Для нас это тоже стало частью проверки идеи — только теперь проверяли уже не концепцию, а реальный продукт.
Сегодня "Вот бы!" продолжает развиваться. К нам регулярно приходят новые люди, а вокруг платформы постепенно формируется сообщество преданных пользователей. Они делятся своими идеями, предлагают улучшения и помогают определять, куда двигаться дальше.
Наверное, самым ценным результатом для меня стал даже не сам запуск, а поддержка всех тех людей, которые поверили в его идею и помогли превратить его в действительно крутой продукт!
👍10🔥3👎2❤1