<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Пепелсбей.net</title>
	<atom:link href="http://pepelsbey.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://pepelsbey.net</link>
	<description></description>
	<lastBuildDate>Tue, 26 Jan 2010 00:17:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Вечная бета</title>
		<link>http://pepelsbey.net/2010/01/eternal-beta/</link>
		<comments>http://pepelsbey.net/2010/01/eternal-beta/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 13:56:21 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=477</guid>
		<description><![CDATA[Когда коду сайта исполняется полтора года, а дизайну целых два, то становится как-то совсем неудобно. Нет&#160;— всё работает, живёт и периодически даже патчится, но жизнь требует чего-то нового. Поэтому ещё в августе прошлого года была начата разработка новой версии этого сайта. Было решено не только сделать новый дизайн и подновить код, но и сильно упростить [...]]]></description>
			<content:encoded><![CDATA[<p>Когда коду сайта исполняется <a href="http://pepelsbey.net/2008/11/like-a-virgin/">полтора года</a>, а дизайну <a href="http://pepelsbey.net/2008/02/second-breath/">целых два</a>, то становится как-то совсем неудобно. Нет&nbsp;— всё работает, живёт и периодически даже патчится, но жизнь требует чего-то нового. Поэтому ещё в августе прошлого года была начата разработка новой версии этого сайта. Было решено не только сделать новый дизайн и подновить код, но и сильно упростить архитектуру сайта, раз уж изначальная задумка с заметками и статьями, по сути, провалилась.</p>

<h2>Архитектура</h2>

<p>После продолжительной агонии, с сайта исчезли рубрики и теперь существует всего одна главная витрина с последним постом и списком всех публикаций, спрятанным в разворачивающуюся гармошку. Основным средством для поиска предыдущих публикаций стала вспомогательная страница «<a href="http://pepelsbey.net/search/">Поиск</a>», которая содержит упомянутый выше архив публикаций и форму поиска&nbsp;— пока силами Яндекса, но потом, возможно, появится возможность выбирать и&nbsp;Google.</p>

<p>Меньше всего изменений пришлось на страницу «<a href="http://pepelsbey.net/author/">Об авторе</a>», на которой добавилось несколько социальных сервисов и рабочий e-mail.</p>

<h2>Дизайн</h2>

<p>Главной задачей для нового дизайна было отказаться от белых коробок и инверсного текста, оставив прежнюю цветовую гамму. При этом, хотелось подчеркнуть простоту архитектуры, убрав ненужную колонку. Получилось или нет&nbsp;— увидим в комментариях к записи…</p>

<h2>Технологии</h2>

<p>Как бы это ни было сложно, но HTML-код сайта старается соответствовать <a href="http://dev.w3.org/html5/spec/spec">черновику спецификации HTML&nbsp;5</a>. Более того, пока даже получается <a href="http://html5.validator.nu/?doc=http://pepelsbey.net/">проходить валидацию</a>. И самое минимальное: отказ от <abbr title="Extensible Hypertext Markup Language">XHTML</abbr>, новый доктайп <code>&lt;!DOCTYPE HTML&gt;</code>, новая семантика языка <code>&lt;article&gt;</code>, <code>&lt;header&gt;</code>, <code>&lt;time&gt;</code>. По этой причине пока пользователи IE видят не самые приятные вещи, но почему так&nbsp;— чуть ниже.</p>

<p>Пересмотру подверглись некоторые элементы: фрагмент кода теперь состоит из элемента <code>&lt;pre&gt;</code> и <code>&lt;code&gt;</code>, по количеству строк:</p>

<pre><code>&lt;pre&gt;</code>
<code>    &lt;code&gt;&lt;/code&gt;</code>
<code>    &lt;code&gt;&lt;/code&gt;</code>
<code>&lt;pre&gt;</code></pre>

<p>…а уменьшенные версии картинок построены на элементе <code>&lt;figure&gt;</code>:</p>

<pre><code>&lt;figure&gt;</code>
<code>    &lt;dd&gt;&lt;img src="…" alt="Описание"&gt;&lt;/dd&gt;</code>
<code>    &lt;dt&gt;Описание&lt;/dt&gt;</code>
<code>&lt;figure&gt;</code></pre>

<p>На примеры использования таких картинок, а также работу новой версии <a href="http://pepelsbey.net/2009/02/darkbox-2/">Даркбокс</a>, можно взглянуть в заметке <a href="http://pepelsbey.net/2008/10/firefox-vs-photoshop/">Firefox против Photoshop</a>. Ну и конечно же CSS&nbsp;3: от пресловутых веб-шрифтов и <code>border-radius</code> до <code>transition</code>, из-за чего код местами распух от вендорных префиксов:</p>

<pre><code>-webkit-transition:background-color .2s linear;</code>
<code>-moz-transition:background-color .2s linear;</code>
<code>-o-transition:background-color .2s linear;</code>
<code>transition:background-color .2s linear;</code></pre>

<p>Также гораздо смелее стали использоваться селекторы: от простых <code>E &gt; E</code> и <code>E + E</code> до <code>E:first-of-type</code>. К сожалению, с некоторыми конструкциями не справляется даже IE8.</p>

<h2>Концепция</h2>

<p>Но самое главное, чего хотелось добиться всем этим редизайном и рекодингом — это создание, так называемой, вечной беты. Весьма популярная <em>вебдванольная</em> концепция, надо сказать. К примеру, сейчас сайт прилично работает исключительно в последних версиях браузеров. В тех, что пораньше — сносно. А если говорить про IE, то там творится форменное безумие, которое и предстоит поправить на одном из этапов развития вечной беты. И хотя из посетителей этого сайта на долю IE приходится всего <q>семь процентов людей и иных представителей человеческой расы</q>, доступность для чтения нужно обеспечить всем. Та же история с версией для печати, мобильных устройств и даже микроформатами. После каждого этапа в развитии — публикация. Думаю, это будет интересно.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2010/01/eternal-beta/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>Чай со спецэффектами</title>
		<link>http://pepelsbey.net/2009/12/special-effects-tea/</link>
		<comments>http://pepelsbey.net/2009/12/special-effects-tea/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 21:46:35 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=462</guid>
		<description><![CDATA[Как обычные люди готовят себе чай? Довольно просто: ставят чайник, находят чашку, закидывают пакетик или даже заливают заварку. Просто и безыскусно. Сегодня я&#160;расскажу вам, как готовят чай суровые&#160;верстальщики.

Для этого вам понадобятся следующие вещи: простой текстовый редактор и свежий браузер, вроде Firefox, Opera, Safari или Chrome. Чем свежее, тем лучше&#160;— хорошо бы даже ночную сборку или [...]]]></description>
			<content:encoded><![CDATA[<p>Как обычные люди готовят себе чай? Довольно просто: ставят чайник, находят чашку, закидывают пакетик или даже заливают заварку. Просто и безыскусно. Сегодня я&nbsp;расскажу вам, как готовят чай суровые&nbsp;верстальщики.</p>

<p>Для этого вам понадобятся следующие вещи: простой текстовый редактор и свежий браузер, вроде <a href="http://getfirefox.com/">Firefox</a>, <a href="http://opera.com/">Opera</a>, <a href="http://apple.com/safari/">Safari</a> или <a href="http://google.com/chrome/">Chrome</a>. Чем свежее, тем лучше&nbsp;— хорошо бы даже ночную сборку или какую-нибудь альфу.</p>

<h2>Готовим основу</h2>

<p>Для начала подготовим основу для нашего чаепития. На мой взгляд, прогрессивный HTML5-шаблон с&nbsp;простым доктайпом <code>&lt;!DOCTYPE HTML&gt;</code> подойдёт лучше всего:</p>

<pre><code>&lt;!DOCTYPE HTML&gt;</code>
<code>&lt;html lang="en-US"&gt;</code>
<code>&lt;head&gt;</code>
<code>    &lt;title&gt;Чай со спецэффектами&lt;/title&gt;</code>
<code>    &lt;meta charset="UTF-8"&gt;</code>
<code>&lt;/head&gt;</code>
<code>&lt;body&gt;</code>
<code>    …</code>
<code>&lt;/body&gt;</code>
<code>&lt;/html&gt;</code></pre>

<p>Обратите внимание на атрибут <code>lang</code> элемента <code>&lt;html&gt;</code>&nbsp;— мы собираемся заваривать английский чай с&nbsp;американским акцентом, и его значение как раз соответствует нашему замыслу: <code>en-US</code>. Дальше нам это ещё пригодится.</p>

<p>Теперь давайте отыщем подходящую чашку. Точнее, даже не&nbsp;отыщем, а&nbsp;тут же соберём из знакомых частей. Из чего мы можем составить обычную чашку чая? Как минимум, из самой чашки <code>cup</code> и блюдца <code>saucer</code>. Чашка состоит из сосуда <code>vessel</code> с&nbsp;ручкой <code>handle</code>, в&nbsp;который последовательно налиты чай <code>tea</code>, брошены два кусочка сахара <code>sugar</code>, по вкусу, а&nbsp;замыкается это всё донышком <code>bottom</code>. Так у нас и получилось:</p>

<pre><code>&lt;div class="cup"&gt;</code>
<code>    &lt;div class="vessel"&gt;</code>
<code>        &lt;div class="tea"&gt;</code>
<code>            &lt;div class="sugar"&gt;&lt;/div&gt;</code>
<code>            &lt;div class="sugar"&gt;&lt;/div&gt;</code>
<code>            &lt;div class="bottom"&gt;&lt;/div&gt;</code>
<code>        &lt;/div&gt;</code>
<code>    &lt;/div&gt;</code>
<code>    &lt;div class="handle"&gt;&lt;/div&gt;</code>
<code>&lt;/div&gt;</code>
<code>&lt;div class="saucer"&gt;&lt;/div&gt;</code></pre>

<p>Итак, основа для нашего чаепития готова, начинаем его рисовать.</p>

<h2>Раскрашиваем набросок</h2>

<p>Теперь отбросим все браузерные условности простым ластиком. Чай у&nbsp;нас незамысловатый, поэтому здесь подойдёт и <code>* { … }</code>. Для более сложных проектов всё же рекомендуется использовать <a href="http://meyerweb.com/eric/tools/css/reset/">reset.css</a></p>

<pre><code>* {</code>
<code>    padding:0;</code>
<code>    margin:0;</code>
<code>    }</code></pre>

<p>Наступает очередь воплотить все составные части нашего чая: позиционируем их по центру, правильно расставляем z-index, задаём размеры и цвет фона для каждого элемента. Вот как выглядит чашка:</p>

<pre><code>.cup {</code>
<code>    position:absolute;</code>
<code>    top:50%;</code>
<code>    left:50%;</code>
<code>    z-index:2;</code>
<code>    margin:-150px 0 0 -150px;</code>
<code>    width:300px;</code>
<code>    height:300px;</code>
<code>    }</code></pre>

<p>…и получаем <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/1.htm">пример №1</a>, он же <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/1.png" rel="darkbox">на картинке</a>.</p>

<p>Если вы остались довольны получившимся кубизмом&nbsp;— хорошо, значит вас устроит чаепитие даже в компании Internet Explorer. Те, кому этого мало, приглашаются дальше.</p>

<h2>Спиливаем лишнее</h2>

<p>И всё-таки, чашка должна быть круглой. Хотя бы для того, чтобы во время размешивания там не&nbsp;застревала чайная ложка. Давайте всё скруглим. После недавнего выхода <a href="http://labs.opera.com/news/2009/12/22/">альфа-версии Opera&nbsp;10.50</a> с&nbsp;широкой поддержкой модуля <a href="http://www.w3.org/TR/css3-background/">CSS Backgrounds and Borders Level 3</a> для этих целей мы вполне можем рассчитывать на свойство <code>border-radius</code>.</p>

<p>Скругляем блюдце: его ширина и высота равны 500-ам пикселам, значит для того, чтобы получить окружность, радиус скругления должен составлять половину ширины, т.е. 250 пикселов:</p>

<pre><code>.saucer {</code>
<code>    position:absolute;</code>
<code>    top:50%;</code>
<code>    left:50%;</code>
<code>    z-index:1;</code>
<code>    margin:-250px 0 0 -250px;</code>
<code>    width:500px;</code>
<code>    height:500px;</code>
<code>    -webkit-border-radius:250px;</code>
<code>    -moz-border-radius:250px;</code>
<code>    border-radius:250px;</code>
<code>    background:#FFF;</code>
<code>    }</code></pre>

<p>В данном случае компактное правило <code>border-radius:250px</code> задаёт радиус скругления всех четырёх углов, точно так же, как <code>margin:0</code> обнуляет поля со всех четырёх сторон элемента.</p>

<p>Обратите внимание на префиксы <code>-webkit</code> и <code>-moz</code>&nbsp;— они нужны браузерам на основе Webkit (Safari, Chrome) и Gecko (Firefox) для того, чтобы применить скругление. Последняя альфа браузера Opera обрабатывает свойство без префикса. Подобным же образом мы скругляем сосуд, чай и донышко. Ручку и подтаявшие кусочки сахара мы подтачиваем до скруглённых брусков.</p>

<p>И получаем <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/2.htm">пример №2</a>, он же <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/2.png" rel="darkbox">на картинке</a>.</p>

<p>И хорошо бы: всё скруглилось, встало на свои места. Так ведь и просилась бы чашка в&nbsp;руки, если бы не&nbsp;пугала своей плоской двухмерностью. Самое время добавить немного объёма.</p>

<h2>Надуваем чашку</h2>

<p>Будем честны, мы здесь не&nbsp;пытаемся заигрывать с&nbsp;<a href="http://www.whatwg.org/specs/web-apps/current-work/#the-canvas-element">Canvas</a>, поэтому объём у&nbsp;нас будет псевдо-трёхмерным. А много ли надо нам, жертвам квадратного и плоского веба? Берём в руки свойство <code>box-shadow</code> и вперёд:</p>

<pre><code>.vessel {</code>
<code>    -webkit-box-shadow:20px 20px 100px rgba(0,0,0,.8);</code>
<code>    -moz-box-shadow:20px 20px 100px rgba(0,0,0,.8);</code>
<code>    box-shadow:20px 20px 100px rgba(0,0,0,.8);</code>
<code>    }</code></pre>

<p>Свойство <code>box-shadow</code> конструируется просто: горизонтальное смещение тени, вертикальное, размер и цвет, который мы задаём в&nbsp;виде <code>rgba()</code>, чтобы последним значением указать полупрозрачность заливки. В&nbsp;случае с&nbsp;элементом <code>tea</code>, также используется ключевое слово <code>inset</code>, чтобы повернуть тень внутрь элемента.</p>

<p>И вот <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/3.htm">пример №3</a>, он же <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/3.jpg" rel="darkbox">на картинке</a>.</p>

<p>Ну, что&nbsp;— чай уже почти как настоящий. За исключением некоторых проблем: тени в&nbsp;браузерах на движке Webkit рассчитываются весьма загадочно (см. заметку <a href="http://pepelsbey.net/2008/10/firefox-vs-photoshop/">Firefox против Photoshop</a>), поэтому, в&nbsp;нашем случае, выглядят более жёстко. Также текущая версия Webkit в браузере Safari 4.0.4 пока не&nbsp;умеет применять ключевое слово <code>inset</code>, однако Chrome уже справляется.</p>

<p>Осталось только добавить в&nbsp;это чаепитие немного жизни.</p>

<h2>Художественный беспорядок</h2>

<p>Самая очевидная проблема нашей чашки&nbsp;— это отвалившаяся ручка и вставшие пирамидой кусочки сахара. Давайте разбросаем всё это по своим местам и попробуем размешать сахар. Поможет нам в этом свойство <code>transform</code> и методы <code>rotate()</code> и <code>translate()</code>, занимающиеся, соответственно, поворотом и перемещением элементов.</p>

<p>Обратите внимание, что для краткости в&nbsp;этой части примеры кода будут приводится без дублирования свойств с префиксами <code>-webkit</code>, <code>-moz</code> и <code>-o</code>. Полный код вы можете найти в примерах.</p>

<p>Для начала, вернём ручку ровно в&nbsp;центр чашки, изменив значение отрицательного поля, а потом применим <code>transform</code>: повернём на –145 градусов и сместим на 170 пикселов.</p>

<pre><code>.handle {</code>
<code>    margin:-20px 0 0 -45px;</code>
<code>    transform:rotate(-145deg) translate(170px,0);</code>
<code>    }</code></pre>

<p>Принимаемся за кубики: их у нас ровно два. Не&nbsp;знаю, как для вас, но для меня это оптимальное количество сахара. И нам нужно обратиться к&nbsp;каждому из кубиков, чтобы применить нужное смещение. Самым удачным способом будет посчитать их по порядку появления в&nbsp;чае, при помощи селектора <code>:nth-child()</code>:</p>

<pre><code>.sugar:nth-child(1) {</code>
<code>    transform:rotate(70deg) translate(-20px,20px);</code>
<code>    }</code>
<code>.sugar:nth-child(2) {</code>
<code>    transform:rotate(30deg) translate(35px,0);</code>
<code>    }</code></pre>

<p>Теперь всё на месте, и вроде бы можно пить чай, но сахар упорно не&nbsp;желает размешиваться. Значит, самое время встряхнуть его при помощи сочетания свойств <code>transform</code> и <code>transition</code>. Для начала мы задаём каждому кубику новое смещение, которое произойдёт при наведении на чашку: поворот на 1200 градусов и новые координаты.</p>

<pre><code>.cup:hover</code>
<code>.sugar:nth-child(1) {</code>
<code>    transform:rotate(1200deg) translate(-20px,20px);</code>
<code>    }</code></pre>

<p>А затем описываем сам процесс перемещения:</p>

<pre><code>.sugar {</code>
<code>    transition:transform 10s ease-out;</code>
<code>    }</code></pre>

<p>Синтаксис свойства <code>transition</code> простой: сначала идёт то свойство, которое мы собираемся изменять, потом время и тип ускорения, в&nbsp;нашем случае <code>ease-out</code>, что значит с&nbsp;замедлением. При наведении курсора на чашку <code>.cup:hover</code> сахар будет размешиваться по часовой стрелке, при отведении&nbsp;— в&nbsp;обратную сторону.</p>

<p>И вот <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/4.htm">пример №4</a>, он же <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/4.jpg" rel="darkbox">на картинке</a>.</p>

<p>Практически всё готово. Самые нетерпеливые могут браться за чай, остальные же приглашаются дальше — добавить разнообразия.</p>

<h2>Немного разнообразия</h2>

<p>Сколько людей, столько и вкусов. Поэтому давайте добавим нашему чаепитию возможность выбрать в какой традиции пить чай: в&nbsp;английской, русской или японской. Предлагаю сделать это наиболее адекватно, используя упомянутый выше атрибут <code>lang</code> элемента <code>&lt;html&gt;</code>. Для этого добавим возможность выбора:</p>

<pre><code>&lt;ul class="switcher"&gt;</code>
<code>    &lt;li lang="en-US" title="Английски"&gt;&lt;/li&gt;</code>
<code>    &lt;li lang="ru-RU" title="Русский"&gt;&lt;/li&gt;</code>
<code>    &lt;li lang="ja-JP" title="Японский"&gt;&lt;/li&gt;</code>
<code>&lt;/ul&gt;</code></pre>

<p>Каждый из пунктов нашего меню будет переключать атрибут <code>lang</code> на нужный язык при помощи нехитрого скрипта, навешивающего обработчики:</p>

<pre><code>function init() {</code>
<code>    var html = document.documentElement;</code>
<code>    var items = document.querySelectorAll('ul.switcher li');</code>
<code>    for(var i=0; i&lt;items.length; i++){</code>
<code>        items[i].onclick = function() {</code>
<code>            html.lang = this.lang;</code>
<code>        }</code>
<code>    }</code>
<code>}</code>
<code>window.onload = init;</code></pre>

<p>В&nbsp;этом скрипте используется удобнейший метод <code>querySelectorAll</code>, который позволяет выбрать нужные элементы при помощи CSS-селекторов наподобие <a href="http://jquery.com/">jQuery</a>.</p>

<p>Осталось только добавить специфические стили для каждого из языков (тематическую скатерть и цвет чая) и поменять состояние текущего пункта меню. Вся магия происходит благодаря псевдо-классу <code>:lang()</code>, который появляется у каждого элемента после того, как мы обновили атрибут <code>lang</code> элемента <code>&lt;html&gt;</code>:</p>

<pre><code>BODY:lang(en-US) {</code>
<code>    background:#519AB8 url(i/en.png);</code>
<code>    }</code>
<code>.switcher:lang(en-US) LI[lang=en-US],</code>
<code>.switcher:lang(ru-RU) LI[lang=ru-RU],</code>
<code>.switcher:lang(ja-JP) LI[lang=ja-JP] {</code>
<code>    border-color:#FFF;</code>
<code>    cursor:default;</code>
<code>    }</code></pre>

<p>И, наконец, последний <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/5.htm">пример №5</a>, он же <a href="http://pepelsbey.net/pro/2009/12/special-effects-tea/5.jpg" rel="darkbox">на картинке</a>. Чай готов, сахар по вкусу&nbsp;— можно пить :)</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/12/special-effects-tea/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Веб-шрифты vs. Шрифты для веба</title>
		<link>http://pepelsbey.net/2009/12/web-fonts-vs-fonts-for-web/</link>
		<comments>http://pepelsbey.net/2009/12/web-fonts-vs-fonts-for-web/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 13:15:49 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=461</guid>
		<description><![CDATA[Слухи о кончине этого сайта несколько преувеличены. Вашему вниманию предлагается импровизированное видео, смонтированное из&#160;слайдов и аудио-записи доклада «Веб-шрифты&#160;vs. Шрифты для&#160;веба», прозвучавшего 8&#160;декабря на ВСТ-встрече в&#160;Москве в&#160;рамках WebHiTech&#160;Party.








Также существует полноценная видео-запись этого доклада с&#160;минской встречи Web&#160;Standards&#160;Days, однако в&#160;Москве прозвучала его улучшенная&#160;и дополненная версия, а в&#160;предложенном скринкасте гораздо удобнее следить за&#160;содержанием слайдов.

И немного о&#160;забвении: в&#160;начале года планируется [...]]]></description>
			<content:encoded><![CDATA[<p>Слухи о кончине этого сайта несколько преувеличены. Вашему вниманию предлагается импровизированное видео, смонтированное из&nbsp;слайдов и аудио-записи доклада «Веб-шрифты&nbsp;vs. Шрифты для&nbsp;веба», прозвучавшего 8&nbsp;декабря на ВСТ-встрече в&nbsp;Москве в&nbsp;рамках <a href="http://www.webhitech.ru/party/">WebHiTech&nbsp;Party</a>.</p>

<object type="application/x-shockwave-flash" data="http://pepelsbey.net/wp-content/themes/pepelsbey/j/player.swf" width="550" height="444">
<param name="allowfullscreen" value="true">
<param name="allowscriptaccess" value="always">
<param name="flashvars" value="file=http://pepelsbey.net/pro/2009/12/web-fonts-vs-fonts-for-web/web-fonts-vs-fonts-for-web.flv&amp;skin=http://pepelsbey.net/wp-content/themes/pepelsbey/j/player.skin.swf">
<!--[if IE]><param name="movie" value="http://pepelsbey.net/wp-content/themes/pepelsbey/j/player.swf"><![endif]-->
</object>

<p>Также существует <a href="http://video.yandex.ru/users/art23minsk/collection/18/">полноценная видео-запись</a> этого доклада с&nbsp;минской встречи <a href="http://webstandardsdays.ru/">Web&nbsp;Standards&nbsp;Days</a>, однако в&nbsp;Москве прозвучала его улучшенная&nbsp;и дополненная версия, а в&nbsp;предложенном скринкасте гораздо удобнее следить за&nbsp;содержанием слайдов.</p>

<p>И немного о&nbsp;забвении: в&nbsp;начале года планируется выпустить новую версию этого сайта: новый дизайн, вёрстка&nbsp;и архитектура. Заметки станут короче&nbsp;и будут выходить значительно чаще. До&nbsp;встречи ;)</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/12/web-fonts-vs-fonts-for-web/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>TextMate Zen Coding 1.3</title>
		<link>http://pepelsbey.net/2009/06/textmate-zen-coding/</link>
		<comments>http://pepelsbey.net/2009/06/textmate-zen-coding/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 08:33:29 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=451</guid>
		<description><![CDATA[Логичным этапом после всех мечтаний про Zen&#160;Coding 2.0 стало написание документации по элементам, селекторам, свойствам и сокращениям.


Элементы Zen&#160;HTML
Селекторы Zen&#160;HTML
Свойства Zen&#160;CSS


На основе этой документации, пакеты Zen&#160;HTML и Zen&#160;CSS для редактора TextMate были обновлены до версии 1.3. Это обновление стало не столько исправлением ошибок в версиях 1.2, сколько подготовкой для перехода к версии 2.0. Тут вам и [...]]]></description>
			<content:encoded><![CDATA[<p>Логичным этапом после всех <a href="http://pepelsbey.net/2009/04/zen-coding-concept/">мечтаний про Zen&nbsp;Coding 2.0</a> стало написание документации по элементам, селекторам, свойствам и сокращениям.</p>

<ul>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLElementsRu">Элементы Zen&nbsp;HTML</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsRu">Селекторы Zen&nbsp;HTML</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenCSSPropertiesRu">Свойства Zen&nbsp;CSS</a></li>
</ul>

<p>На основе этой документации, пакеты Zen&nbsp;HTML и Zen&nbsp;CSS для редактора <a href="http://macromates.com/">TextMate</a> были обновлены до версии 1.3. Это обновление стало не столько исправлением ошибок в версиях 1.2, сколько подготовкой для перехода к версии 2.0. Тут вам и HTML&nbsp;5, и CSS&nbsp;3 и много других исправлений. А именно:</p>

<h2>Zen&nbsp;HTML</h2>

<p>Набор элементов новой версии пакета создан на основе черновика HTML&nbsp;5, плюс элемент <code>&lt;acronym&gt;</code>, который был исключён из HTML&nbsp;5. Немного был изменён принцип именования шаблонов — сначала идёт версия языка, а потом уже тип:</p>

<pre><code>html:4t  = HTML 4.01 Transitional</code>
<code>html:4s  = HTML 4.01 Strict</code>
<code>html:5   = HTML&nbsp;5</code>
<code>html:xt  = XHTML 1.0 Transitional</code>
<code>html:xs  = XHTML 1.0 Strict</code>
<code>html:xxs = XHTML 1.1 Strict</code></pre>

<p>Также добавлен новый шаблон страницы <code>html:5</code>:</p>

<pre><code>&lt;!DOCTYPE HTML&gt;</code>
<code>&lt;html lang="ru-RU"&gt;</code>
<code>&lt;head&gt;</code>
<code>    &lt;title&gt;&lt;/title&gt;</code>
<code>    &lt;meta charset="UTF-8"&gt;</code>
<code>&lt;/head&gt;</code>
<code>&lt;body&gt;</code>
<code>    </code>
<code>&lt;/body&gt;</code>
<code>&lt;/html&gt;</code></pre>

<p>Ещё один шаг к большей доступности пакета состоит в том, что теперь все элементы можно набирать как по псевдонимам, так и по полному имени:</p>

<pre><code>bq &rarr; &lt;blockquote&gt;&lt;/blockquote&gt;</code>
<code>blockquote &rarr; &lt;blockquote&gt;&lt;/blockquote&gt;</code></pre>

<p>То есть, не зная псевдонима, можно всё равно получить то, что нужно. Помимо этого, в пакет было добавлено много приятных мелочей:</p>

<p>Все элементы, которые имеют особенность много раз повторяться строка за строкой, теперь имеют механизм, который позволяет после написания первой строки сразу же приступать к написанию второй — достаточно нажать <kbd>Tab</kbd> после одного из следующих закрывающих тегов: <code>&lt;/p&gt;</code>, <code>&lt;/li&gt;</code>, <code>&lt;/tr&gt;</code>, <code>&lt;/th&gt;</code>, <code>&lt;/td&gt;</code> или <code>&lt;/option&gt;</code>.</p>

<p> Элемент <code>&lt;div&gt;</code> теперь разворачивается с атрибутами <code>class</code> и <code>id</code> более логично, раньше вместо точки использовалась собачка:</p>

<pre><code>div. &rarr; &lt;div class=""&gt;&lt;/div&gt;</code>
<code>div# &rarr; &lt;div id=""&gt;&lt;/div&gt;</code></pre>

<p>В список автоматических парных подстановок были добавлены русские кавычки: <code>«„“»</code>. Теперь при наборе первой из них, автоматически будет подставляться и вторая.</p>

<p>HTML-элементы теперь сгруппированы на основе спецификации, поэтому <a href="http://pepelsbey.net/pro/2009/06/textmate-zen-coding/menu.navigation.png" rel="darkbox">навигация через меню «Bundles»</a> теперь организована не по алфавиту, а по группам.</p>

<h2>Zen&nbsp;CSS</h2>

<p>Набор свойств в этом пакете основан на черновике спецификации CSS&nbsp;3 и в дальнейшем будет обновляться, в зависимости от реализации в браузерах и решений, что принимает <a href="http://www.w3.org/blog/CSS/">CSS WG</a>. Этот пакет оптимизация коснулась в большей степени.</p>

<p>Основной файл настроек языка был взят из самой последней версии оригинального пакета CSS и модифицирован для полного соответствия CSS&nbsp;3:</p>

<ul>
<li>HTML-селекторы: 99, вместо прежних 76-ти</li>
<li>Псевдо-классы: 24, вместо прежних 5-ти</li>
<li>Свойства: 169, вместо прежних 125-ти</li>
<li>Значения: 160, вместо прежник 138-ми</li>
</ul>

<p>Это значит, что все новые свойства и значения из черновика CSS&nbsp;3 будут правильно подсвечиваться. Исключением станут вендорные свойства и значения, в частности, с префиксами. Их полезно отличать от остального массива кода. Также было модифицировано регулярное выражение, которое отвечает за HTML-селекторы, теперь подсвечиваться будут как строчные, так и прописные имена.</p>

<p>Всем свойствам, отвечающим за позиционирование (<code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>) были присвоены однобуквенные сокращения: <code>t</code>, <code>r</code>, <code>b</code>, <code>l</code>. Соответственно, для свойства <code>border</code> теперь используется сочетание <code>bd</code>, по аналогии с <code>bg</code> для <code>background</code>. Да, стало длиннее, да, придётся привыкать, но общая логичность решения повысилась.</p>

<p>Короткое сочетание <code>z</code> вернулось и свойству <code>z-index</code>, которое близко к тем обнобуквенным, что отвечают за позиционирование. Поэтому свойство <code>zoom</code>, о котором мы когда-нибудь забудем, отправлено в <code>zoo</code> и открывается сразу со значением, равным единице.</p>

<p>Помимо этого в пакет была внесена некоторая <em>вендорная специфика</em>: вроде <code>-ms-filter</code>, <code>display:-moz-inline-box</code>, <code>-webkit-box-shadow</code> и некоторых других. Эти свойства также будут обновляться, в зависимости от поддержки новых экспериментальных свойств в различных браузерах.</p>

<p>Ну, и немного приятных мелочей. Свойство <code>quotes</code> теперь может быть развёрнуто с уже готовыми значениями для двух уровней русских или английских кавычек:</p>

<pre><code>q:ru &rarr; quotes:'\00AB' '\00BB' '\201E' '\201C';</code>
<code>q:en &rarr; quotes:'\201C' '\201D' '\2018' '\2019';</code></pre>

<p>…а нажатая после символа <code>;</code> клавиша <kbd>Tab</kbd> создаст строку для нового правила.</p>

<h2>Кто здесь?</h2>

<p>Сейчас пакеты проекта Zen&nbsp;Coding существуют в двух основных ветках:</p>

<ul>
<li><strong>Первая ветка</strong> использует для работы с сокращениями внутренние возможности редактора и существует в виде отдельных пакетов для каждого языка:
<ul>
<li>Zen&nbsp;HTML и Zen&nbsp;CSS для редактора <a href="http://macromates.com/">TextMate</a>, автор — ваш покорный слуга.</li>
<li>Zen&nbsp;HTML для редактора <a href="http://www.netbeans.org/">NetBeans</a>, автор — <a href="http://rmcreative.ru/">Александр Макаров</a>.</li>
</ul>
</li>
<li><strong>Вторая ветка</strong> является единым пакетом и использует для работы с сокращениями скрипт, написанный <a href="http://chikuyonok.ru/">Сергеем Чикуёнком</a> на JavaScript, а затем портированный для Python:
<ul>
<li>Zen&nbsp;Coding для редактора <a href="http://macromates.com/">TextMate</a></li>
<li>Zen&nbsp;Coding для редактора <a href="http://www.aptana.com/">Aptana</a></li>
<li>Zen&nbsp;Coding для редактора <a href="http://panic.com/coda/">Coda</a></li>
</ul>
</li>
</ul>

<p>Обе ветки используют документацию, упомянутую в начале заметки, поэтому совместимы между собой. Особенностью второй ветки является то, что в XML-подобных языках поддерживается разворачивание шаблонов на основе CSS-синтаксиса, о чём <a href="http://pepelsbey.net/2009/04/zen-coding-concept/">мечталось в одной заметке</a>.</p>

<p>Несмотря на некоторую запутанность с ветками, пакеты продолжают развиваться, более того — планируется написание Zen&nbsp;HTML для <a href="http://www.ultraedit.com/products/ultraedit/">UltraEdit</a> и Zen&nbsp;CSS для возрождённого <a href="http://www.topstyle4.com/">TopStyle 4</a>.</p>

<h2>Установка пакетов</h2>

<p>Последние версии всех пакетов по-прежему можно скачать со <a href="http://code.google.com/p/zen-coding/">страницы проекта на Google Code</a>. Речь же пойдёт о специфике установки пакетов для редактора TextMate.</p>

<p>Если вы устанавливаете пакеты в первый раз, то достаточно просто кликнуть два раза по разархивированному файлу. Но если вы не уверены, то лучше читайте дальше.</p>

<p>Если вы уже использовали предыдущие версии пакетов для TextMate, включая бета-версии пакетов 1.3 с <a href="http://code.google.com/p/zen-coding/">Google Code</a>, то пакеты нужно будет обновить прямой заменой файлов. Иначе, попытки смёржить две разные версии приведут к непредсказуемым последствиям. Итак, нужно сделать следующее:</p>

<ol>
<li>Закрыть TextMate</li>
<li>Зайти в папку: <code>~/Library/Application Support/TextMate/Bundles/</code></li>
<li>Удалить старые пакеты Zen-CSS и Zen-HTML</li>
<li>Скопировать в эту папку новые пакеты</li>
</ol>

<p>Такая тактика уменьшит вероятность возникновения проблем.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/06/textmate-zen-coding/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>В чём мать родила</title>
		<link>http://pepelsbey.net/2009/04/as-my-mother-bore-me/</link>
		<comments>http://pepelsbey.net/2009/04/as-my-mother-bore-me/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 13:02:37 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=450</guid>
		<description><![CDATA[

Традиционно раздеваемся, подставляя бледные тела страниц под весеннее солнце. CSS Naked Day покажет, кто чего стоит.]]></description>
			<content:encoded><![CDATA[<p><a href="http://naked.dustindiaz.com/"><img src="http://pepelsbey.net/pro/2009/04/as-my-mother-bore-me/naked.png" alt="CSS Naked Day"/></a></p>

<p>Традиционно раздеваемся, подставляя бледные тела страниц под весеннее солнце. <a href="http://naked.dustindiaz.com/">CSS Naked Day</a> покажет, кто чего стоит.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/04/as-my-mother-bore-me/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Zen Coding 2.0. Концепт</title>
		<link>http://pepelsbey.net/2009/04/zen-coding-concept/</link>
		<comments>http://pepelsbey.net/2009/04/zen-coding-concept/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 15:19:15 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=447</guid>
		<description><![CDATA[На текущем этапе развития пакеты расширений Zen Coding для редактора TextMate зашли в тупик.

Можно конечно развить поддержку HTML 5, предусмотреть все свойства из CSS 3, реализовать ещё большее количество ежедневно необходимых шаблонов. И это будет сделано, но во вторую очередь. В первую очередь, я планирую серьёзно изменить способ набора HTML-кода и методику хранения библиотеки шаблонов [...]]]></description>
			<content:encoded><![CDATA[<p>На текущем этапе развития пакеты расширений <a href="http://pepelsbey.net/2008/10/zen-coding/">Zen Coding</a> для редактора <a href="http://macromates.com/">TextMate</a> зашли в тупик.</p>

<p>Можно конечно развить поддержку HTML 5, предусмотреть все свойства из CSS 3, реализовать ещё большее количество ежедневно необходимых шаблонов. И это будет сделано, но во вторую очередь. В первую очередь, я планирую серьёзно изменить способ набора HTML-кода и методику хранения библиотеки шаблонов в пакетах. Ну, и конечно улучшить логичность и интуитивность всех сокращений и сочетаний клавиш. Но обо всём попорядку.</p>

<p>Главная проблема текущей реализации Zen Coding состоит в ограничениях, которые накладывает внутренний механизм работы бандлов в TextMate:</p>

<ul>
<li>Все шаблоны нужно хранить в отдельных сущностях, что приводит к чрезвычайно трудоёмкому процессу изменения каких-то концептуальных механизмов. Самый яркий пример — переменная <code>TM_CSS_SPACE</code>, для её внедрения пришлось вручную перелопатить порядка 250 шаблонов.</li>
<li>Работа с выборкой из выделения или текущей строки нужных переменных далека от совершенства и просто не позволяет получить каки-то элементы без дополнительных скриптов.</li>
</ul>

<p>Самым логичным выходом из данной ситуации, на мой взгляд, является написание какой-то отдельной обёртки, которая будет содержать в себе библиотеку всех элементов, вызываться по клавише <kbd>Tab</kbd>, анализировать контекст применения и уже делать всё, что нужно, невзирая на ограничения встроенных в TextMate механизмов.</p>

<p>Что же планируется сделать:</p>

<h2>Zen HTML</h2>

<p>Очевидно, что самым удобным синтаксисом для работы HTML-деревом является CSS-синтаксис. Самым ярким примером его использования является механизм <a href="http://en.wikipedia.org/wiki/CssQuery">CSS Query</a> широко распространённый в современных JS-фреймворках. В них на всю катушку использются не только все селекторы выборки из CSS 3, но и другие кастомные штуки  вроде <code>:even</code>, <code>:not</code>, <code>:enabled</code> и другие. И хорошо было бы использовать этот механизм выборки не только в CSS и JS, но и при написании HTML-кода.</p>

<p>Проанализировав типичные ситуации, возникающие при написании HTML, я пришёл к следующей группе базовых селекторов и их псевдонимов:</p>

<ul>
<li>ID: <code>E#name</code></li>
<li>Класс: <code>E.name</code></li>
<li>Вложенность: <code>E&gt;E</code></li>
<li>Братство: <code>E+E</code></li>
<li>Повторение: <code>E*N</code>, простой псевдоним братского <code>E*3 = E+E+E</code></li>
<li>Разворачивание: <code>E+</code>, сложный псевдоним группы селекторов <code>E+ = E&gt;E+…</code></li>
</ul>

<p>Базовые селекторы атрибутов <code>id</code> и <code>class</code>:</p>

<pre><code>div#name &rarr; &lt;div id="name"&gt;&lt;/div&gt;</code>
<code>div.name &rarr; &lt;div class="name"&gt;&lt;/div&gt; </code>
<code>div.one.two &rarr; &lt;div class="one two"&gt;&lt;/div&gt; </code>
<code>div#name.name &rarr; &lt;div id="name" class="name"&gt;&lt;/div&gt; </code></pre>

<p>Базовые селекторы <code>E&gt;E</code> и <code>E+E</code> и их сочетания:</p>

<pre><code>bq&gt;p →</code>
<code>&lt;blockquote&gt;</code>
<code>   &lt;p&gt;&lt;/p&gt;</code>
<code>&lt;/blockquote&gt;</code>
<code>p+p →</code>
<code>&lt;p&gt;&lt;/p&gt;</code>
<code>&lt;p&gt;&lt;/p&gt;</code>
<code>ul&gt;li+li →</code>
<code>&lt;ul&gt;</code>
<code>   &lt;li&gt;&lt;/li&gt;</code>
<code>   &lt;li&gt;&lt;/li&gt;</code>
<code>&lt;/ul&gt;</code></pre>

<p>Псевдонимы базовых — <code>E*N</code> и <code>E+</code>:</p>

<pre><code>p*2 &rarr;</code>
<code>&lt;p&gt;&lt;/p&gt;</code>
<code>&lt;p&gt;&lt;/p&gt;</code>
<code>ul&gt;li*2 &rarr;</code>
<code>&lt;ul&gt;</code>
<code>   &lt;li&gt;&lt;/li&gt;</code>
<code>   &lt;li&gt;&lt;/li&gt;</code>
<code>&lt;/ul&gt;</code>
<code>dl+ &rarr;</code>
<code>&lt;dl&gt;</code>
<code>   &lt;dt&gt;&lt;/dt&gt;</code>
<code>   &lt;dd&gt;&lt;/dd&gt;</code>
<code>&lt;/dl&gt;</code></pre>

<p>По сути, селектор <code>E+</code> не является точным указанием на структуру желаемого дерева, скорее это псевдоним к шаблону, то есть псевдоним <code>dl+</code> равносилен <code>dl&gt;dt+dd</code>, а <code>table+</code> равносилен <code>table&gt;tr&gt;td</code>. Помимо этого, стоит понимать разницу между базовым селектором <code>E+E</code> и псевдонимом <code>E+</code> — в первом случае это обозначение следования друг за другом, а во втором это признак разворачиваемого шаблона.</p>

<p>Кажется, что подобным способом можно развернуть всё дерево документа, но это не так. Подобный синтаксис не предусматривает ветвление — углублять дерево можно только в одном направлении, т.е. вложить в одного родителя двух и более детей можно, но развить вложенность можно только для последнего из них. По идее, можно было бы придумать какую-то группировку, но это, во-первых, будет сильно противоречить CSS-синтаксису, а во-вторых, не настолько востребованно.</p>

<p>Чуть более сложный пример:</p>

<pre><code>div#page&gt;h3.title+ul&gt;li.item*3&gt;a &rarr;</code>
<code>&lt;div id="page"&gt;</code>
<code>   &lt;h3 class="title"&gt;&lt;/h3&gt;</code>
<code>   &lt;ul class="menu"&gt;</code>
<code>      &lt;li class="item"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;</code>
<code>      &lt;li class="item"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;</code>
<code>      &lt;li class="item"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;</code>
<code>   &lt;/ul&gt;</code>
<code>&lt;/div&gt;</code></pre>

<p>Вряд ли подобные конструкции будут использоваться слишком часто, но сам принцип формирования отдельных элементов при помощи CSS-синтаксиса видится мне наиболее удачным решением.</p>

<h2>Zen CSS</h2>

<p>Этот пакет ожидают менее серьёзные изменения. Основные усилия будут направлены на следующее:</p>

<ul>
<li>Более логичную и удобную систему псевдонимов и предустановленных шаблонов.</li>
<li>Поддержку всех актуальных CSS-свойств, присутствующих в черновике CSS 3 и уже реализованных в браузерах, в частности, с вендорными префиксами.</li>
<li>Организация автоматической сортировки свойств в специфическом порядке.</li>
</ul>

<p>Список актуальных свойств был составлен при помощи фильтрации <a href="http://meiert.com/en/indices/css-properties/">полного списка существующих</a> в CSS 3 свойств. В итоге из 255 наименований осталось только 131 свойство, для каждого из которых был придуман короткий псевдоним <code>mt &rarr; margin-top</code>, а также набор шаблонов <code>f+ &rarr; font:1em Arial,sans-serif</code>.</p>

<p>Помимо этого, актуальные свойства были разделены на группы и отсортированы в два этапа: порядок следования групп и порядок следования свойств в группе. Всего получилось восемь групп:</p>

<ol>
<li>Позиционирование</li>
<li>Поведение и свойства блока</li>
<li>Размерность блока</li>
<li>Цветовое оформление</li>
<li>Специальные типы содержимого</li>
<li>Текст</li>
<li>Визуальные свойства</li>
<li>Печать</li>
</ol>

<p>Логика группировки основывается на двух главных принципах:</p>

<ul>
<li>Движение снаружи внутрь: от позиционирования к свойствам блока и через текст к слову и шрифту.</li>
<li>Движение от глобальных свойств к более частным и менее употребимым: от позиционирования к прозрачности, свойствам курсора и стилям для печати.</li>
</ul>

<p>Внутри блоков логика «от глобального к частному» сохраняется, но начинает работать ещё один механизм, сортирующий подобные свойства в таком порядке, в котором их принято упоминать в сокращённой записи:</p>

<pre><code>font:bold italic small-caps 1em sans-serif;</code>
<code>font-weight:bold;</code>
<code>font-style:italic;</code>
<code>font-variant:small-caps;</code>
<code>font-size:1em;</code>
<code>font-family:sans-serif;</code></pre>

<p>Тоже самое и со свойствами, относящимися к четырём сторонам объекта: за основу взят принцип <strong>TR</strong>ou<strong>BL</strong>e или <strong>T</strong>op <strong>R</strong>ight <strong>B</strong>ottom <strong>L</strong>eft, который используется в сокращённой записи:</p>

<pre><code>#box {</code>
<code>   position:absolute;</code>
<code>   top:1px;</code>
<code>   right:2px;</code>
<code>   bottom:3px;</code>
<code>   left:4px;</code>
<code>   padding:1px 2px 3px 4px;</code>
<code>   padding-top:1px;</code>
<code>   padding-right:2px;</code>
<code>   padding-bottom:3px;</code>
<code>   padding-left:4px;</code>
<code>   }</code></pre>

<p>В состав пакета Zen Coding планируется включить скрипт, который будет автоматически сортировать выделенные группы свойств согласно упомянутому алгоритму. Это позволит не только легко научиться новому порядку сортировки, но и привести в порядок существующий или чужой код.</p>

<p>Также планируется отдельная публикация с теоритическими выкладками по поводу группировки и сортировки CSS-свойств. Возможно, в составе обновлённой версии статьи «CSS-менеджмент».</p>

<h2>Алло, таланты!</h2>

<p>Сейчас я продемонстрировал вам концепцию будущих пакетов Zen Coding. Для дальнейших шагов по её реализации осталось только найти соавтора или соавторов, которые согласны не только помочь мне реализовать эту функциональность, но и, возможно, заняться поддержкой, развитием и портированием пакетов для других редакторов. Большая часть алгоритмов написана, остальная дописывается и ждёт своего часа, чтобы быть реализованной в пакетах Zen Coding не только для TextMate, но и для всех редкторов, что поддерживают плагины: <a href="http://panic.com/coda/">Coda</a>, <a href="http://macrabbit.com/espresso/">Espresso</a>, <a href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a> и многих других.</p>

<p>Если вы используете TextMate, знаете на хорошем уровне какой-нибудь скриптовый язык вроде Python, Ruby, Perl или даже PHP, и хотите написать что-нибудь такое или портировать Zen Coding для своего любимого редактора — смелее, пишите мне: <a href="mailto:pepelsbey@gmail.com">pepelsbey@gmail.com</a>.</p>

<p>Проект по-прежнему планируется держать на <a href="http://code.google.com/p/zen-coding/">Google Code</a>, но помимо этого будет открыт отдельный сайт с документацией и примерами — <a href="http://zen-coding.ru/">zen-coding.ru</a></p>

<p>Как обычно, с интересом жду ваших мнений по поводу озвученной концепции развития пакетов Zen Coding.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/04/zen-coding-concept/feed/</wfw:commentRss>
		<slash:comments>59</slash:comments>
		</item>
		<item>
		<title>Яндекс.Субботник в Киеве</title>
		<link>http://pepelsbey.net/2009/03/yandex-sabbath-kiev/</link>
		<comments>http://pepelsbey.net/2009/03/yandex-sabbath-kiev/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 15:56:53 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=448</guid>
		<description><![CDATA[Что ж, праздник приходит и к нашим украинским коллегам — 25 апреля Яндекс.Субботник приедет в Киев с гастролями. Программа, в основном, повторяет первое московское мероприятие, однако, насколько мне известно, точной копией не является — как минимум, докладчики учтут все вопросы и пожелания, что прозвучали после первого выступления.

Итак, участники: симферопольцы Вадим Макишвили с моноспектаклем «Вёрстка в [...]]]></description>
			<content:encoded><![CDATA[<p>Что ж, праздник приходит и к нашим украинским коллегам — 25 апреля Яндекс.Субботник <a href="http://clubs.ya.ru/company/replies.xml?item_no=15607">приедет в Киев</a> с гастролями. Программа, в основном, повторяет первое московское мероприятие, однако, насколько мне известно, точной копией не является — как минимум, докладчики учтут все вопросы и пожелания, что прозвучали после первого выступления.</p>

<p>Итак, участники: симферопольцы <a href="http://makishvili.com/">Вадим Макишвили</a> с моноспектаклем «Вёрстка в IntelliJIDEA» и <a href="http://vitaly.harisov.name/">Виталий Харисов</a> с развитем темы универсальной вёрстки, ваш покорный слуга со второй версией доклада «<a href="http://pepelsbey.net/2009/02/with-knife-against-train/">С ножом против паровоза</a>» и целых два доклада про <a href="http://api.yandex.ru/maps/">API Яндекс.Карт</a> от Александра Тармолова: один обзорный, второй — в виде мастер-класса.</p>

<p>До встречи в Киеве!</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/03/yandex-sabbath-kiev/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Даркбокс 2</title>
		<link>http://pepelsbey.net/2009/02/darkbox-2/</link>
		<comments>http://pepelsbey.net/2009/02/darkbox-2/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 01:26:14 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=446</guid>
		<description><![CDATA[Жизнь выдвигает новые требования, поэтому некоторые решения получают продолжение. Итак, перед вами продолжение экспериментов над одним простым, но очень полезным способом красиво открывать одиночные картинки. Более подробно об изначальной проблеме и первом варианте решения читайте в заметке «Даркбокс», а сейчас поговорим о даркбоксе номер два.

Для начала пример — Даркбокс 2, всё в одном файле.

Что нового, [...]]]></description>
			<content:encoded><![CDATA[<p>Жизнь выдвигает новые требования, поэтому некоторые решения получают продолжение. Итак, перед вами продолжение экспериментов над одним простым, но очень полезным способом красиво открывать одиночные картинки. Более подробно об изначальной проблеме и первом варианте решения читайте в заметке «<a href="http://pepelsbey.net/2008/11/darkbox/">Даркбокс</a>», а сейчас поговорим о даркбоксе номер два.</p>

<p>Для начала пример — <a href="http://pepelsbey.net/pro/2009/02/darkbox-2/">Даркбокс 2</a>, всё в одном файле.</p>

<h2>Что нового, с виду</h2>
<ul>
<li>Картинка большей ширины или высоты чем окно, будет автоматически подогнана под его размеры, чтобы пользователь не испугался и смог нажать заветный крестик. Попробуйте сильно уменьшить размер окна и снова открыть картинку.</li>
<li>Датчик загрузки во всех нормальных браузерах, кроме Opera, обзавёлся скруглёнными уголками благодаря свойству <code>border-radius</code>.</li>
<li>Крестики закрытия картинки теперь располагаются в наиболее удобных местах, в зависимости от платформы: на Маке — слева, на PC — справа.</li>
<li>Теперь любой этап жизни даркбокса можно прервать при помощи клавиши <kbd>Esc</kbd>, на случай если вы передумали или кликнули случайно.</li>
</ul>

<h2>Что нового, технически</h2>

<p>Ну а чисто технически изменений не слишком много. В целом, код подрос примерно на сорок строк, большую часть из которых занимает мудрёное вписывание картинки в размеры окна. Помимо этого, сделана попытка сохранять создаваемый для дарбокса объект, чтобы клонировать и использовать его повторно для всех картинок. Не уверен, что это сильно повысило производительность, но попытка сделана:</p>

<pre><code>if(!$('div.darkbox-frame').length) {</code>
<code>    darkbox = $('&lt;div class="darkbox-frame"&gt;…').appendTo('body');</code>
<code>}</code>
<code>var frame = darkbox.clone().appendTo('body');</code></pre>

<p>Совместимость у скрипта прежняя, разве что тестирование в IE5 привело к JS-ошибке, но дело, скорее всего, в текущей  версии jQuery. Думаю, что отряд не заметит потери бойца. Ну а Opera традиционно заставила прямо-таки создать картинку, а не просто приделать атрибут <code>src</code> к уже имеющемуся коду.</p>

<p>Другая проблема в IE, что тянется ещё с прошлой версии, случается во время анимации прозрачности блока с чёрным фоном от 0 до 50%. Суть её такова, что если описывать прозрачность в CSS при помощи <code>filter:alpha(opacity=N)</code>, то блок при появлении становится чёрным, потом абсолютно прозрачным и только потом начинается анимация. Видно это всего долю секунды, но осадочек остаётся. Трюк в стиле <em>добавим немного абсурда</em>, когда прозрачность добавляется к блоку при помощи JS, сработал, но снизил производительность всего решения. Поэтому вопрос открыт.</p>

<p>С интересом жду ваших мнений, замечаний и предложений. Разработка даркбокса продолжается…</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/02/darkbox-2/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>С ножом против паровоза</title>
		<link>http://pepelsbey.net/2009/02/with-knife-against-train/</link>
		<comments>http://pepelsbey.net/2009/02/with-knife-against-train/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 03:24:30 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=444</guid>
		<description><![CDATA[Вашему вниманию предлагается видеозапись презентации «С ножом против паровоза», прозвучавшей на Яндекс.Субботнике в Киеве 25&#160;апреля 2009 года. Речь в ней идёт о нарезке и оптимизации изображений для вёрстки. Длительность доклада вместе с вопросами — 58&#160;минут, размер видео порядка 200&#160;МБ.








Для лучшего понимания, доступен оригинал презентации: С ножом против паровоза (PDF, 4.4&#160;МБ).]]></description>
			<content:encoded><![CDATA[<p>Вашему вниманию предлагается видеозапись презентации «С ножом против паровоза», прозвучавшей на <a href="http://clubs.ya.ru/company/replies.xml?item_no=15607">Яндекс.Субботнике</a> в Киеве 25&nbsp;апреля 2009 года. Речь в ней идёт о нарезке и оптимизации изображений для вёрстки. Длительность доклада вместе с вопросами — 58&nbsp;минут, размер видео порядка 200&nbsp;МБ.</p>

<object type="application/x-shockwave-flash" data="http://pepelsbey.net/wp-content/themes/pepelsbey/j/player.swf" width="550" height="444">
<param name="allowfullscreen" value="true">
<param name="allowscriptaccess" value="always">
<param name="flashvars" value="file=http://pepelsbey.net/pro/2009/02/with-knife-against-train/with-knife-against-train.flv&amp;skin=/wp-content/themes/pepelsbey/j/player.skin.swf">
<!--[if IE]><param name="movie" value="http://pepelsbey.net/wp-content/themes/pepelsbey/j/player.swf"><![endif]-->
</object>

<p>Для лучшего понимания, доступен оригинал презентации: <a href="http://pepelsbey.net/pro/2009/02/with-knife-against-train/with-knife-against-train.pdf">С ножом против паровоза</a> (PDF, 4.4&nbsp;МБ).</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2009/02/with-knife-against-train/feed/</wfw:commentRss>
		<slash:comments>60</slash:comments>
		</item>
		<item>
		<title>Яндекс.Субботник</title>
		<link>http://pepelsbey.net/2008/12/sabbath-yandex-sabbath/</link>
		<comments>http://pepelsbey.net/2008/12/sabbath-yandex-sabbath/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 10:48:53 +0000</pubDate>
		<dc:creator>pepelsbey</dc:creator>
				<category><![CDATA[Заметки]]></category>

		<guid isPermaLink="false">http://pepelsbey.net/?p=436</guid>
		<description><![CDATA[Похоже, что череда новогодних подарков стартовала раньше, чем ожидалось — теперь у нас есть новое бесплатное образовательное мероприятие под названием Яндекс.Субботник.

Основа программы — доклады суровых крымских специалистов по клиентской разработке: Виталия Харисова, Вадима и Наталии Макишвили. Далее следуют доклады из не менее суровой северной столицы: Евгения Фирсова с деплойментом вёрстки и ваш покорный слуга с… [...]]]></description>
			<content:encoded><![CDATA[<p>Похоже, что череда новогодних подарков стартовала раньше, чем ожидалось — теперь у нас есть новое бесплатное образовательное мероприятие под названием <a href="http://company.yandex.ru/blog/message.xml?msg=104945">Яндекс.Субботник</a>.</p>

<p>Основа программы — доклады суровых крымских специалистов по клиентской разработке: <a href="http://vitaly.harisov.name/">Виталия Харисова</a>, <a href="http://makishvili.com/">Вадима и Наталии Макишвили</a>. Далее следуют доклады из не менее суровой северной столицы: <a href="http://saigo.moikrug.ru/">Евгения Фирсова</a> с деплойментом вёрстки и ваш покорный слуга с… да, «с ножом против паровоза». Ну и конечно первое публичное выступление по <a href="http://api.yandex.ru/maps/">API Яндекс.Карт</a> от <a href="http://fgolubev.moikrug.ru/">Фёдора Голубева</a>.</p>

<p>Есть только одна грустная новость — интерес к мероприятию оказался настролько высок, что регистрация была закрыта уже на следующий день. Столовая Яндекса, как ни странно, оказалась не резиновой.</p>

<p>Однако это не повод отчаиваться — все материалы и видеозаписи выступлений будут опубликованы вскоре после завершения мероприятия. А всем, кто не успел зарегестрироваться — я уверен — повезёт <em>в следующий раз…</em></p>

<p>А для тех, кому всё-таки повезло, предлагаю свою версию программы выступления, которую можно удобно распечатать: <a href="http://pepelsbey.net/pro/2008/12/sabbath-yandex-sabbath/">Яндекс.Субботник — Программа</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pepelsbey.net/2008/12/sabbath-yandex-sabbath/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
