Как создавать независимые компоненты без конфликтов CSS-переменных?
В больших проектах часто используют глобальные переменные:
:root {
--color: blue;
}
Но потом один компонент случайно меняет значение, и стили начинают влиять друг на друга.
CSS позволяет делать локальные токены прямо внутри компонента.
.card {
--color: #222;
color: var(--color);
}
Теперь переменная действует только внутри .card и его потомков.
Можно создавать полностью изолированные темы компонентов.
.dark-card {
--bg: #111;
--text: white;
}
Внутренние элементы автоматически получают эти значения:
.title {
color: var(--text);
}
Без дополнительных классов и дублирования.
Особенно удобно для:
.theme,
.component,
.widget
где каждый блок должен иметь свои настройки.
🔥 Локальные CSS custom properties позволяют строить компонентные дизайн-системы без огромного количества модификаторов и переопределений.
📣 Code Ready | #совет
В больших проектах часто используют глобальные переменные:
:root {
--color: blue;
}
Но потом один компонент случайно меняет значение, и стили начинают влиять друг на друга.
CSS позволяет делать локальные токены прямо внутри компонента.
.card {
--color: #222;
color: var(--color);
}
Теперь переменная действует только внутри .card и его потомков.
Можно создавать полностью изолированные темы компонентов.
.dark-card {
--bg: #111;
--text: white;
}
Внутренние элементы автоматически получают эти значения:
.title {
color: var(--text);
}
Без дополнительных классов и дублирования.
Особенно удобно для:
.theme,
.component,
.widget
где каждый блок должен иметь свои настройки.
🔥 Локальные CSS custom properties позволяют строить компонентные дизайн-системы без огромного количества модификаторов и переопределений.
📣 Code Ready | #совет
This media is not supported in your browser
VIEW IN TELEGRAM
📰 RSS Daily Digest — 20 июля
За последние 24ч собрал 26 материалов:
───
🤖 AI / Local LLM
• Qwen 3.8 on the way — новые модели от Alibaba Reddit
• Kimi drama — народ скупает модели на фоне политической напряжённости Reddit
• HuggingFace security incident — интересный репортаж о взломе Reddit
• When Chinese models surpass US? — дискуссия о будущем Reddit
🔧 Tech
• LoRA Speedrun — публичный лидерборд для fine-tuning техник GitHub
• Orion Browser — новый браузер от Kagi orionbrowser.com
• Claude Code now uses Bun written in Rust — любопытный технический апдейт Simon Willison
• Moonshine — стриминг игр через ESP32 GitHub
• $120k bowling system → $1600 ESP32s HN
📰 Новости
• Netflix заплатила $587M за AI-киностудию Бена Аффлека TechCrunch
• Apple судится с OpenAI — чем это грозит hardware-планам? TechCrunch
• Нолан назвал AI "троянским конём" TechCrunch
• Nonprofit Current AI — строят "World Wide Web of AI" бесплатно TechCrunch
☕ Java
• Java Weekly #655 — свежий выпуск от Baeldung
───
Planet Python не ответил (timeout)
За последние 24ч собрал 26 материалов:
───
🤖 AI / Local LLM
• Qwen 3.8 on the way — новые модели от Alibaba Reddit
• Kimi drama — народ скупает модели на фоне политической напряжённости Reddit
• HuggingFace security incident — интересный репортаж о взломе Reddit
• When Chinese models surpass US? — дискуссия о будущем Reddit
🔧 Tech
• LoRA Speedrun — публичный лидерборд для fine-tuning техник GitHub
• Orion Browser — новый браузер от Kagi orionbrowser.com
• Claude Code now uses Bun written in Rust — любопытный технический апдейт Simon Willison
• Moonshine — стриминг игр через ESP32 GitHub
• $120k bowling system → $1600 ESP32s HN
📰 Новости
• Netflix заплатила $587M за AI-киностудию Бена Аффлека TechCrunch
• Apple судится с OpenAI — чем это грозит hardware-планам? TechCrunch
• Нолан назвал AI "троянским конём" TechCrunch
• Nonprofit Current AI — строят "World Wide Web of AI" бесплатно TechCrunch
☕ Java
• Java Weekly #655 — свежий выпуск от Baeldung
───
Planet Python не ответил (timeout)
Reddit
From the LocalLLaMA community on Reddit: Prepare your (v)ram - Qwen3.8 is coming!
Explore this post and more from the LocalLLaMA community
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ Frontend Handbook — большая база знаний по frontend-разработке!
Здесь собраны статьи, документация, шпаргалки, инструменты и другие ресурсы по HTML, CSS, JavaScript, TypeScript, React и многим другим технологиям. Особенно удобно, что информация хорошо структурирована, поэтому можно быстро найти нужную тему.
Оставляю ссылочку: GitHub 📱
📣 Code Ready | #репозиторий
Здесь собраны статьи, документация, шпаргалки, инструменты и другие ресурсы по HTML, CSS, JavaScript, TypeScript, React и многим другим технологиям. Особенно удобно, что информация хорошо структурирована, поэтому можно быстро найти нужную тему.
Оставляю ссылочку: GitHub 📱
📣 Code Ready | #репозиторий
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
💻 Auto-Py-To-Exe — удобная графическая оболочка, которая помогает собрать готовое Windows-приложение прямо из Python-проекта.
💬 Конвертирует .py в .exe с использованием PyInstaller.
💬 Позволяет выбрать режим сборки:
* однофайловое приложение;
* папка с файлами.
💬 Добавляет иконку, дополнительные файлы и ресурсы без ручного редактирования параметров.
💬 Настраивает параметры сборки через понятный графический интерфейс.
💬 Поддерживает дополнительные аргументы PyInstaller для более тонкой настройки.
💬 После настройки может сгенерировать готовую команду PyInstaller — удобно для автоматизации и CI/CD.
⚙️ Простая установка:
pip install auto-py-to-exe
▶️ Запуск:
auto-py-to-exe
Откроется локальный веб-интерфейс, где можно выбрать скрипт, настроить параметры и собрать готовый .exe буквально за несколько минут.
💻 Отличный инструмент для разработчиков, которые хотят быстро распространять свои Python-приложения среди пользователей без установленного Python.
♎️...
Перейти на оригинальный пост
💬 Конвертирует .py в .exe с использованием PyInstaller.
💬 Позволяет выбрать режим сборки:
* однофайловое приложение;
* папка с файлами.
💬 Добавляет иконку, дополнительные файлы и ресурсы без ручного редактирования параметров.
💬 Настраивает параметры сборки через понятный графический интерфейс.
💬 Поддерживает дополнительные аргументы PyInstaller для более тонкой настройки.
💬 После настройки может сгенерировать готовую команду PyInstaller — удобно для автоматизации и CI/CD.
⚙️ Простая установка:
pip install auto-py-to-exe
▶️ Запуск:
auto-py-to-exe
Откроется локальный веб-интерфейс, где можно выбрать скрипт, настроить параметры и собрать готовый .exe буквально за несколько минут.
💻 Отличный инструмент для разработчиков, которые хотят быстро распространять свои Python-приложения среди пользователей без установленного Python.
♎️...
Перейти на оригинальный пост
This media is not supported in your browser
VIEW IN TELEGRAM
🌟 Молодость официально продлили с 18 до 45 лет — такую возрастную классификацию представила ВОЗ
По новым правилам людьми молодого возраста считаются все от 18 до 44 лет, а средний возраст длится с 45 до 59 лет.
С добрым утром! Слыш, работать 😕
По новым правилам людьми молодого возраста считаются все от 18 до 44 лет, а средний возраст длится с 45 до 59 лет.
С добрым утром! Слыш, работать 😕
Как получить оффер в Яндекс, Сбер, МТС и другие крутые компании?
Кто-то без всякой драмы проходит собесы и уходит в Яндекс, VK или на валютную удалёнку. В сильные и амбициозные команды.
А у кого-то зарплата не растёт, который год, задачи одни и те же неделя за неделей, календарь забит созвонами, от которых ничего не меняется.
Отклики на вакансии, а в ответ — тишина или очередная noname контора. На собесах вообще нигде не встречающаяся техничка((
👋 Привет, меня зовут Тихон, я действующий Frontend-разработчик и ментор. За руку довожу до оффера в Big Tech и остаюсь рядом на испытательном сроке.
Из своих учеников собрал комьюнити, в котором уже больше 220 frontend-разработчиков 🫂
В их жизни больше нет бесконечных скучных созвонов, безуспешных откликов на вакансии, странноватых собесов с вопросами словно ты на олимпиаде.
У меня есть канал, где я:
👉 Показываю, как пройти HR-фильтр и превратить отклики в реальные приглашения
👉 Помогаю найти мотивацию и разбираюсь с...
Перейти на оригинальный пост
Кто-то без всякой драмы проходит собесы и уходит в Яндекс, VK или на валютную удалёнку. В сильные и амбициозные команды.
А у кого-то зарплата не растёт, который год, задачи одни и те же неделя за неделей, календарь забит созвонами, от которых ничего не меняется.
Отклики на вакансии, а в ответ — тишина или очередная noname контора. На собесах вообще нигде не встречающаяся техничка((
👋 Привет, меня зовут Тихон, я действующий Frontend-разработчик и ментор. За руку довожу до оффера в Big Tech и остаюсь рядом на испытательном сроке.
Из своих учеников собрал комьюнити, в котором уже больше 220 frontend-разработчиков 🫂
В их жизни больше нет бесконечных скучных созвонов, безуспешных откликов на вакансии, странноватых собесов с вопросами словно ты на олимпиаде.
У меня есть канал, где я:
👉 Показываю, как пройти HR-фильтр и превратить отклики в реальные приглашения
👉 Помогаю найти мотивацию и разбираюсь с...
Перейти на оригинальный пост
This media is not supported in your browser
VIEW IN TELEGRAM
😱 Круче кошелька вы точно не видели...
Shut Up & Take My Money! 😎
Shut Up & Take My Money! 😎
This media is not supported in your browser
VIEW IN TELEGRAM
💾 Check Micro Animation – анимация со звуком, при которой чекбокс заполняется градиентом и появляются дополнительные элементы вокруг.
Сайтодел | #сниппет #css
Сайтодел | #сниппет #css
✍️ Anton – адаптация традиционного рекламного шрифта без засечек для экранов цифровых устройств. Пример можно увидеть в сниппете Template Plants Animated
Сайтодел | #шрифт
Сайтодел | #шрифт
🎨 Цветовая палитра макета "Fitness Mobile Ios App"
⚠️ Цвет копируется одним кликом!
Сайтодел | #палитра
HEX | RGB #F9F3E4 | rgb(249,243,228)
#F8C06D | rgb(248,192,109) #3B867F | rgb(59,134,127)⚠️ Цвет копируется одним кликом!
Сайтодел | #палитра
This media is not supported in your browser
VIEW IN TELEGRAM
💾 Check Micro Animation – чекбокс с анимацией при нажатии. Элемент имеет градиентную заливку, которая заполняет всю его площадь в активном состоянии.
Сайтодел | #сниппет #css
Сайтодел | #сниппет #css
CSS.escape() — экранирование динамических значений для CSS-селекторов!
При работе с DOM часто приходится искать элементы по динамическим значениям:
Поэтому если часть селектора формируется динамически, нужно учитывать правила синтаксиса CSS. Например:
const id = "user:123";
const element = document.querySelector(
`#${id}`
);
После подстановки браузер получает:
#user:123
На первый взгляд кажется, что мы ищем элемент с
Но для CSS символ
:hover
:focus
:checked
Поэтому CSS-парсер воспринимает
Для таких случаев существует стандартный метод
const id = "user:123";
const element = document.querySelector(
`#${CSS.escape(id)}`
);
Теперь значение будет преобразовано в корректный CSS-идентификатор:
#user\:123
Браузер понимает, что
CSS имеет множество специальных символов, которые могут изменить смысл селектора:
const id = "product.item#42";
const element = document.querySelector(
`#${CSS.escape(id)}`
);
Без экранирования символы
То же самое относится к динамическим классам:
const className = "theme:dark";
const element = document.querySelector(
`.${CSS.escape(className)}`
);
CSS.escape("hello world");
// "hello\ world"
CSS.escape("item.value");
// "item\.value"
CSS.escape("a:b");
// "a\:b"
До появления этого метода часто использовали ручное экранирование:
value.replace(/:/g, "\\:");
Но такой подход быстро становится неудобным. CSS имеет много специальных случаев: разные символы, пробелы, цифры в начале идентификаторов и другие правила.
Использовать его стоит в местах, где динамическое значение становится частью CSS-селектора:
document.querySelector()
document.querySelectorAll()
element.matches()
element.closest()
Важный момент:
Он решает только задачу корректного экранирования значения для CSS-селектора. Например:
element.innerHTML = value;
— это уже другая область: HTML и потенциальные XSS-риски. Там используются другие механизмы защиты. Если вы работаете с динамическими id, классами или значениями, которые приходят извне (например, из API),
🔥
📣 Code Ready | #практика
При работе с DOM часто приходится искать элементы по динамическим значениям:
id, class, значениям атрибутов. И здесь есть один важный момент: querySelector() и querySelectorAll() принимают не просто строки, а полноценные CSS-селекторы.Поэтому если часть селектора формируется динамически, нужно учитывать правила синтаксиса CSS. Например:
const id = "user:123";
const element = document.querySelector(
`#${id}`
);
После подстановки браузер получает:
#user:123
На первый взгляд кажется, что мы ищем элемент с
id="user:123".Но для CSS символ
: имеет специальное значение. Он используется для псевдоклассов::hover
:focus
:checked
Поэтому CSS-парсер воспринимает
: не как часть значения, а как элемент синтаксиса селектора.Для таких случаев существует стандартный метод
CSS.escape():const id = "user:123";
const element = document.querySelector(
`#${CSS.escape(id)}`
);
Теперь значение будет преобразовано в корректный CSS-идентификатор:
#user\:123
Браузер понимает, что
: является частью значения, а не специальной конструкцией CSS. Такая проблема возникает не только с двоеточием.CSS имеет множество специальных символов, которые могут изменить смысл селектора:
const id = "product.item#42";
const element = document.querySelector(
`#${CSS.escape(id)}`
);
Без экранирования символы
., # и другие будут интерпретироваться как часть CSS-селектора.То же самое относится к динамическим классам:
const className = "theme:dark";
const element = document.querySelector(
`.${CSS.escape(className)}`
);
CSS.escape() работает согласно правилам CSS-идентификаторов и возвращает строку, которую можно использовать внутри селектора:CSS.escape("hello world");
// "hello\ world"
CSS.escape("item.value");
// "item\.value"
CSS.escape("a:b");
// "a\:b"
До появления этого метода часто использовали ручное экранирование:
value.replace(/:/g, "\\:");
Но такой подход быстро становится неудобным. CSS имеет много специальных случаев: разные символы, пробелы, цифры в начале идентификаторов и другие правила.
CSS.escape() переносит эту логику на стандартный API браузера.Использовать его стоит в местах, где динамическое значение становится частью CSS-селектора:
document.querySelector()
document.querySelectorAll()
element.matches()
element.closest()
Важный момент:
CSS.escape() не является механизмом защиты данных.Он решает только задачу корректного экранирования значения для CSS-селектора. Например:
element.innerHTML = value;
— это уже другая область: HTML и потенциальные XSS-риски. Там используются другие механизмы защиты. Если вы работаете с динамическими id, классами или значениями, которые приходят извне (например, из API),
CSS.escape() помогает избежать ошибок парсинга и сохранить ожидаемое поведение DOM API.🔥
CSS.escape() — хороший способ подготовить динамические значения перед использованием внутри CSS-селекторов.📣 Code Ready | #практика