Forwarded from Ленивый вайб-программист
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4❤1😭1
This media is not supported in your browser
VIEW IN TELEGRAM
Технологии: HTML, SCSS
CodeBase | Frontend | #animate
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Появился мощный инструмент для прохождения собеседований — Sobes Copilot.
Это нейросеть, которая подсказывает ответы прямо во время интервью, анализируя разговор в реальном времени.
Copilot работает незаметно в Zoom, Google Meet, Teams и других платформах. Поддерживает русский язык, не виден при демонстрации экрана и помогает держать уверенный темп диалога, даже если вопрос сложный или неожиданный.
Дополнительно Sobes Copilot делает пост-анализ собеседования: разбирает диалог после созвона, подсвечивает сильные и слабые моменты, удачные формулировки и зоны роста. Это позволяет понять, что сработало, а что стоит улучшить перед следующим интервью.
Если хотите проходить собесы спокойнее и увереннее — изучите возможности сервиса по ссылке. Это действительно меняет игру.
🎁 Промокод: SOBES26 — даёт 10% скидки на старт.
Это нейросеть, которая подсказывает ответы прямо во время интервью, анализируя разговор в реальном времени.
Copilot работает незаметно в Zoom, Google Meet, Teams и других платформах. Поддерживает русский язык, не виден при демонстрации экрана и помогает держать уверенный темп диалога, даже если вопрос сложный или неожиданный.
Дополнительно Sobes Copilot делает пост-анализ собеседования: разбирает диалог после созвона, подсвечивает сильные и слабые моменты, удачные формулировки и зоны роста. Это позволяет понять, что сработало, а что стоит улучшить перед следующим интервью.
Если хотите проходить собесы спокойнее и увереннее — изучите возможности сервиса по ссылке. Это действительно меняет игру.
🎁 Промокод: SOBES26 — даёт 10% скидки на старт.
❤2
Метод
Array.from() создаёт настоящий массив из массивоподобных или итерируемых объектов(например,
NodeList, arguments, Set, Map).const buttons = document.querySelectorAll("button");
const btnArray = Array.from(buttons);
btnArray.forEach(btn => btn.classList.add("active"));•
querySelectorAll возвращает NodeList, а не массив•
Array.from() превращает его в массив• после этого доступны
map, filter, forEach и другие методыArray.from() — это мост между «псевдомассивами» и полноценными массивами, без костылей и циклов
CodeBase | Frontend | #JS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Технологии: HTML, SCSS, JS
CodeBase | Frontend | #animate
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1😁1
Автор разбирает, как новые CSS-фичи для работы с цветом упрощают жизнь разработчику: что появилось, зачем это нужно и как использовать, не влезая в теорию цвета.
CodeBase | Frontend | #article
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Автор собрал HTML и CSS-фичи, которые к 2026 стали реально поддерживаться браузерами. Без теории и споров, просто список того, что уже можно смело тащить в прод.
CodeBase | Frontend | #article
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1🔥1
Кроме примитивных типов в JavaScript существуют и сложные — например, объект.
Пустой объект без свойств можно создать парой фигурных скобок:
const cat = {}const book = {
title: 'Война и мир',
author: 'Лев Толстой',
pages: 1274,
isFinished: true
}CodeBase | Frontend | #js
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Тег
<section> создаёт независимый блок — например, блок новостей, блок с контактами или просто абзац с заголовком.<section>
<h1>Заголовок первого блока</h1>
<p>Съешь ещё этих мягких французских булок, да выпей чаю.</p>
</section>
<section>
<h1>Заголовок второго блока</h1>
<p>Съешь ещё этих мягких французских булок, да выпей же чаю.</p>
</section>
• Тег <section> всегда закрывается при помощи парного тега </section>.• Внутри <section> обязательно должен быть заголовок <h1>...<h6>.• Контейнеры <section> можно вкладывать друг в друга, как матрёшку.<div>.Некоторые начинающие разработчики неверно понимают семантику этого тега и заменяют им большую часть дивов на странице. Так делать не стоит.
Тегом
<section> стоит оборачивать большие логические блоки на странице.🛠 По спецификации допустимо размещать в каждом <section> заголовок первого уровня (<h1>). Несмотря на это, не стоит размещать на странице больше одного заголовка первого уровня. Это важно для правильной индексации сайта поисковыми роботами.
CodeBase | Frontend | #html
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥2
text-shadow в CSS и зачем оно используется?text-shadow — это CSS-свойство, которое добавляет тень к тексту, улучшая его визуальное восприятие. Оно позволяет задавать цвет, смещение, размытие и создавать эффекты, такие как свечение или объёмный текст.<div class="text">Тень у текста</div>
<style>
.text {
font-size: 24px;
font-weight: bold;
color: darkblue;
text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5); /* Тень с размитием */
}
</style>
text-shadow делает текст более выразительным. Это свойство часто используется для стилизации заголовков, кнопок и декоративных элементов.CodeBase | Frontend | #CSS
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
🧬 Иммутабельность из коробки: toSorted(), toSpliced() и with()
Сколько раз вы ловили трудноуловимые баги в React или Redux из-за того, что методы sort(), reverse() или splice() незаметно мутируют оригинальный массив?
Раньше, чтобы обновить состояние, нам приходилось плодить поверхностные копии через спред-оператор.
// ❌ Старая школа (много шума)
const sortedUsers = [...users].sort((a, b) => a.age - b.age);
// А замена элемента по индексу вообще выглядела как пытка:
const updatedUsers = [...users];
updatedUsers[index] = newUser;
В стандарте ES2023 (Baseline 2023) JavaScript наконец-то получил нативные иммутабельные методы массивов. Они делают то же самое, но возвращают новый массив, оставляя оригинал нетронутым.
🚀 Как пишем теперь:
1. Сортировка и разворот
// ✅ Оригинал цел, получаем новый массив
const sorted = users.toSorted((a, b) => a.age - b.age);
const reversed = users.toReversed();
2. Удаление/вставка (вместо splice)
const months = ["Jan", "Mar", "Apr", "May"];
// Вставляем "Feb" на индекс 1 (ничего не удаляя)
const fixedMonths = months.toSpliced(1, 0, "Feb");
// ["Jan", "Feb", "Mar", "Apr", "May"]
3. 🔥 Метод with() - киллер-фича для React
Заменяет элемент по индексу без мутаций. Идеально для обновления конкретного элемента в массиве состояния.
const state = ['apple', 'banana', 'cherry'];
// Меняем 'banana' на 'mango'
const newState = state.with(1, 'mango');
// ['apple', 'mango', 'cherry']
💡Методы работают не только с массивами, но и с TypedArrays (например, Uint8Array). А метод with() отлично справляется с отрицательными индексами - arr.with(-1, newItem) заменит последний элемент массива без вычисления его длины!
CodeBase | Frontend | #js
Сколько раз вы ловили трудноуловимые баги в React или Redux из-за того, что методы sort(), reverse() или splice() незаметно мутируют оригинальный массив?
Раньше, чтобы обновить состояние, нам приходилось плодить поверхностные копии через спред-оператор.
// ❌ Старая школа (много шума)
const sortedUsers = [...users].sort((a, b) => a.age - b.age);
// А замена элемента по индексу вообще выглядела как пытка:
const updatedUsers = [...users];
updatedUsers[index] = newUser;
В стандарте ES2023 (Baseline 2023) JavaScript наконец-то получил нативные иммутабельные методы массивов. Они делают то же самое, но возвращают новый массив, оставляя оригинал нетронутым.
🚀 Как пишем теперь:
1. Сортировка и разворот
// ✅ Оригинал цел, получаем новый массив
const sorted = users.toSorted((a, b) => a.age - b.age);
const reversed = users.toReversed();
2. Удаление/вставка (вместо splice)
const months = ["Jan", "Mar", "Apr", "May"];
// Вставляем "Feb" на индекс 1 (ничего не удаляя)
const fixedMonths = months.toSpliced(1, 0, "Feb");
// ["Jan", "Feb", "Mar", "Apr", "May"]
3. 🔥 Метод with() - киллер-фича для React
Заменяет элемент по индексу без мутаций. Идеально для обновления конкретного элемента в массиве состояния.
const state = ['apple', 'banana', 'cherry'];
// Меняем 'banana' на 'mango'
const newState = state.with(1, 'mango');
// ['apple', 'mango', 'cherry']
💡Методы работают не только с массивами, но и с TypedArrays (например, Uint8Array). А метод with() отлично справляется с отрицательными индексами - arr.with(-1, newItem) заменит последний элемент массива без вычисления его длины!
CodeBase | Frontend | #js
👍3🎄2❤1
⚡️ Прощай, FID. Привет, INP: Главная метрика Core Web Vitals
First Input Delay (FID) официально ушел на пенсию в марте 2024 года. На его место пришел INP (Interaction to Next Paint). Если вы всё еще оптимизируете старую метрику, самое время пересмотреть свои подходы.
В чем был обман FID?
FID измерял только задержку (Input Delay) от клика до того момента, как браузер начал выполнять ваш обработчик событий.
Если ваша функция
Что измеряет INP?
INP фиксирует всё время до появления визуального отклика на экране:
1. Ожидание освобождения Main Thread (Input delay)
2. Выполнение вашего JS-кода (Processing time)
3. Пересчет стилей, Layout и саму отрисовку (Presentation delay)
Хороший INP - это меньше 200 мс. Причем берется не среднее значение, а один из худших результатов за сессию (98-й перцентиль).
🛠 Как спасать INP (Senior level):
1. Разбивайте Long Tasks (Yield to Main Thread)
Не заставляйте браузер делать всю тяжелую работу за один присест. Дайте ему возможность «вздохнуть» и отрисовать кадр. В современных браузерах для этого внедряется
2. Используйте
Если клик вызывает обновление состояния, которое требует тяжелого рендера (например, фильтрация большого списка), React может заблокировать отрисовку того же чекбокса, на который вы нажали.
Оберните тяжелое обновление стейта в
3. Избегайте Layout Thrashing
Если в обработчике клика вы сначала читаете размеры элемента (
CodeBase | Frontend | #js
First Input Delay (FID) официально ушел на пенсию в марте 2024 года. На его место пришел INP (Interaction to Next Paint). Если вы всё еще оптимизируете старую метрику, самое время пересмотреть свои подходы.
В чем был обман FID?
FID измерял только задержку (Input Delay) от клика до того момента, как браузер начал выполнять ваш обработчик событий.
Если ваша функция
onClick после старта зависала на 2 секунды, перебирая огромный массив, FID всё равно мог быть идеальным (например, 3 мс), хотя пользователь видел намертво зависший интерфейс.Что измеряет INP?
INP фиксирует всё время до появления визуального отклика на экране:
1. Ожидание освобождения Main Thread (Input delay)
2. Выполнение вашего JS-кода (Processing time)
3. Пересчет стилей, Layout и саму отрисовку (Presentation delay)
Хороший INP - это меньше 200 мс. Причем берется не среднее значение, а один из худших результатов за сессию (98-й перцентиль).
🛠 Как спасать INP (Senior level):
1. Разбивайте Long Tasks (Yield to Main Thread)
Не заставляйте браузер делать всю тяжелую работу за один присест. Дайте ему возможность «вздохнуть» и отрисовать кадр. В современных браузерах для этого внедряется
scheduler.yield().
async function handleHeavyClick() {
// 1. Показываем лоадер (синхронно, легко)
showSpinner();
// 2. Отдаем управление браузеру, чтобы он успел отрисовать лоадер!
// Если scheduler.yield недоступен, используем await new Promise(r => setTimeout(r, 0))
if ('scheduler' in window && 'yield' in scheduler) {
await scheduler.yield();
} else {
await new Promise(resolve => setTimeout(resolve, 0));
}
// 3. Теперь делаем тяжелую работу
processHugeData();
}
2. Используйте
startTransition в React 18+Если клик вызывает обновление состояния, которое требует тяжелого рендера (например, фильтрация большого списка), React может заблокировать отрисовку того же чекбокса, на который вы нажали.
Оберните тяжелое обновление стейта в
startTransition - React пометит его как низкоприоритетное и не будет блокировать UI.3. Избегайте Layout Thrashing
Если в обработчике клика вы сначала читаете размеры элемента (
el.offsetHeight), а потом меняете классы, вы заставляете браузер синхронно пересчитывать стили (Forced Synchronous Layout). Это убивает фазу Presentation Delay. Сначала читайте, потом пишите!CodeBase | Frontend | #js
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Conform - это потрясающе
- Валидация клиента + сервера из одной схемы Zod
- Прогрессивное улучшение
- Восхитительно простой API
- Работает с Next.js ( server actions + useFormState)
CodeBase | Frontend | #animate
- Валидация клиента + сервера из одной схемы Zod
- Прогрессивное улучшение
- Восхитительно простой API
- Работает с Next.js ( server actions + useFormState)
CodeBase | Frontend | #animate
👍2
Как работает SVG ViewBox
Данная статья с интерактивными примерами поясняет, как применять атрибут viewBox в SVG.
Raster vs. Vector
Render Image
Inline SVG
Coordinates
View Box
Pan & Zoom
Zoom to Square
Animate
React Spring
Scaling Stroke
Use Case
https://svg.bradwoods.io/lessons/viewbox
CodeBase | Frontend | #animate
Данная статья с интерактивными примерами поясняет, как применять атрибут viewBox в SVG.
Raster vs. Vector
Render Image
Inline SVG
Coordinates
View Box
Pan & Zoom
Zoom to Square
Animate
React Spring
Scaling Stroke
Use Case
https://svg.bradwoods.io/lessons/viewbox
CodeBase | Frontend | #animate
👍2