This media is not supported in your browser
VIEW IN TELEGRAM
Это вообще спокойно делается на CSS
- используй маску по бордеру, слои + overflow: hidden или другие трюки.
- градиент анимировать не надо, просто крути слой с градиентом 1:1🤙
@WebDev_Plus
- используй маску по бордеру, слои + overflow: hidden или другие трюки.
- градиент анимировать не надо, просто крути слой с градиентом 1:1
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
Css трюк для «блестящей» рамки
- берем псевдоэлемент
- позиционируем его и задаем inset box-shadow
- маскируем под углом через linear-gradient
бонус: используем corner-shape: squircle и крутим рамку при движении курсора
https://codepen.io/jh3y/pen/WbwyGBb
@WebDev_Plus
- берем псевдоэлемент
- позиционируем его и задаем inset box-shadow
- маскируем под углом через linear-gradient
бонус: используем corner-shape: squircle и крутим рамку при движении курсора
https://codepen.io/jh3y/pen/WbwyGBb
@WebDev_Plus
❤6
Intl.ListFormat это удобный способ собрать список в строку с учетом локали, без самописных костылей.
По сути, он сам правильно ставит запятые, союзы и форматирует список в зависимости от языка. Удобнее, чем писать if users.length === 2 ... else ... и поддерживать всё вручную.
@WebDev_Plus
onst getMessage = (users) => {
const formatter = new Intl.ListFormat("en-US", {
style: "long",
// long (по умолчанию), short, narrow
type: "conjunction"
// conjunction (and), disjunction (or), unit
});
return `Hello ${formatter.format(users)}!`;
};
// Автоматически подстраивает грамматику
console.log(getMessage(["Alice"]));
// → "Hello Alice!"
console.log(getMessage(["Alice", "Bob"]));
// → "Hello Alice and Bob!"
console.log(getMessage(["Alice", "Bob", "Charlie"]));
// → "Hello Alice, Bob, and Charlie!"По сути, он сам правильно ставит запятые, союзы и форматирует список в зависимости от языка. Удобнее, чем писать if users.length === 2 ... else ... и поддерживать всё вручную.
@WebDev_Plus
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Мигель сделал расширение для Visual Studio Code
Оно называется Better SVG и делает работу с SVG удобнее.
Постоянный предпросмотр и оптимизация кода в один клик, не выходя из редактора.
@WebDev_Plus
Оно называется Better SVG и делает работу с SVG удобнее.
Постоянный предпросмотр и оптимизация кода в один клик, не выходя из редактора.
@WebDev_Plus
🔥1
В следующей версии ArkType любой Standard Schema будет валидным определением.
Миграция с Zod станет куда проще
@WebDev_Plus
Миграция с Zod станет куда проще
@WebDev_Plus
🔥3
Свежая партия апдейтов по TypeScript 7. Новый нативный порт уже подъехал, и выглядит очень бодро.
Что умеет:
• проверяет типы в любом проекте
• поддерживает флаги --build и --incremental
• уже завезли полноценные фичи для редакторов
• и при этом работает примерно в 10 раз быстрее
Короче, можно пробовать прямо сейчас — версия уже в состоянии «юзабельно и приятно».
@WebDev_Plus
Что умеет:
• проверяет типы в любом проекте
• поддерживает флаги --build и --incremental
• уже завезли полноценные фичи для редакторов
• и при этом работает примерно в 10 раз быстрее
Короче, можно пробовать прямо сейчас — версия уже в состоянии «юзабельно и приятно».
@WebDev_Plus
Microsoft News
Progress on TypeScript 7 – December 2025
Earlier this year, the TypeScript team announced that we’ve been porting the compiler and language service to native code to take advantage of better raw performance, memory usage, and parallelism. This effort (codenamed “Project Corsa”, and soon “TypeScript…
👍4❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Нравится этот шрифт?
Это Glass TTY VT220. Ссылка на шрифт - https://github.com/svofski/glasstty
А финальный ретро-вайб дает Cool Retro Term с эффектом послесвечения.
@WebDev_Plus
Это Glass TTY VT220. Ссылка на шрифт - https://github.com/svofski/glasstty
А финальный ретро-вайб дает Cool Retro Term с эффектом послесвечения.
@WebDev_Plus
❤11
This media is not supported in your browser
VIEW IN TELEGRAM
Эксперимент на WebGL, который показывает, как VAT может масштабироваться прямо в браузере.
Сотни цветов, у каждого тысячи анимированных вершин, и все это рендерится на GPU в реальном времени. Когда прокручиваешь сцену, срабатывает их цикл жизни: они распускаются, растут, задерживаются и постепенно увядают у тебя на пути.
Интересно наблюдать, как такой подход можно будет использовать в будущих WebGL-проектах.
@WebDev_Plus
Сотни цветов, у каждого тысячи анимированных вершин, и все это рендерится на GPU в реальном времени. Когда прокручиваешь сцену, срабатывает их цикл жизни: они распускаются, растут, задерживаются и постепенно увядают у тебя на пути.
Интересно наблюдать, как такой подход можно будет использовать в будущих WebGL-проектах.
@WebDev_Plus
В React Server Components обнаружена критическая уязвимость, описанная как CVE-2025-55182, которая затрагивает React 19 и использующие его фреймворки.
Исправление опубликовано в версиях React 19.0.1, 19.1.2 и 19.2.1. Рекомендуем немедленно обновить версию.
@WebDev_Plus
Исправление опубликовано в версиях React 19.0.1, 19.1.2 и 19.2.1. Рекомендуем немедленно обновить версию.
@WebDev_Plus
react.dev
Critical Security Vulnerability in React Server Components – React
The library for web and native user interfaces
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Сделай свой веб-интерфейс по-настоящему динозавровым 🦖
Меняй сложный JS на пару строк CSS, чтобы собрать карусели и оживить анимации.
Уже доступно в Chrome, скоро подтянутся и другие браузеры → https://goo.gle/44L646B
@WebDev_Plus
Меняй сложный JS на пару строк CSS, чтобы собрать карусели и оживить анимации.
Уже доступно в Chrome, скоро подтянутся и другие браузеры → https://goo.gle/44L646B
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Это может стать настоящей революцией в веб-разработке!
Сейчас разрабатывают протокол проверки email-адресов (Email Verification Protocol).
Можно будет валидировать почту без отправки писем и без соцлогина.
Прямо из браузера и на 100% приватно.
Пока это только предложение, но выглядит очень интересно.
@WebDev_Plus
Сейчас разрабатывают протокол проверки email-адресов (Email Verification Protocol).
Можно будет валидировать почту без отправки писем и без соцлогина.
Прямо из браузера и на 100% приватно.
Пока это только предложение, но выглядит очень интересно.
@WebDev_Plus
👍3❤2
Просто небольшое напоминание: для описания ограниченного набора возможных состояний лучше использовать union type.
А не жонглировать кучей boolean-полей и потенциально невалидными состояниями.
@WebDev_Plus
А не жонглировать кучей boolean-полей и потенциально невалидными состояниями.
@WebDev_Plus
🔥5
Chainable async API
Меня всегда интересовало, как DrizzleORM
удаётся чейнить async-функции вроде await delete() и await delete().where().
Они реализовали свой кастомный Promise, от которого наследуются все операции с БД, например PgDelete для delete в Postgres.
Чейнящиеся методы типа delete() и where() просто изменяют внутреннее состояние и всегда возвращают this (тот же самый инстанс промиса).
Поэтому, когда ты делаешь await delete(), под капотом вызывается then() этого промиса, который запускает this.execute().
Реальный запрос к базе выполняется именно в методе execute, который переопределяется в каждом подклассе.
Я считаю, что это очень крутой дизайн API, а сама идея имплементить Promise — просто отличная.
Ссылка на QueryPromise
Ссылка на PgDelete
@WebDev_Plus
Меня всегда интересовало, как DrizzleORM
удаётся чейнить async-функции вроде await delete() и await delete().where().
Они реализовали свой кастомный Promise, от которого наследуются все операции с БД, например PgDelete для delete в Postgres.
Чейнящиеся методы типа delete() и where() просто изменяют внутреннее состояние и всегда возвращают this (тот же самый инстанс промиса).
Поэтому, когда ты делаешь await delete(), под капотом вызывается then() этого промиса, который запускает this.execute().
Реальный запрос к базе выполняется именно в методе execute, который переопределяется в каждом подклассе.
Я считаю, что это очень крутой дизайн API, а сама идея имплементить Promise — просто отличная.
Ссылка на QueryPromise
Ссылка на PgDelete
@WebDev_Plus
Обеспечьте исчерпывающую проверку на этапе компиляции с помощью утилитарного типа Record в TypeScript
@WebDev_Plus
@WebDev_Plus
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Изучаю SwiftUI после долгой работы с React. Первое, что реально бросается в глаза — .task.
По сути, ты можешь привязать асинхронную функцию к любому куску UI, и она будет выполняться каждый раз при маунте этого UI.
Удобно, например, чтобы поднять подписку через convex и сохранить данные в состоянии. Чисто и приятно👍
Самое близкое сравнение — это useQuery, но тут не нужно городить подкомпоненты, чтобы ограничивать область ререндера.
Ещё интересно, во что это может вылиться, если везде рендерить по принципу render-as-you-fetch. Похоже, на масштабе всё же придётся активно передавать данные через пропсы?
@WebDev_Plus
По сути, ты можешь привязать асинхронную функцию к любому куску UI, и она будет выполняться каждый раз при маунте этого UI.
Удобно, например, чтобы поднять подписку через convex и сохранить данные в состоянии. Чисто и приятно
Самое близкое сравнение — это useQuery, но тут не нужно городить подкомпоненты, чтобы ограничивать область ререндера.
Ещё интересно, во что это может вылиться, если везде рендерить по принципу render-as-you-fetch. Похоже, на масштабе всё же придётся активно передавать данные через пропсы?
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
У <dialog> вместе с формами есть простой способ сделать кнопку Cancel без единой строчки JS. Помимо POST и GET, формы внутри <dialog> могут использовать метод DIALOG. В этом режиме кнопка submit просто закрывает диалог, не отправляя данные на бэкенд.
Удобный и чистый механизм, когда нужно отменить действие и закрыть окно без лишней логики.
Когда форма внутри <dialog> отправляется методом dialog, само диалоговое окно закрывается, состояние контролов формы сохраняется, но ничего не уходит на сервер. При этом returnValue принимает значение той кнопки, по которой пользователь кликнул.
Чистый и удобный способ обработать отмену или выбор без полноценного сабмита.
Только не забудь добавить formnovalidate, чтобы кнопку Cancel всегда можно было нажать, даже если форма валится по валидации.
Подробнее на MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog
@WebDev_Plus
Удобный и чистый механизм, когда нужно отменить действие и закрыть окно без лишней логики.
Когда форма внутри <dialog> отправляется методом dialog, само диалоговое окно закрывается, состояние контролов формы сохраняется, но ничего не уходит на сервер. При этом returnValue принимает значение той кнопки, по которой пользователь кликнул.
Чистый и удобный способ обработать отмену или выбор без полноценного сабмита.
Только не забудь добавить formnovalidate, чтобы кнопку Cancel всегда можно было нажать, даже если форма валится по валидации.
Подробнее на MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog
@WebDev_Plus
❤1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Нужны эффектные анимации для React Native?
Есть открытая коллекция с сотней с лишним готовых анимаций, которые можно сразу втащить в проект. Чистые, современные, удобно разбирать и играться.
Отлично подходит, если хочется прокачать анимацию в приложении, не собирая всё вручную.
Исходники: github.com/enzomanuelmangano/demos
@WebDev_Plus
Есть открытая коллекция с сотней с лишним готовых анимаций, которые можно сразу втащить в проект. Чистые, современные, удобно разбирать и играться.
Отлично подходит, если хочется прокачать анимацию в приложении, не собирая всё вручную.
Исходники: github.com/enzomanuelmangano/demos
@WebDev_Plus
👍1