Пишу про frontend (JS/TS/React), задачки с собесов с разбором и теория, советую книжки и многое другое 🤭
Contact: @atrapeznikov
Post #440
954

Ну с выходом opus 4.8, точно нет 🥵
- 😁 15
- 🌚 2
- 👀 2
- 🙊 1
📝 @frontend_tales


# Install Pake CLI
pnpm install -g pake-cli
# Basic usage - automatically fetches website icon
pake https://github.com --name GitHub
# Advanced usage with custom options
pake https://weekly.tw93.fun --name Weekly --icon https://cdn.tw93.fun/pake/weekly.icns --width 1200 --height 800 --hide-title-bar




@tanstack/*, которые были доступны около 20 минут, пока они не были обнаружены.npm install вчера и у вас есть в проекте @tanstack/* - у вас возможно есть эти вредоносные пакеты...pull_request_target в GitHub Actions, чтобы отравить общий pnpm-кэш кастомным payload.~/.npmrc. Всё, до чего можно дотянуться с заражённого хоста~/.local/bin/gh-token-monitor.sh устанавливался как systemd-сервис (Linux) или LaunchAgent (macOS) и каждые 60 секунд проверял api.github.com/user с украденным токеном. Если пользователь отзывал токен - срабатывал rm -rf ~/. 
Please keep in mind that PocketBase is still under active development and full backward compatibility is not guaranteed before reaching v1.0.0. PocketBase is NOT recommended for production critical applications yet, unless you are fine with reading the changelog and applying some manual migration steps from time to time.


<video> задаёт изображение-заставку, которое показывается до начала воспроизведения видео. Это как обложка у книги - первое, что видит пользователь.<video src="movie.mp4" poster="preview.jpg" controls>
Ваш браузер не поддерживает видео.
</video>
<video
width="800"
height="450"
poster="/images/preview.webp"
controls
preload="metadata">
<source src="video.webm" type="video/webm">
<source src="video.mp4" type="video/mp4">
</video>
Здесь preload="metadata" в паре с poster - хорошая комбинация: браузер не качает само видео заранее, но сразу показывает красивую заставку.
Intl.ListFormat - это встроенный JavaScript API для форматирования списков на естественном языке. Вместо ручной склейки строк через запятые и союзы, он делает это автоматически, учитывая правила конкретного языка.new Intl.ListFormat(locale, options)
options принимает два ключевых параметра:type — тип списка: "conjunction" (и), "disjunction" (или), "unit" (просто перечисление)style — стиль: "long", "short", "narrow"const items = ['Яблоко', 'Банан', 'Вишня'];
// Союз «и» (conjunction) — по умолчанию
const conjRu = new Intl.ListFormat('ru', { type: 'conjunction' });
conjRu.format(items);
// → "Яблоко, Банан и Вишня"
// Союз «или» (disjunction)
const disjRu = new Intl.ListFormat('ru', { type: 'disjunction' });
disjRu.format(items);
// → "Яблоко, Банан или Вишня"
// Простое перечисление (unit)
const unitRu = new Intl.ListFormat('ru', { type: 'unit', style: 'narrow' });
unitRu.format(items);
// → "Яблоко Банан Вишня"
// Английский для сравнения
const conjEn = new Intl.ListFormat('en', { type: 'conjunction' });
conjEn.format(['Apple', 'Banana', 'Cherry']);
// → "Apple, Banana, and Cherry"
formatToParts - возвращает массив объектов, если нужен контроль над каждой частью:const fmt = new Intl.ListFormat('ru', { type: 'conjunction' });
fmt.formatToParts(['Кот', 'Пёс', 'Хомяк']);
// → [
// { type: 'element', value: 'Кот' },
// { type: 'literal', value: ', ' },
// { type: 'element', value: 'Пёс' },
// { type: 'literal', value: ' и ' },
// { type: 'element', value: 'Хомяк' }
// ]Это удобно, например, когда нужно обернуть каждый элемент в <span> с отдельным стилем.
function formatAuthors(authors, locale = 'ru') {
if (authors.length === 0) return 'Автор неизвестен';
return new Intl.ListFormat(locale, {
style: 'long',
type: 'conjunction',
}).format(authors);
}
formatAuthors(['Толстой', 'Достоевский']);
// → "Толстой и Достоевский"
formatAuthors(['Толстой', 'Достоевский', 'Чехов']);
// → "Толстой, Достоевский и Чехов"