Нужно ли писать 5 media queries, чтобы шрифт выглядел нормально на разной ширине экрана?
На деле хватает одной строки CSS:
Как это работает:
Сразу задаются три значения: минимальный размер, предпочтительный (плавающий) размер и максимальный размер.
Браузер выбирает подходящее среднее значение, но при этом никогда не уходит ниже минимума и выше максимума.
Например:
*
*
*
Результат:
Текст масштабируется в зависимости от ширины экрана. Без breakpoints, без media queries. Просто плавная адаптивная типографика.
Где использовать:
* Заголовки, которым нужно масштабирование
* Основной текст в hero-секциях
* Любой текст, который должен подстраиваться под размер экрана
Поддержка в браузерах: около 95%
Одна функция.
И адаптивная типографика готова.
@WebDev_Plus
На деле хватает одной строки CSS:
font-size: clamp(1rem, 2vw + 0.5rem, 2rem);
Как это работает:
Сразу задаются три значения: минимальный размер, предпочтительный (плавающий) размер и максимальный размер.
Браузер выбирает подходящее среднее значение, но при этом никогда не уходит ниже минимума и выше максимума.
Например:
*
1rem = минимум (16px). Текст никогда не станет меньше 16px.*
2vw + 0.5rem = предпочтительный размер. Плавно масштабируется вместе с шириной вьюпорта.*
2rem = максимум (32px). Текст не станет больше 32px даже на огромных мониторах.Результат:
Текст масштабируется в зависимости от ширины экрана. Без breakpoints, без media queries. Просто плавная адаптивная типографика.
Где использовать:
* Заголовки, которым нужно масштабирование
* Основной текст в hero-секциях
* Любой текст, который должен подстраиваться под размер экрана
Поддержка в браузерах: около 95%
Одна функция.
И адаптивная типографика готова.
@WebDev_Plus
Laravel Tip
Хотите знать, как отработала ваша запланированная задача в полночь?
Тут вам повезло: вывод scheduled tasks можно без проблем сохранить или отправить по email
@WebDev_Plus
Хотите знать, как отработала ваша запланированная задача в полночь?
Тут вам повезло: вывод scheduled tasks можно без проблем сохранить или отправить по email
@WebDev_Plus
Создавать Promise с внешними 🧹
Больше не нужно заворачивать логику внутрь конструктора.
Подробнее тут
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers
@WebDev_Plus
resolve и reject стало чище Promise.withResolvers() возвращает объект вида { promise, resolve, reject }Больше не нужно заворачивать логику внутрь конструктора.
Подробнее тут
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Теперь, когда
Настраиваете фигуру, потом просто копируете сгенерированный код.
@WebDev_Plus
shape() поддерживается всеми основными браузерами, напоминаю: вы можете использовать этот онлайн‑генератор, чтобы создавать любые полигоны с закруглёнными углами: https://css-generators.com/polygon-shape/Настраиваете фигуру, потом просто копируете сгенерированный код.
@WebDev_Plus
❤1
Замечали, как вся страница сдвигается, когда вы открываете модальное окно?
Это не баг — это просто отсутствующее CSS-свойство.
Вот что происходит:
Вы открываете модалку.
Затем обычно отключаете прокрутку, добавляя
Прокрутка отключается, и скроллбар исчезает.
И тут — бум — страница сдвигается, например, на 15px влево, потому что контент расширяется и занимает место, где раньше был скроллбар.
В результате получается layout shift.
Чтобы это исправить, можно использовать
Что делает это свойство:
Оно резервирует место под скроллбар, даже когда он не отображается. Когда открывается модалка и скроллбар исчезает, пространство под него остаётся зарезервированным, поэтому никакого сдвига layout не происходит.
Как это использовать👇
Теперь, когда вы открываете модальное окно:
* скроллбар исчезает
* зарезервированное пространство остаётся
* layout остаётся стабильным
Важное замечание (!)
В MacOS вы можете не заметить этот эффект, пока явно не включите настройку “всегда показывать скроллбар”. По крайней мере, я заметил разницу только после этого.
Предполагаю, что для пользователей Windows/Linux это происходит чаще, чем для пользователей MacOS, но я не проверял, как это работает там.
Поддержка браузерами: ~93%
Одна строка CSS — и ваши модальные окна больше не выглядят сломанными.
@WebDev_Plus
Это не баг — это просто отсутствующее CSS-свойство.
Вот что происходит:
Вы открываете модалку.
Затем обычно отключаете прокрутку, добавляя
overflow: hidden к тегу body.Прокрутка отключается, и скроллбар исчезает.
И тут — бум — страница сдвигается, например, на 15px влево, потому что контент расширяется и занимает место, где раньше был скроллбар.
В результате получается layout shift.
Чтобы это исправить, можно использовать
scrollbar-gutter: stable.Что делает это свойство:
Оно резервирует место под скроллбар, даже когда он не отображается. Когда открывается модалка и скроллбар исчезает, пространство под него остаётся зарезервированным, поэтому никакого сдвига layout не происходит.
Как это использовать
body {
overflow-y: scroll;
scrollbar-gutter: stable;
}Теперь, когда вы открываете модальное окно:
* скроллбар исчезает
* зарезервированное пространство остаётся
* layout остаётся стабильным
Важное замечание (!)
В MacOS вы можете не заметить этот эффект, пока явно не включите настройку “всегда показывать скроллбар”. По крайней мере, я заметил разницу только после этого.
Предполагаю, что для пользователей Windows/Linux это происходит чаще, чем для пользователей MacOS, но я не проверял, как это работает там.
Поддержка браузерами: ~93%
Одна строка CSS — и ваши модальные окна больше не выглядят сломанными.
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Одно CSS-свойство только что избавило от необходимости писать JavaScript для каждого FAQ-аккордеона, который вы когда-либо делали.
Серьёзно.
Это свойство —
Годами в CSS нельзя было анимировать переход от
Браузер просто не мог вычислить переход между числовым значением и ключевым словом.
Поэтому разработчики писали JavaScript, измеряли
Теперь это можно сделать одной строкой:
Что оно делает
Сообщает браузеру, что ему разрешено интерполировать между числовыми значениями и ключевыми словами вроде
Как это работает
Добавьте это свойство к элементу (часто к
Контент будет плавно раскрываться от
И всё. Без JavaScript.
Небольшое замечание про аккордеоны
Да, я знаю, что accordion-компоненты имеют довольно спорную репутацию в кругах UX и accessibility.
Но это отличный пример, чтобы показать, как работает
Поддержка браузерами
Пока поддержка не идеальная — около 70%.
- Chrome 129+
- Edge 129+
- Opera 115+✅
Firefox и Safari — пока нет.
Отдельная благодарность команде Chrome за внедрение этой возможности. Она решает проблему, которая существовала с момента появления CSS transitions.
@WebDev_Plus
Серьёзно.
Это свойство —
interpolate-size: allow-keywords.Годами в CSS нельзя было анимировать переход от
height: 0 к height: auto.Браузер просто не мог вычислить переход между числовым значением и ключевым словом.
Поэтому разработчики писали JavaScript, измеряли
scrollHeight, использовали requestAnimationFrame и подобные вещи.Теперь это можно сделать одной строкой:
interpolate-size: allow-keywords;
Что оно делает
Сообщает браузеру, что ему разрешено интерполировать между числовыми значениями и ключевыми словами вроде
auto, min-content, max-content и т.д.Как это работает
Добавьте это свойство к элементу (часто к
:root). Затем используйте обычные CSS-transition для height, и браузер сам обработает остальное.Контент будет плавно раскрываться от
0 до своей фактической высоты.И всё. Без JavaScript.
:root {
interpolate-size: allow-keywords;
}
.content {
height: 0;
overflow: clip;
transition: height 0.3s ease;
}
.content.is-open {
height: auto;
}Небольшое замечание про аккордеоны
Да, я знаю, что accordion-компоненты имеют довольно спорную репутацию в кругах UX и accessibility.
Но это отличный пример, чтобы показать, как работает
interpolate-size.Поддержка браузерами
Пока поддержка не идеальная — около 70%.
- Chrome 129+
- Edge 129+
- Opera 115+
Firefox и Safari — пока нет.
Отдельная благодарность команде Chrome за внедрение этой возможности. Она решает проблему, которая существовала с момента появления CSS transitions.
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤2
Node всегда был про I/O: стримы, буферы, сокеты, файлы. Но есть один пробел, который меня раздражал годами: нельзя виртуализировать файловую систему.
Нельзя импортировать модуль, который существует только в памяти. Нельзя собрать ассеты в Single Executable без патчинга половины стандартной библиотеки.
Теперь это меняется :
Аносируют две вещи:
node:vfs — виртуальная файловая система, которая появляется в core Node.js (PR #61478, ~14 000 строк в 66 файлах)
Вот в чём проблема. Каждый раз, когда нужно:
- собрать приложение в Single Executable
- запускать тесты без обращения к диску
- заизолировать файловый доступ арендатора (tenant)
- загружать сгенерированный ИИ код во время выполнения
нужен один и тот же примитив: виртуальная файловая система, которая интегрируется и с node:fs, и с резолвером модулей. Никто этого не делал.
Экосистема предлагала приближённые решения: memfs, unionfs, mock-fs. У всех одна и та же проблема: они патчат fs, но не резолвер модулей.
Код с вызовом
Два режима:
Mount mode: VFS активна только под заданным префиксом пути. Чистая изоляция.
Overlay mode: VFS проверяется первой для всех путей, затем происходит fallback на реальную файловую систему. Можно переопределить несколько конфигов и оставить остальное без изменений. Идеально для тестирования.
Почему это должно быть в core? Потому что userland-решения всегда компромисс:
- 960+ строк дублированной логики резолвинга модулей
- патчинг приватных API вроде
- глобальный патчинг fs, который ломается, если код заранее сохранил ссылки
- нативные модули не могут загружаться из памяти
- невозможно корректно очистить кэш модулей извне
Скажу честно, как это появилось. PR на 16 000 строк обычно занимает месяцы. Этот был сделан за рождественские праздники 2025 года, потому автор делал его с помощью Claude Code.
Он отдал ИИ рутину: все варианты методов fs, покрытие тестами и документацию. Сам сосредоточился на архитектуре, дизайне API и построчном ревью.
Когда Мальте Убль, CTO Vercel увидел PR, команда Vercel независимо вынесла тот же API в userland как node-vfs-polyfill.
Когда две команды независимо реализуют одно и то же — значит, дизайн получился удачным.
https://github.com/vercel-labs/node-vfs-polyfill
SqliteProvider: персистентная VFS на базе node:sqlite. Файлы сохраняются между перезапусками.
RealFSProvider: изолированный доступ к реальной файловой системе с встроенной защитой от path traversal. Больше не нужны хрупкие проверки через
@WebDev_Plus
Нельзя импортировать модуль, который существует только в памяти. Нельзя собрать ассеты в Single Executable без патчинга половины стандартной библиотеки.
Теперь это меняется :
Аносируют две вещи:
node:vfs — виртуальная файловая система, которая появляется в core Node.js (PR #61478, ~14 000 строк в 66 файлах)
@platformatic/vfs — userland-пакет, который можно использовать уже сейчас на Node.js 22+Вот в чём проблема. Каждый раз, когда нужно:
- собрать приложение в Single Executable
- запускать тесты без обращения к диску
- заизолировать файловый доступ арендатора (tenant)
- загружать сгенерированный ИИ код во время выполнения
нужен один и тот же примитив: виртуальная файловая система, которая интегрируется и с node:fs, и с резолвером модулей. Никто этого не делал.
Экосистема предлагала приближённые решения: memfs, unionfs, mock-fs. У всех одна и та же проблема: они патчат fs, но не резолвер модулей.
Код с вызовом
import('./config.json') полностью их обходит.Два режима:
Mount mode: VFS активна только под заданным префиксом пути. Чистая изоляция.
Overlay mode: VFS проверяется первой для всех путей, затем происходит fallback на реальную файловую систему. Можно переопределить несколько конфигов и оставить остальное без изменений. Идеально для тестирования.
Почему это должно быть в core? Потому что userland-решения всегда компромисс:
- 960+ строк дублированной логики резолвинга модулей
- патчинг приватных API вроде
Module._resolveFilename- глобальный патчинг fs, который ломается, если код заранее сохранил ссылки
- нативные модули не могут загружаться из памяти
- невозможно корректно очистить кэш модулей извне
Скажу честно, как это появилось. PR на 16 000 строк обычно занимает месяцы. Этот был сделан за рождественские праздники 2025 года, потому автор делал его с помощью Claude Code.
Он отдал ИИ рутину: все варианты методов fs, покрытие тестами и документацию. Сам сосредоточился на архитектуре, дизайне API и построчном ревью.
Когда Мальте Убль, CTO Vercel увидел PR, команда Vercel независимо вынесла тот же API в userland как node-vfs-polyfill.
Когда две команды независимо реализуют одно и то же — значит, дизайн получился удачным.
https://github.com/vercel-labs/node-vfs-polyfill
@platformatic/vfs поставляется с дополнительными провайдерами, которых нет в core:SqliteProvider: персистентная VFS на базе node:sqlite. Файлы сохраняются между перезапусками.
RealFSProvider: изолированный доступ к реальной файловой системе с встроенной защитой от path traversal. Больше не нужны хрупкие проверки через
path.resolve().@WebDev_Plus
✍2
This media is not supported in your browser
VIEW IN TELEGRAM
Создавай красивые карты для своего веб-сайта или приложения.
Бесплатно, без настройки и одной командой:
→ http://github.com/AnmolSaini16/mapcn
@WebDev_Plus
Бесплатно, без настройки и одной командой:
→ http://github.com/AnmolSaini16/mapcn
@WebDev_Plus
❤2
Ускорьте рендеринг с помощью
Это CSS-свойство пропускает рендеринг контента вне экрана до тех пор, пока он не понадобится, давая серьёзный прирост производительности на длинных страницах.
⋅ Хорошо сочетается с
⋅ Ленивый рендеринг практически «из коробки» (zero-effort)
Подробнее👇
https://developer.mozilla.org/en-US/docs/Web/CSS/content-visibility
@WebDev_Plus
content-visibility: auto Это CSS-свойство пропускает рендеринг контента вне экрана до тех пор, пока он не понадобится, давая серьёзный прирост производительности на длинных страницах.
⋅ Хорошо сочетается с
contain-intrinsic-size⋅ Ленивый рендеринг практически «из коробки» (zero-effort)
Подробнее
https://developer.mozilla.org/en-US/docs/Web/CSS/content-visibility
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
Фильтрация по геолокации — частое требование:
- «найти поблизости»
- «в радиусе X км»
- «отсортировать по расстоянию»
Eloquent scope помогает избежать дублирования Haversine-запросов.
Можно вынести это в Trait, чтобы использовать в нескольких моделях.
Или даже оформить как Package для использования в разных проектах.
@WebDev_Plus
- «найти поблизости»
- «в радиусе X км»
- «отсортировать по расстоянию»
Eloquent scope помогает избежать дублирования Haversine-запросов.
Можно вынести это в Trait, чтобы использовать в нескольких моделях.
Или даже оформить как Package для использования в разных проектах.
@WebDev_Plus
❤1
Скоро можно будет попрощаться с Date() в JavaScript.
Temporal API уже находится на стадии Stage 4 и поддерживается в Chrome, Edge и Firefox. Поддержка — около 65% браузеров!
Новый способ работы с датами и временем.
С большим количеством утилит и улучшений:
@WebDev_Plus
Temporal API уже находится на стадии Stage 4 и поддерживается в Chrome, Edge и Firefox. Поддержка — около 65% браузеров!
Новый способ работы с датами и временем.
С большим количеством утилит и улучшений:
@WebDev_Plus
❤🔥6
push(), pop(), shift() и unshift() в JavaScript 👇
Это базовые методы массива, используемые для добавления или удаления элементов в начале или в конце массива.
Важные моменты:
▪️ push() → добавляет элементы в конец массива
▪️ pop() → удаляет последний элемент
▪️ shift() → удаляет первый элемент
▪️ unshift() → добавляет элементы в начало массива
Помните, что все эти методы изменяют исходный массив (они мутабельные).
@WebDev_Plus
Это базовые методы массива, используемые для добавления или удаления элементов в начале или в конце массива.
Важные моменты:
Помните, что все эти методы изменяют исходный массив (они мутабельные).
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Laravel tip
Знал ли ты, что
Больше никаких пропущенных дней в графиках.
@WebDev_Plus
Знал ли ты, что
CarbonPeriod может генерировать все даты в заданном диапазоне?Больше никаких пропущенных дней в графиках.
@WebDev_Plus
❤2
В Next.js 16.2 ошибки браузера теперь напрямую прокидываются в терминал во время разработки
Больше не нужно переключаться в консоль браузера, чтобы дебажить client-side ошибки.
Особенно полезно для AI-агентов, которые не могут открыть DevTools и посмотреть ошибки в браузере.
@WebDev_Plus
Больше не нужно переключаться в консоль браузера, чтобы дебажить client-side ошибки.
Особенно полезно для AI-агентов, которые не могут открыть DevTools и посмотреть ошибки в браузере.
@WebDev_Plus
На случай, если ты не знал: React концептуально не изобрёл RSC, SSR или Hydration.
SSR — это по сути Express:
RSC — это Pug:
Hydration — это jQuery:
Отсюда и следствия: в SSR нет
@WebDev_Plus
SSR — это по сути Express:
app.get('/', (req, res) => {
res.render('index', { name: 'John' })
})RSC — это Pug:
if name == "Bob"
button(class="btn") Hello Bob
else
button(class="btn") My name is #{name}
Hydration — это jQuery:
$('.btn').click(...)Отсюда и следствия: в SSR нет
window, в RSC нельзя навесить onClick, а проблемы с hydration были ещё в jQuery (например, опечатка в .btn), просто тогда это называлось не так модно.@WebDev_Plus
Точно измеряйте производительность своего кода
Узнайте больше👇
https://developer.mozilla.org/en-US/docs/Web/API/Performance/mark
@WebDev_Plus
performance.mark() и performance.measure() позволяют вам инструментировать JavaScript, используя высокоточные тайминги.Узнайте больше
https://developer.mozilla.org/en-US/docs/Web/API/Performance/mark
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Свойство
(требует дополнительной настройки для
Полное демо👇
https://github.com/SidKH/gist-of-next-demos/blob/cursor/view-transition-transition-types-demo/README.md
@WebDev_Plus
transitionType для ссылок (Links) в Next.js 16.2(требует дополнительной настройки для
<ViewTransitions />)<ViewTransitions> всё ещё является экспериментальной возможностью в Next.js и не рекомендуется для продакшенаПолное демо
https://github.com/SidKH/gist-of-next-demos/blob/cursor/view-transition-transition-types-demo/README.md
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🔥1