За последние несколько месяцев я использовал Tailwind для некоторых проектов, не связанных с ExtJS. Tailwind — это фреймворк, сильно отличающийся от Bootstrap или подобных продуктов. Фактически, он использует подход «utility-first» (полезность прежде всего), где классы CSS связаны с функциональными возможностями, а не с компонентами. Основной его плюс в том, что при разработке приложения вам не нужно иметь дело с CSS и беспокоиться о том, как переопределить 20 селекторов, которые вы писали 2 года назад.
Читать далее: ExtJS and Tailwind CSSКак работает Tailwind CSS
Чтобы попытаться немного прояснить концепцию, я воспользуюсь тем же примером с официального сайта. Давайте рассмотрим этот компонент:

Без Tailwind, нам пришлось бы использовать такой код:
<div class="chat-notification">
<div class="chat-notification-logo-wrapper">
<img class="chat-notification-logo" src="/img/logo.svg" alt="ChitChat Logo">
</div>
<div class="chat-notification-content">
<h4 class="chat-notification-title">ChitChat</h4>
<p class="chat-notification-message">You have a new message!</p>
</div>
</div>
<style>
.chat-notification {
display: flex;
align-items: center;
max-width: 24rem;
margin: 0 auto;
padding: 1.5rem;
border-radius: 0.5rem;
background-color: #fff;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
.chat-notification-logo-wrapper {
flex-shrink: 0;
}
.chat-notification-logo {
height: 3rem;
width: 3rem;
}
.chat-notification-content {
margin-left: 1.5rem;
}
.chat-notification-title {
color: #1a202c;
font-size: 1.25rem;
line-height: 1.25;
}
.chat-notification-message {
color: #718096;
font-size: 1rem;
line-height: 1.5;
}
</style>
Однако с Tailwind колличество кода сократиться до:
<div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-lg flex items-center space-x-4">
<div class="shrink-0">
<img class="size-12" src="/img/logo.svg" alt="ChitChat Logo">
</div>
<div>
<div class="text-xl font-medium text-black">ChitChat</div>
<p class="text-slate-500">You have a new message!</p>
</div>
</div>
Целью этой статьи не является вдаваться в подробности работы Tailwind, но даже на первый взгляд мы видим разницу в размере кода, а также ряд «странны» CSS-классов.
Лично я привык давать классам имена, которые помогают мне понять их значение (кнопка, карточка, ячейка, столбец, …), и это, безусловно, облегчает чтение HTML-кода. В некотором смысле, это похоже на добавление комментариев к коду. Вместо этого, с Tailwind, классы ссылаются на один конкретный аспект, назначаемый HTML-тегам. Но для каждого тега часто необходимо вставить более одного класса, что делает подобный подход особенно сложным.
Большим преимуществом является то, что вы практически больше не пишете CSS и используете классы Tailwind. Таким образом, помимо того, что вы не тратите время на придумывание имен классов, часто даже странных (item-inner-column-wrapper и т. д.), вы используете соглашения, которые помогают быть CSS в вашем приложении более однородным.
Так же, Tailwind имеет целый ряд интересных возможностей для поддержки адаптивных сайтов, создания пользовательских тем, темного режима, множества плагинов и многого другого. Для этого обратитесь к официальному руководству.
Tailwind и ExtJS
В процессе разработки на ExtJS я заметил, что пишу сложные шаблоны с классами CSS и множеством стилей, и я понял, что скучаю по Tailwind. Давайте рассмотрим пример:
items: [{
xtype: 'list',
itemTpl:
'<div class="list-item">' +
'<div class="item-icon {iconCls}"></div>' +
'<div class="list-item-data">' +
'<div class="list-item-name">{name}</div>' +
'<div class="list-item-detail">{detail}</div>' +
'</div>' +
'</div>'
}]
.list-item {
display: flex;
align-items: center;
padding: 4px;
}
.list-item-data {
display: flex;
flex-direction: column;
}
.list-item-name {
font-size: 18px;
}
.list-item-detail {
font-style: italic;
}
С Tailwind достаточно следующего кода, даже не без CSS:
items: [{
xtype: 'list',
itemTpl:
'<div class="flex items-center p-1">' +
'<div class="item-icon {iconCls}"></div>' +
'<div class="flex flex-col">' +
'<div class="text-lg">{name}</div>' +
'<div class="italic">{detail}</div>' +
'</div>' +
'</div>'
}]
Конфигурирование и установка
Использовать Tailwind с ExtJS довольно просто, потому что в конечном итоге движок сканирует весь наш код в поисках классов Tailwind (flex, grid, text-lg, p-1, p-2 и т. д.) и генерирует CSS-файл, содержащий только те классы, которые вы использовали. Если вы используете Open Tooling на основе npm, вы можете следовать руководству по установке Tailwind. В противном случае, если вы используете SenchaCmd, самое простое, что можно сделать, это загрузить CLI отсюда.
Установив этот CLI, вы можете инициализировать Tailwind, перейдя в корневой каталог вашего проекта и написав:
# Create a tailwind.config.js file ./tailwindcss init
Это создаст файл tailwind.config.js. Я изменил его следующим образом, но, конечно, это зависит от вашего приложения:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./app/**/*.{html,js}','./index.html'],
// Remove all corePlugins
corePlugins: {
preflight: false,
},
// Remove all preset
//presets: [],
theme: {
extend: {
boxShadow: {
'outline': '2px 2px 8px 0 rgba(0, 0, 0, 0.4)',
}
},
},
plugins: [],
};
Опция content является самой важной, в ней вы должны определить каталоги, которые Tailwind будет сканировать для поиска классов CSS. С помощью конфигурации corePlugins и plugins я удалил все плагины, чтобы сгенерировать минимальный CSS. Так же, я добавил свойство в theme, чтобы сгенерировать новый класс shadow-outline с нужным значением. Если хотите, вы можете удалить стандартные пресеты (presets), но тогда некоторые классы не будут работать.
Затем мы используем CLI для генерации классов:
tailwindcss -o sass\src\tailwind.css --watch
С помощью этой команды Tailwind будет постоянно проверять файлы, указанные в конфигурации, и генерировать классы в файле sass\src\tailwind.css. Наконец, нам нужно указать ExtJS использовать этот файл CSS. Нам нужно изменить конфигурацию приложения в разделе scss файла манифесте приложения app.json:
"sass": {
...
"src": [
"sass/src",
"sass/src/tailwind.css"
]
...
}
При желании вы можете автоматизировать создание CSS во время production сборки, добавив следующий код в файл build.xml:
<target name="-before-build">
<if>
<equals arg1="production" arg2="${build.environment}"/>
<then>
<x-echo message="Build CSS with Tailwind"/>
<exec executable="tailwindcss">
<arg value="-o"/>
<arg value="sass\src\tailwind.css"/>
</exec>
</then>
</if>
</target>