Записки фронтендера
423 subscribers
145 photos
42 videos
1 file
160 links
Все самые свежие обновления в мире Frontend

Бесплатная реклама твоего проекта
https://votby.ru

Общий чат
@fe_notes_chat

Чат помощи с поиском работы
@fe_notes_help

Написать в лс @usersavchenko
Download Telegram
Записки фронтендера
Прощаемся с display: masonry Если вы не в курсе, то уже много лет рабочая группа пытается добавить в CSS такую же крутую сетку, как и у pinterest (они её делают с помощью JS) Фичу никак не могут выкатить из-за разногласий в сообществе В последнее время…
Masonry сетка всё ближе 🔥

Safari на днях выпустил Technology Preview 234 по данной фиче, а это значит, что технология уже готова, но пока ещё какое-то время будет тестироваться на наличие возможных проблем

Chrome, начиная со 140 версии, также тестирует эту фичу

Firefox с 2020 года ничего нового не публиковал, но за последнее время можно проследить подвижки и в их коде

Похоже, что Baseline уже близко!
❤1👍1🔥1
Визуализатор серверных компонентов 🔍

После всех найденных уязвимостей в React, много кто начал погружаться в то, как RSC работает под капотом

19 декабря Ден Абрамов написал статью, в которой обозревает инструмент для визуализации работы серверных компонентов

Он позволяет пошагово увидеть все генерируемые данные (progressive JSON), которые используются внутри этого механизма

Инструмент пока что сыроват (есть 4 разные версии React на выбор и переключатель режима разработки), но для того, чтобы разобраться в сути уязвимости, пойдёт

🔗 Ссылка на github проекта
❤1🤔1🤣1
This media is not supported in your browser
VIEW IN TELEGRAM
Cursor выкупил Graphitе

19 декабря на официальном сайте Cursor вышло сообщение о том, что они приобрели Graphite (ИИ-помощник, который помогает в ревью и отладке кода)

Инструментом уже пользуются такие гиганты как Shopify, Figma, X (Twitter), Vercel, Duolingo и многие другие

У стартапа, основанного в 2020 году, есть большая экспертиза и продвинутый ИИ, которые жизненно необходимы Cursor в конкурентной борьбе с другими компаниями

Обещают сделать глубокую интеграцию с Graphite, но продукт и дальше будет развиваться как отдельный

Похоже, в ближайшее время мы увидим переход Cursor от генератора кода в полноценное end-to-end решение
1❤4
Забытые и неизведанные свойства

Скорее всего, вы знаете о существовании свойства hyphens. Оно позволяет указать, будут ли большие слова при нехватке места переноситься на следующую строку с использованием дефиса.

Оказывается, помимо него существуют также hyphenate-character и hyphenate-limit-chars

Первый вместо дефолтного дефиса задаёт любой другой символ переноса:
hyphenate-character: "=";


А второй — посимвольно управляет каждым словом:
hyphenate-limit-chars: 8 2 3;


Данные числа означают:
1) Запрет на перенос слов длиной короче 8 символов
2) При переносе на первой строке должно остаться не меньше 2 символов
3) На второй — не меньше 3

⚙️ Поддержка браузерами: hyphenate-character, hyphenate-limit-chars
👍5❤1
Топ донатов месяца

Декабрь подошёл к концу, а значит настало время поблагодарить ребят, которые в очередной раз поддержали проект

Стрим 28 декабря:
💰 1100р. Константин
💰 250р. Денис

30 ноября и 31 декабря в телеграм:
⭐️ @maunsh 2 звёздочки

Огромное всем спасибо!

*Ссылку на профиль donation alerts не отображает, можете написать в личку, я дополню пост
❤5😁1
Новый инструмент для работы с AI

Если вы пользуетесь библиотеками Tanstack, то, скорее всего, уже заметили новое название на их главной странице — Tanstack AI

Он упрощает добавление ИИ в ваш продукт и даёт готовый API для общения фронтенда с бекендом

Серверный файл:
import { chat } from "@tanstack/ai";
import { openaiText } from "@tanstack/ai-openai";
import { toServerSentEventsResponse } from "@tanstack/ai";

