TeaCSS – очевидный подход к созданию стилей

в 23:27, , рубрики: css, html, javascript, javascript library, less, sass, Веб-разработка, велосипед на ракетном топливе, метки: , , , , ,

Введение

Хотя 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. Внедренный яваскрипт
  2. Вложенные правила
  3. Миксины (необязательны и могут заменены на п.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. Надеюсь найти на хабре единомышленников и помощников/партнеров этот самый большой проект.

Автор: boomyjee

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js