Новые единицы измерения 🔥
С приходом контейнерных запросов в CSS были также добавлены новые единицы измерения, которые опираются на размер родительского контейнера.
Напомню, что контейнером в этом контексте может быть любой родительский элемент выше по дереву, который имеет свойство
⚙️ Поддержка браузерами широкая
С приходом контейнерных запросов в CSS были также добавлены новые единицы измерения, которые опираются на размер родительского контейнера.
cqw - 1% ширины контейнераcqh - 1% высоты контейнераcqi - 1% inline-размера контейнераcqb - 1% block-размера контейнераcqmin - наименьшее значение из cqi и cqbcqmax - наибольшее значение из cqi и cqbНапомню, что контейнером в этом контексте может быть любой родительский элемент выше по дереву, который имеет свойство
container-type или container в своём наборе свойств. Если таких элементов несколько, то выбирается именно ближайший.⚙️ Поддержка браузерами широкая
👍3🔥2❤1
AI tooling от Vercel 🔧
Тем временем команда Vercel не спит и уже давно работает над собственным инструментом для работы с ИИ
Синтаксис прям сильно похож на Tanstack AI 😄
Серверный файл:
Клиентский файл:
SDK уже 6 версии, а значит может использоваться в проде. Важно, что он не привязан к Next.js и подходит для любых проектов. Инструмент имеет огромный функционал и подробнейшую документацию.
🔗 Видео-обзор от Мэтта Покока
🔗 Примеры из официального репозитория
Тем временем команда Vercel не спит и уже давно работает над собственным инструментом для работы с ИИ
Синтаксис прям сильно похож на Tanstack AI 😄
Серверный файл:
import { generateText } from "ai";
export async function POST(req: Request) {
const { prompt } = await req.json();
const { text } = await generateText({
model: "openai/gpt-4o",
prompt,
});
return new Response(JSON.stringify({ text }), {
headers: { "Content-Type": "application/json" },
});
}Клиентский файл:
'use client';
import React, { useState } from "react";
import { useChat } from "@ai-sdk/react";
export default function Chat() {
const { messages, sendMessage, status } = useChat();
return (
<div>
...
</div>
);
}
SDK уже 6 версии, а значит может использоваться в проде. Важно, что он не привязан к Next.js и подходит для любых проектов. Инструмент имеет огромный функционал и подробнейшую документацию.
🔗 Видео-обзор от Мэтта Покока
🔗 Примеры из официального репозитория
👍8❤1
Anchored container queries
Ранее, если вы пользовались новым Anchor Positioning API, то несмотря на всю его мощь, у вас не было возможности стилизовать тултип в зависимости от его расположения
Chrome 143 версии это исправил:
1) Свойству
2) А директиве
В этом коде, наш тултип изначально находится снизу, но если он не умещается, то срабатывает
🔗 Моя статья на habr по Anchor Positioning
⚙️ Поддержка браузерами пока что небольшая
Ранее, если вы пользовались новым Anchor Positioning API, то несмотря на всю его мощь, у вас не было возможности стилизовать тултип в зависимости от его расположения
Chrome 143 версии это исправил:
1) Свойству
container-type добавили значение anchored2) А директиве
@container новый синтаксис — @container anchored(fallback: ...).tooltip {
position-area: bottom;
position-try-fallbacks: flip-block;
container-type: anchored;
&::before {
content: '▲';
position: absolute;
bottom: 100%;
}
}
@container anchored(fallback: flip-block) {
.tooltip::before {
content: '▼';
bottom: auto;
top: 100%;
}
}В этом коде, наш тултип изначально находится снизу, но если он не умещается, то срабатывает
position-try-fallbacks: flip-block; и элемент по блочной оси прыгает вверх. @container это замечает (т.к. там указан fallback: flip-block) и применяет любые внутренние стили.🔗 Моя статья на habr по Anchor Positioning
⚙️ Поддержка браузерами пока что небольшая
👍5❤1
Формируем ссылки для ИИ
Не все знают, что существует возможность формировать ссылку на ИИ-помощник с заранее подготовленным промптом
Это прикольная фича, которая делает ваш сайт ещё удобнее:
Gemini
Perplexity
Claude
Grok
💭 Вообще можно много чего придумать. К примеру, добавить кнопку
Не все знают, что существует возможность формировать ссылку на ИИ-помощник с заранее подготовленным промптом
Это прикольная фича, которая делает ваш сайт ещё удобнее:
window.open(
'https://chat.openai.com/?q=' + encodeURIComponent('Что такое инкапсуляция?'),
'_blank'
);
Gemini
https://aistudio.google.com/prompts/new_chat?prompt=ПРОМПТ
Perplexity
https://www.perplexity.ai/search?q=ПРОМПТ
Claude
https://claude.ai/new?q=ПРОМПТ
Grok
https://x.com/i/grok?text=ПРОМПТ
💭 Вообще можно много чего придумать. К примеру, добавить кнопку
"Спросить у ChatGPT" и приложить ссылку на вашу статью в этот URL👍7❤2
JavaScript Rising Stars 2025
bestofjs составил очередной ежегодный рейтинг инструментов, набравших в этом году наибольшее количество звёзд среди конкурентов.
К моему удивлению, Playwright впервые за многие годы потерял первое место и теперь его занимает Stagehand — тоже e2e фреймворк для тестирования, но основанный на ИИ.
В desktop разработке уже 5 год подряд лидирует tauri. Неплохой аргумент при сравнении с классическим electron.
В разделе генерации статики крепко утвердился Next.js, как ни странно. Gatsby вообще вылетел из гонки.
Среди дополнительных инструментов третий год подряд в топе держатся Bun, Biome и Oxc. На мой взгляд, очень интересные кандидаты к использованию.
Также интересными показались react-scan, который визуализирует перерендеры компонента, onlook, который генерирует макеты по запросу и puck, который представляет собой ИИшную версию CMS.
bestofjs составил очередной ежегодный рейтинг инструментов, набравших в этом году наибольшее количество звёзд среди конкурентов.
К моему удивлению, Playwright впервые за многие годы потерял первое место и теперь его занимает Stagehand — тоже e2e фреймворк для тестирования, но основанный на ИИ.
В desktop разработке уже 5 год подряд лидирует tauri. Неплохой аргумент при сравнении с классическим electron.
В разделе генерации статики крепко утвердился Next.js, как ни странно. Gatsby вообще вылетел из гонки.
Среди дополнительных инструментов третий год подряд в топе держатся Bun, Biome и Oxc. На мой взгляд, очень интересные кандидаты к использованию.
Также интересными показались react-scan, который визуализирует перерендеры компонента, onlook, который генерирует макеты по запросу и puck, который представляет собой ИИшную версию CMS.
1🔥6❤2
Новый HTML элемент 🔥
В Chrome 144 добавили тег
Ранее браузеры блокировали запросы на доступ к таким данным, если они вызывались неявно. Например, в ходе выполнения какой-нибудь сторонней функции или внутри какого-нибудь
Это делалось для того, чтобы обезопасить неосторожного пользователя, который может неосознанно повыдавать разрешения всем неожиданно появившимся предупреждениям и, таким образом, потерять свои конфиденциальные данные. Подобные автоблокировки срабатывали не всегда, так как случались ситуации, когда невозможно определить, является ли запрос злоумышленным или нет на уровне концепции.
Собственно, для этого и придумали новый тег. Кнопку можно стилизовать также, как и обычную, но повлиять на текст внутри неё невозможно. Также не получится её скрыть, сделать прозрачной или как-то по-другому "заставить" пользователя нажать на неё неосознанно. Она просто перестанет работать.
Думается мне, Chrome и другие браузеры подготавливают почву для ужесточений в политиках доступов и это пока что первый шаг.
🔗 Ссылка на спецификацию
⚙️ Поддерживается пока что только в Chrome
В Chrome 144 добавили тег
<geolocation>, который представляет собой кнопку, вокруг которой построен API управления местоположением пользователя. Ранее браузеры блокировали запросы на доступ к таким данным, если они вызывались неявно. Например, в ходе выполнения какой-нибудь сторонней функции или внутри какого-нибудь
setTimeout (без явного синхронного клика пользователя по кнопке).Это делалось для того, чтобы обезопасить неосторожного пользователя, который может неосознанно повыдавать разрешения всем неожиданно появившимся предупреждениям и, таким образом, потерять свои конфиденциальные данные. Подобные автоблокировки срабатывали не всегда, так как случались ситуации, когда невозможно определить, является ли запрос злоумышленным или нет на уровне концепции.
Собственно, для этого и придумали новый тег. Кнопку можно стилизовать также, как и обычную, но повлиять на текст внутри неё невозможно. Также не получится её скрыть, сделать прозрачной или как-то по-другому "заставить" пользователя нажать на неё неосознанно. Она просто перестанет работать.
Думается мне, Chrome и другие браузеры подготавливают почву для ужесточений в политиках доступов и это пока что первый шаг.
<geolocation id="geo" autolocate watch></geolocation>
geo.addEventListener('location', () => {
// Изменились данные о местоположении
});
geo.addEventListener('promptaction', () => {
// Пользователь принял или отклонил предупреждение
});
geo.addEventListener('promptdismiss', () => {
// Пользователь закрыл предупреждение
});
geo.addEventListener('validationstatuschange', () => {
// Данные о разрешении пользователя изменились
});🔗 Ссылка на спецификацию
⚙️ Поддерживается пока что только в Chrome
🔥3❤1👍1
Media is too big
VIEW IN TELEGRAM
Стилизуем найденный текст 🔥
Думаю все знают, что при помощи комбинации клавиш
Chrome в 144 версии добавил такую возможность:
Псевдоэлемент
Например:
Спецификация помимо
🔗 Ссылка на спецификацию
⚙️ Поддерживается пока что только в Chrome
Думаю все знают, что при помощи комбинации клавиш
Ctrl + F можно осуществлять поиск по странице в браузере. Найденный текст выделяется цветом, определённым браузером по-умолчанию. Но что делать, если мы хотим его переопределить?Chrome в 144 версии добавил такую возможность:
// Все найденные совпадения
::search-text {
background: blue;
}
// Текущее совпадение
::search-text:current {
background: red;
font-weight: bold;
}
Псевдоэлемент
::search-text можно также вешать на другие селекторы, чтобы сузить конечную выборку. Например:
div::search-text { }Спецификация помимо
:current зарезервировала также :past и :future для будущих доработок, но пока что они нигде не реализованы. Они предполагают стилизацию всех элементов до и после :current, соответственно.🔗 Ссылка на спецификацию
⚙️ Поддерживается пока что только в Chrome
1🔥8❤1👍1
Media is too big
VIEW IN TELEGRAM
Меняем тип каретки в поле ввода 🔥
Что ни день, то революция в вебе!
Chrome в 144 версии выпустил новое свойство — caret-shape, которое позволяет менять тип каретки в редактируемых элементах.
Возможные значения:
ℹ️ Напомню, что это не первое свойство из данной серии. Ранее уже были представлены caret-color и caret-animation, которые позволяют менять цвет и анимацию каретки, соответственно.
⚙️ Поддерживается пока что только в Chrome
Что ни день, то революция в вебе!
Chrome в 144 версии выпустил новое свойство — caret-shape, которое позволяет менять тип каретки в редактируемых элементах.
Возможные значения:
auto (по-умолчанию) — стандартное значение зависящее от платформыbar — вертикальная полоска block — прямоугольникunderscore — горизонтальная полоска снизуℹ️ Напомню, что это не первое свойство из данной серии. Ранее уже были представлены caret-color и caret-animation, которые позволяют менять цвет и анимацию каретки, соответственно.
⚙️ Поддерживается пока что только в Chrome
❤4🔥2👍1
В Chrome завезли Temporal API 🔥
После Firefox данный API появился и в Chrome, на очереди остаётся лишь Safari.
Если вы не в курсе, то
К примеру, у него имеется поддержка негригорианских календарей, возможность работать с наносекундами и куча встроенных методов для арифметических операций.
Возможно вы задумались:
— А может ли
Ответ:
— И да, и нет
В простых кейсах, как и раньше с
🛠 Полифил
⚙️ Поддержка браузерами
После Firefox данный API появился и в Chrome, на очереди остаётся лишь Safari.
Если вы не в курсе, то
Temporal пришёл на смену стандартному Date для работы с датами, временем и всем связанным с этим. Он решает множество старых проблем, даёт более удобный API, а также открывает новые и недоступные ранее возможности. К примеру, у него имеется поддержка негригорианских календарей, возможность работать с наносекундами и куча встроенных методов для арифметических операций.
Возможно вы задумались:
— А может ли
Temporal заменить библиотеки для работы с датами, вроде dayjs?Ответ:
— И да, и нет
В простых кейсах, как и раньше с
Date, вполне можно обойтись и браузерными возможностями, но в сложных вам по-прежнему придётся писать в разы кода без использования библиотек.🛠 Полифил
⚙️ Поддержка браузерами
1👍7❤1
Вышла 25 версия Node.js ⚡️
Главной задачей этого релиза было улучшение скорости выполнения кода, повышение безопасности и приближение языка к браузерным стандартам.
Из интересного:
🐥 Обновили движок V8 до версии 14.1, что, к примеру, дало прирост к скорости выполнения
🐥
🐥 Добавлен
🐥
🐥 TypeScript выходит из экспериментального режима и становится общедоступным.
ℹ️ Напомню, что в Node.js теперь не нужен build этап для работы TypeScript, он самостоятельно удаляется при запуске скрипта, но для запуска проверок по-прежнему нужен
🔗 Список всех изменений
Главной задачей этого релиза было улучшение скорости выполнения кода, повышение безопасности и приближение языка к браузерным стандартам.
Из интересного:
🐥 Обновили движок V8 до версии 14.1, что, к примеру, дало прирост к скорости выполнения
JSON.stringify на 30-50%🐥
localStorage и sessionStorage теперь доступны "из коробки"🐥 Добавлен
ErrorEvent по аналогии с браузером:window.addEventListener('error', (event) => {
// ...
});🐥
Uint8Array получил браузерные методы декодирования в base64 и hex:const data = new Uint8Array([72, 101, 108, 108, 111]);
const base64 = data.toBase64();
const hex = data.toHex();
🐥 TypeScript выходит из экспериментального режима и становится общедоступным.
ℹ️ Напомню, что в Node.js теперь не нужен build этап для работы TypeScript, он самостоятельно удаляется при запуске скрипта, но для запуска проверок по-прежнему нужен
tsc.🔗 Список всех изменений
1👍6❤2🔥1
Забытые и неизведанные атрибуты формы
Сегодня сделал для себя внезапное открытие.
Оказывается, у кнопки существует атрибут
К примеру, в следующем коде первая кнопка заменяет
ℹ️ Напомню, что в HTML форма поддерживает только
ℹ️ Также важно понимать, что данный атрибут предназначен только для submit-кнопок. То есть, если в ней будет указано
Также
Сегодня сделал для себя внезапное открытие.
Оказывается, у кнопки существует атрибут
formmethod, который позволяет переопределить используемый метод.К примеру, в следующем коде первая кнопка заменяет
POST на GET запрос, а вторая оставляет всё как есть:<form method="post" action="/search">
<button formmethod="get">Отправить форму как GET</button>
<button>Отправить форму как POST</button>
</form>
ℹ️ Напомню, что в HTML форма поддерживает только
POST и GET запросы. Никакие другие методы (DELETE, например) работать не будут.ℹ️ Также важно понимать, что данный атрибут предназначен только для submit-кнопок. То есть, если в ней будет указано
type="button", то работать не будет. Если не указать атрибут type, то он по-умолчанию будет submit.Также
method и formmethod имеют значение dialog, которое вместо отправки формы даёт возможность управлять диалоговым окном:<dialog id="confirm">
<form method="dialog">
<p>Удалить файл?</p>
<button value="cancel">Отмена</button>
<button value="confirm">Удалить</button>
</form>
</dialog>
const dialog = document.getElementById('confirm');
dialog.showModal();
dialog.addEventListener('close', () => {
console.log(dialog.returnValue); // cancel или confirm
});1👍4🔥2❤1
Сравнение возможностей AI Coding инструментов
Случайно наткнулся на таблицу, которая наглядно показывает разницу между AI инструментами для генерации кода.
Будет полезна тем, кто ещё не определился с выбором или ищет что-то другое.
🔗 Ссылка
Случайно наткнулся на таблицу, которая наглядно показывает разницу между AI инструментами для генерации кода.
Будет полезна тем, кто ещё не определился с выбором или ищет что-то другое.
🔗 Ссылка
❤2👍2
Media is too big
VIEW IN TELEGRAM
Chrome Dev Tools внутри Chrome Dev Tools 🤯
Возможно вы не знали, но Chrome Dev Tools тоже рендерятся на HTML и CSS и их дерево DOM можно также инспектировать другими Chrome Dev Tools.
Для того, чтобы так сделать, нужно открепить инструменты в отдельное окно и воспользоваться следующей командой:
Windows:
MacOS:
Таким образом, вы можете открывать бесконечное количество инструментов, инспектирующих друг друга.
Возможно вы не знали, но Chrome Dev Tools тоже рендерятся на HTML и CSS и их дерево DOM можно также инспектировать другими Chrome Dev Tools.
Для того, чтобы так сделать, нужно открепить инструменты в отдельное окно и воспользоваться следующей командой:
Windows:
Ctrl + Shift + IMacOS:
Cmd + Opt + I Таким образом, вы можете открывать бесконечное количество инструментов, инспектирующих друг друга.
🤯7👍4🔥2❤1
Media is too big
VIEW IN TELEGRAM
Мощный анализатор CSS стилей
Нашёл крутой инструмент для работы с CSS в проекте
Он даёт подробную информацию о:
— Размерах файлов
— Покрытии Atomic свойствами
— Количестве свойств, классов и прочего
— Подсчитывает специфичность селекторов
— Составляет палитру всех цветов
— Кучу всего по шрифтам, отступам, скруглениям, теням и прочему
В Chrome Dev Tools во вкладке CSS Overview есть похожий функционал, но он пока что не настолько масштабный и находится в экспериментальном режиме.
🔗 Ссылка
Нашёл крутой инструмент для работы с CSS в проекте
Он даёт подробную информацию о:
— Размерах файлов
— Покрытии Atomic свойствами
— Количестве свойств, классов и прочего
— Подсчитывает специфичность селекторов
— Составляет палитру всех цветов
— Кучу всего по шрифтам, отступам, скруглениям, теням и прочему
В Chrome Dev Tools во вкладке CSS Overview есть похожий функционал, но он пока что не настолько масштабный и находится в экспериментальном режиме.
🔗 Ссылка
👍3🔥2❤1
Вышел новый TypeScript 🔥
На днях опубликовали бета версию TypeScript 6, это переходная версия перед крупным портированием ядра компилятора на Go.
Из нового:
1) Добавлены типы ECMAScript 2025, Temporal API, новых методов Map и WeakMap
2)
3) Новый флаг
4) Уменьшена контекстная зависимость в функциях без this
5) Добавлена поддержка
6) Cтала доступна комбинация из
Изменились значения
1)
2)
3)
4)
5)
6)
7)
Устарело:
1)
2)
3)
4)
5)
6)
7)
8)
9)
10) Старый синтаксис для объявления неймспейсов
11) Ключевое слово
12) Директива
🔗 Ссылка на подробный обзор
На днях опубликовали бета версию TypeScript 6, это переходная версия перед крупным портированием ядра компилятора на Go.
Из нового:
1) Добавлены типы ECMAScript 2025, Temporal API, новых методов Map и WeakMap
2)
dom.iterable и dom.asynciterable перенесены в dom3) Новый флаг
--stableTypeOrdering4) Уменьшена контекстная зависимость в функциях без this
5) Добавлена поддержка
subpath imports вида #/6) Cтала доступна комбинация из
--moduleResolution bundler и --module commonjsИзменились значения
tsconfig по-умолчанию:1)
strict: true2)
module: esnext3)
target: самая актуальная ECMAScript версия (на данный момент es2025)4)
noUncheckedSideEffectImports: true5)
libReplacement: false6)
compilerOptions.rootDir: "."7)
compilerOptions.types: []Устарело:
1)
target: es52)
--downlevelIteration3)
--moduleResolution4)
module: amd, umd, и systemjs 5)
--baseUrl6)
--moduleResolution classic7)
--esModuleInterop false и --allowSyntheticDefaultImports false8)
--alwaysStrict false9)
--outFile10) Старый синтаксис для объявления неймспейсов
11) Ключевое слово
asserts в импортах12) Директива
no-default-lib🔗 Ссылка на подробный обзор
100❤2👍2😁1