export async function POST(req: Request) {
const { messages } = await req.json();

const stream = chat({
adapter: openaiText(process.env.OPENAI_KEY),
messages,
systemPrompts: ["You are a helpful assistant"],
});

return toServerSentEventsResponse(stream);
}


Клиентский файл:
import { useChat, fetchServerSentEvents } from "@tanstack/ai-react";

export function Chat() {
const { messages, sendMessage, isLoading, stop } = useChat({
connection: fetchServerSentEvents("/api/chat"),
});

return (
<div>
...
</div>
);
}


Дополнительно вы получаете набор браузерных Dev Tools (можно отслеживать перемещение данных), а также удобную интеграцию с остальными библиотеками экосистемы Tanstack

Разработка данного инструмента началась 8 октября 2025 года, поэтому он пока что сыроват для использования в реальных проектах, но у него ещё всё впереди!

🔗 Видео-обзор Кайла Кука
🔗 Примеры использования из официального репозитория
1❤2
Новогодний стрим 🌲

Всем привет!

10 января в 17:00 МСК планирую выйти в эфир, жду всех желающих!

Ссылки, как и в прошлый раз, добавлю позже

upd. запись youtube, twitch
🔥3❤1
Новые единицы измерения 🔥

С приходом контейнерных запросов в CSS были также добавлены новые единицы измерения, которые опираются на размер родительского контейнера.

cqw - 1% ширины контейнера
cqh - 1% высоты контейнера
cqi - 1% inline-размера контейнера
cqb - 1% block-размера контейнера
cqmin - наименьшее значение из cqi и cqb
cqmax - наибольшее значение из cqi и cqb

Напомню, что контейнером в этом контексте может быть любой родительский элемент выше по дереву, который имеет свойство container-type или container в своём наборе свойств. Если таких элементов несколько, то выбирается именно ближайший.

⚙️ Поддержка браузерами широкая
👍3🔥2❤1
AI tooling от Vercel 🔧

Тем временем команда 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) Свойству container-type добавили значение anchored
2) А директиве @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
Формируем ссылки для ИИ

Не все знают, что существует возможность формировать ссылку на ИИ-помощник с заранее подготовленным промптом

Это прикольная фича, которая делает ваш сайт ещё удобнее:
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.
1🔥6❤2
Новый HTML элемент 🔥

В 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
Стилизуем найденный текст 🔥

Думаю все знают, что при помощи комбинации клавиш
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, которое позволяет менять тип каретки в редактируемых элементах.

Возможные значения:
auto (по-умолчанию) — стандартное значение зависящее от платформы
bar — вертикальная полоска
block — прямоугольник
underscore — горизонтальная полоска снизу

ℹ️ Напомню, что это не первое свойство из данной серии. Ранее уже были представлены caret-color и caret-animation, которые позволяют менять цвет и анимацию каретки, соответственно.

⚙️ Поддерживается пока что только в Chrome
❤4🔥2👍1
В Chrome завезли Temporal API 🔥

После Firefox данный API появился и в Chrome, на очереди остаётся лишь Safari.

Если вы не в курсе, то Temporal пришёл на смену стандартному Date для работы с датами, временем и всем связанным с этим. Он решает множество старых проблем, даёт более удобный API, а также открывает новые и недоступные ранее возможности.

К примеру, у него имеется поддержка негригорианских календарей, возможность работать с наносекундами и куча встроенных методов для арифметических операций.

Возможно вы задумались:
— А может ли Temporal заменить библиотеки для работы с датами, вроде dayjs?

Ответ:
— И да, и нет

В простых кейсах, как и раньше с Date, вполне можно обойтись и браузерными возможностями, но в сложных вам по-прежнему придётся писать в разы кода без использования библиотек.

🛠 Полифил
⚙️ Поддержка браузерами
1👍7❤1
Топ донатов месяца

Январь подошёл к концу, по традиции благодарю всех, кто поддержал канал в этом месяце!

Телеграм:
⭐️ @maunsh 4 звёздочки
⭐️ @donaks 4 звёздочки

Огромное всем спасибо!
3🤣7❤4🔥2