Введение
Хотя CSS-подобных языков не так уж и много – на слуху и на плаву сейчас и вовсе одни Sass и Less, я все же начну с ответа на вопрос «А зачем нужен еще один?».
Если коротко, то TeaCSS не плодит новых сущностей, ведь этот тот же CSS, в который в качестве языка добавили JavaScript.
У этого подхода есть свои плюсы и минусы.
Плюсы – практически никаких подводных камней. Файл tea преобразуется в JavaScript, наполненный простыми командами вывода. Этот JavaScript можно отлаживать, смотреть в FireBug и вообще его поведение предсказуемо. В этом и состоит очевидность подхода, в вебе уже и так превалирует JS, поэтому вам не придется учить ничего нового.
Минусы – вы все-таки лишаетесь некоторых сущностей предметной области CSS, таких как «пиксели», «проценты» и т.п. Вы работаете с CSS именно как с текстом. Придется писать width:@{100+200}px, а не width: 100px + 200px.
TeaCSS – это именно шаблонизатор или препроцессор CSS, а не новый язык, который нужно учить. В этом его сила и слабость.
Я планировал написать несколько статей, в которых с нарастающей сложностью будет рассказываться про язык и те задачи, для которых он был разработан.
В этой (первой) статье, я расскажу по то, как включить TeaCSS в ваш цикл разработки и покажу с примерами то, что не умеют делать Sass и Less, но умеет герой сегодняшней статьи.
Короткий туториал
Для тех, кто пользуется Sass и Less, можно читать по диагонали.
Есть всего 3 простых вещи, который позволяют описать TeaCSS. Это:
- Внедренный яваскрипт
- Вложенные правила
- Миксины (необязательны и могут заменены на п.1 )
Внедренный яваскрипт
Во время процессинга CSS вы можете исполнить любой JS-код. Он будет исполнен ровно как написано. При помощи этого вы можете объявлять переменные, функции, делать циклы, чтоб объявить схожие правила, генерировать картинки, рисовать вспомогательные интерфейсы, да и вообще – делать что душе угодно.
Исполнять код просто:
/* однострочный код */ @ var baseColor = 'red';
Или так:
/* много строчек */ @{ var baseColor = ‘red’; var borderColor = darken(‘red’,20); }
Потом внутри любого CSS правила вы можете использовать JS-выражения.
Например:
body { color: @baseColor; } // для простых выражений, или /* со скобками @{} чтоб явно указать конец выражения */ body { color: @{lighten(baseColor,Math.sin(3.14)); }
Вложенные правила
Позволяют писать составные селекторы лесенкой.
/* TeaCSS */ #header { h1 { font-size: 26px; font-weight: bold; } p { font-size: 12px; a { text-decoration: none; &:hover { border-width: 1px } } } }
Миксины
Синтаксический сахар, похожи на LESS-овские. Позволяют сохранить набор правил для использования в другом контексте с параметрами.
.my_mixin(color) { // - это лишь сахар для my_mixin = function (color) { color: @color; } body { .my_mixin('red'); }
За более подробными объяснениями отсылаю на сайт – teacss.org
Как подключить к своему проекту
Очень важно понимать, что teacss не претендует на то, чтоб становится заменой CSS в продакшене, это именно решение для разработки, поэтому должен существовать как способ превращения TeaCSS в обычный CSS, так и способ посмотреть, что получается прямо в браузере.
Для просмотра все просто.
<link tea="style.tea"> <script src="teacss.js"></script>
И вуаля, вы увидите превью вашего стиля на текущей странице. В своих проектах я использую что-то вроде.
<? if $applicationMode=='development' ?> <link tea="style.tea"> <script src="teacss.js"></script> <? else ?> <link type="text/css" rel="stylesheet" href="style.css"> <? endif ?>
Остается вопрос, как превратить *.tea в *.css
В ранних версиях для этого была консольная утилита, но т.к. TeaCSS стал поддерживать различные чисто-браузерные фишки, вроде Canvas, то было решено оставить этот вопрос на откуп разработчику. Вы можете вывести простой интерфейс для сохранения файла и решить, что делать с полученным текстом. В целом это часть большой концепции «Ваш код – это и есть ваша IDE», о которой я расскажу в дальнейших статьях, а пока просто добавьте в дев-версию верстки что-то вроде:
<script> teacss.buildCallback(function(files){ $.post(location.href,{css:files['default.css']}); }); <? if (isset($_POST['css']) file_put_contents('your/location/style.css', $_POST['css']) ?> </script>
Аналогично, на других серверных языках (кстати, pull request-ы приветствуются).
Создание картинок на лету
Первый и единственный в этой статье фокус.
По сути, встроенный в teacss Canvas – это обертка над канвасом браузера, такая обертка, которая позволяет использовать WebGL и обычный двумерный контекст для генерирования изображений.
При переводе *.tea в *.css вы можете сохранить сгенерированную картинку в файл. Зачем это нужно?
Рассказывая о переменных в CSS и приводя примеры DRY подхода к разработке разработчики того же LESS лукавят. Не всякий дизайн можно сверстать чистым CSS, сайты, где это достижимо скорее в меньшинстве. Большая часть хитрых бордюров, фонов, шапок и т.п. тоже зависят от этих переменных (базовых цветов, например), поэтому после простой замены значения, вам нужно открывать Фотошоп и перерисовывать или изменять графику для сайта.
С teacss вы можете сделать графику параметрической тоже (пример из документации):
@ color1 = 'red'; @ color2 = 'blue'; body { @{ // pretty clear here, huh? var canvas = new Canvas("background.png"); canvas.replaceColors( { '#ffae00':color1, '#f7e7ba':lighten(color1,30), '#705551':color2 }); // display canvas.background('bg.png'); } }
Для более полного понимания принципу покажу генерацию фона с 0. Например, полосатого фона. Кстати, можно оформить как миксин и потом использовать в последующих проектах.
.background_striped(size,width,color) { @{ (new Canvas(size,size)) .draw2D(function(ctx){ ctx.beginPath(); ctx.lineWidth = width; ctx.strokeStyle = color.toString(); ctx.moveTo(-size,-size); ctx.lineTo(size*2,size*2); ctx.moveTo(-size-size,-size); ctx.lineTo(size,size*2); ctx.moveTo(-size+size,-size); ctx.lineTo(size*3,size*2); ctx.stroke(); }) .background(); } }
И вот пример использования:
teacss.org/stripes.htm
Заключение
Как, наверное, стало понятно из предыдущего раздела, teacss – это не совсем шаблонизатор CSS т.к. выдает на выход, например, еще и картинки. Скажу больше, его можно использовать как универсальный шаблонизатор и генерировать им мобильные интерфейсы, шаблоны и скрипты.
Как раз про это и про архитектуру самого проекта я расскажу в следующей статье.
P.S.
Я решил написать эту статью т.к. по сути делаю вещи очень похожие одновременно на последний проект Adobe — Brackets и на кикстартеровский Light-table. Но есть несколько отличий и мне кажется, что они могут быть ключевыми, чтоб рассказать про них, нужно начать с библиотеки, которая лежит в основе проекта — teacss. Надеюсь найти на хабре единомышленников и помощников/партнеров этот самый большой проект.