<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[The Tude Abides]]></title>
  
  <link href="http://stephentudor.com/" />
  <updated>2012-02-04T14:33:29-05:00</updated>
  <id>http://stephentudor.com/</id>
  <author>
    <name><![CDATA[Stephen Tudor]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/stephentudor" /><feedburner:info uri="stephentudor" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[KSS and Middleman]]></title>
    <link href="http://feedproxy.google.com/~r/stephentudor/~3/SvYyyrjhBVk/kss-and-middleman" />
    <updated>2012-01-10T15:11:00-05:00</updated>
    <id>http://stephentudor.com/blog/2012/01/10/kss-and-middleman</id>
    <content type="html">&lt;p&gt;I love the idea of building an &amp;#8220;interactive style guide&amp;#8221; for a website
design.  I really do. However, working in Agencyland, it can be
extremely difficult to budget enough time for this kind of tool when
seemingly higher-priority tasks pile up. Right or wrong, the utopian
vision of a living style guide often becomes a foregone luxury in the
throes of looming deadlines.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Assumes the reader understands the basics of Ruby and CSS.&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h2&gt;Middleman&lt;/h2&gt;

&lt;p&gt;For an upcoming project at &lt;a href="http://empathylab.com"&gt;work&lt;/a&gt;, I&amp;#8217;ll be
leading the effort to author static HTML templates for a different group
of software integrators to wire up to a complex back-end architecture
(rhymes with Shmeb-shmere).&lt;/p&gt;

&lt;p&gt;We are also going to be building a whole front-end stack with CSS and
JavaScript to boot, so it makes sense to use a solid static framework to
take the pain away from developing a massive amount of templates without
any server-side help. The bottom line is that we need to be able to
export flat HTML files that work the same as the development templates.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="http://middlemanapp.com"&gt;Middleman&lt;/a&gt;, a loosely-coupled, yet
carefully curated collection of Ruby libraries that all contribute to a
framework that is much greater than the sum of its parts. I won&amp;#8217;t go
into all of its features here&amp;thinsp;&amp;mdash;&amp;thinsp;you can visit the
Middleman &lt;a href="http://middlemanapp.com"&gt;site&lt;/a&gt; for everything you need to
know.&lt;/p&gt;

&lt;p&gt;For our purposes, Middleman looks to be a robust platform on which to
build our static site.&lt;/p&gt;

&lt;h2&gt;KSS&lt;/h2&gt;

&lt;p&gt;I am a closet fan of documentation specs like RubyDoc and JSDoc, but
they often introduce a lot of heavy baggage for developers.
&lt;a href="http://tomdoc.org"&gt;TomDoc&lt;/a&gt; came on the scene not too long ago as a
really simple doc spec that Githubbers use in their in-house Ruby code,
and I was ecstatic when another Github guy, &lt;a href="http://warpspire.com"&gt;Kyle Neath&lt;/a&gt;,
released his own &lt;a href="http://github.com/kneath/kss"&gt;KSS&lt;/a&gt; project in late
2011. I think I&amp;#8217;ve subconsciously been yearning for this kind of CSS
documentation support for some time.&lt;/p&gt;

&lt;p&gt;KSS is a documentation spec for CSS (one of the first of its kind that
I&amp;#8217;ve heard of) that can be parsed by Ruby. This helps us do things
like&amp;hellip; generating an interactive style guide. It&amp;#8217;s certainly not a
silver bullet, but KSS will lower some of the administrative barriers to
putting together helpful CSS documentation.&lt;/p&gt;

&lt;h2&gt;KSS-ing Middleman&lt;/h2&gt;

&lt;p&gt;I thought it would be a good idea to try to port some of the
&lt;a href="https://github.com/kneath/kss/tree/master/example"&gt;KSS example app&lt;/a&gt;
code over to my basic Middleman app. The example shows several
variations of form submit button styles, including states such as hover
and disabled, which makes for an excellent use case.&lt;/p&gt;

&lt;h3&gt;The Styles&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m using &lt;a href="http://sass-lang.com"&gt;Sass&lt;/a&gt; and
&lt;a href="http://compass-style.org"&gt;Compass&lt;/a&gt;, with Middleman, so I did a quick
port of Kyle&amp;#8217;s example button CSS to Sass with some appropriate Compass
mixins. I found that KSS broke when used with the original terse Sass
format, but it did work fine with the newer SCSS format. I&amp;#8217;m not
certain, but it&amp;#8217;s possible that this issue may be resolved in KSS in the
future.&lt;/p&gt;

&lt;p&gt;Below is the result of porting the button CSS to &lt;code&gt;_button.scss&lt;/code&gt;. The
comment block at the top is where the documentation magic happens. You
just describe what something is, specify a list of different states, and
then reference a numbered section of the style guide. That&amp;#8217;s it.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sass'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// Your standard form button.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// :hover    - Highlights when hovering.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// :disabled - Dims the button when disabled.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// .primary  - Indicates button is the primary action.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// .smaller  - A smaller button&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// Styleguide 5.1.1&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#f5f5f5&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; background-image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;#f5f5f5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;#e5e5e5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;border&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="no"&gt;solid&lt;/span&gt; &lt;span class="mh"&gt;#ddd&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;border-bottom-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#bbb&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; border-radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; box-shadow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="nf"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.15&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#666&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;pointer&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Helvetica Neue&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Helvetica&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;bold&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;line-height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;normal&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; text-shadow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="nf"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;.primary&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;.primary&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#fff&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#8add6d&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; background-image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;#8add6d&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;#60b044&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;border-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#74bb5a&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;border-bottom-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#509338&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; box-shadow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="nf"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; text-shadow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nf"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;.smaller&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#337797&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#f0f7fa&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; background-image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;#f0f7fa&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;#d8eaf2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;border-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#cbe3ee&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;border-bottom-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#97c7dd&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:disabled&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You actually &lt;em&gt;do&lt;/em&gt; need to manage the numeric structure of the style guide
yourself. However, I appreciate that KSS makes you maintain control over
the meaningful aspects of organizing a style guide, while making it
possible to automate the tedious parts.&lt;/p&gt;

&lt;h3&gt;The Config&lt;/h3&gt;

&lt;p&gt;For the style guide to look nice on the front end, there is also a small
amount of boilerplate CSS and JavaScript code to make some of the magic
happen, so I pulled those files in and called them from a separate
layout, &lt;code&gt;layouts/styleguide.erb&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The KSS example app runs on Sinatra, and Middleman also basically runs
on Sinatra with some abstractions on top, so setting up the
configuration wasn&amp;#8217;t too tough. After adding &lt;code&gt;gem "kss", "~&amp;gt; 0.1.1"&lt;/code&gt; to
the Gemfile and running &lt;code&gt;bundle install&lt;/code&gt;, I added the following to
Middleman&amp;#8217;s &lt;code&gt;config.rb&lt;/code&gt; file:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;kss&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/styleguide/*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:layout&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:styleguide&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="vi"&gt;@styleguide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Kss&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;source/css&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;helpers&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# Generates a styleguide block.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;styleguide_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@styleguide&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@example_html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kss_capture&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@_out_buf&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;partial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;styleguide/block&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# Captures the result of a block within an erb template without spitting it&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# to the output buffer.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;kss_capture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@_out_buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@_out_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;yield&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@_out_buf&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;ensure&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="vi"&gt;@_out_buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;For all style guide templates, the above configuration exposes a
variable containing a Ruby representation of all KSS-documented CSS in
the site (because KSS parses all documentation blocks in the CSS). A
couple of helpers are defined that the templates will have access to, in
order to handle the generated style guide block.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Due to a bug in Middleman 3.0 beta, wildcard file paths did not set
local variables correctly. This bug should be resolved in 3.0 final.
Additionally, I suspect that the &lt;/em&gt;&lt;code&gt;kss_capture&lt;/code&gt;&lt;em&gt; helper is not exactly
optimal for use with Middleman, but I haven&amp;#8217;t taken the time to refactor
the example code beyond simply getting it working. It was originally
named &lt;/em&gt;&lt;code&gt;capture&lt;/code&gt;&lt;em&gt; in the example, but I renamed it to prevent conflicts
with the existing Middleman &lt;/em&gt;&lt;code&gt;capture&lt;/code&gt;&lt;em&gt; helper, which I would have
probably tried to use if it was available inside the config file.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;The Templates&lt;/h3&gt;

&lt;p&gt;A partial template needs to be defined for rendering every style guide
section. The template will be used by the &lt;code&gt;styleguide_block&lt;/code&gt; helper
defined in the config above: &lt;code&gt;styleguide/_block.erb&lt;/code&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='erb'&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;&amp;lt;div class=&amp;quot;styleguide-example&amp;quot;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &amp;lt;h3&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@section&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt; &amp;lt;em&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@section&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&amp;lt;/em&amp;gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &amp;lt;div class=&amp;quot;styleguide-description&amp;quot;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@section&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@section&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;any?&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;      &amp;lt;ul class=&amp;quot;styleguide-modifier&amp;quot;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="vi"&gt;@section&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;          &amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&amp;lt;/strong&amp;gt; - &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;      &amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &amp;lt;div class=&amp;quot;styleguide-element&amp;quot;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@example_html&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="vi"&gt;@section&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    &amp;lt;div class=&amp;quot;styleguide-element styleguide-modifier&amp;quot;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;      &amp;lt;span class=&amp;quot;styleguide-modifier-name&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;      &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@example_html&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$modifier_class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    &amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;In &lt;code&gt;styleguide/buttons.html.erb&lt;/code&gt;, I added the following template call:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='erb'&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="n"&gt;styleguide_block&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;5.1.1&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;  &amp;lt;button class=&amp;quot;$modifier_class&amp;quot;&amp;gt;Default Button&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Note that there is a single &lt;code&gt;button&lt;/code&gt; element in the block. This is where
the magic happens, because it passes the &lt;code&gt;button&lt;/code&gt; to &lt;code&gt;styleguide_block&lt;/code&gt;,
which imports the &lt;code&gt;styleguide/block&lt;/code&gt; partial for the style guide section.&lt;/p&gt;

&lt;p&gt;The partial parses the KSS representation of the documented CSS for the
given section of the style guide (5.1.1). It prints out the section
number and SCSS filename, adds the documentation text to the page,
cycles through each CSS modifier of &lt;code&gt;button&lt;/code&gt;, and generates a new
&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; tag for each modifier. The resulting section of the style
guide will look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://stephentudor.com/images/2012-01-10-kss-and-middleman/styleguide.png" title="Style guide example" &gt;&lt;/p&gt;

&lt;p&gt;The original basic &lt;code&gt;button&lt;/code&gt; element is listed first, followed by
accurate examples of all of its documented modifiers. The KSS JavaScript
file fakes the pseudo-selectors &lt;code&gt;:hover&lt;/code&gt; and &lt;code&gt;:disabled&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Onward&lt;/h2&gt;

&lt;p&gt;For my project, at least, this is an encouraging proof-of-concept that I
plan to take forward. In the meantime, it looks like there is a generous
amount of potential in both Middleman and KSS, so be sure to check out
each of these projects.&lt;/p&gt;

&lt;p&gt;If you have used either Middleman or KSS, what has your experience been
like thus far?&lt;/p&gt;

&lt;h2&gt;Update 2012-02-04&lt;/h2&gt;

&lt;p&gt;I have pushed my working code to a &lt;a href="http://github.com/smt/middleman-kss"&gt;Github repo&lt;/a&gt;.
Some of the gems are a little out of date, but I wanted to get my
initial version up first, and then work through any issues that might
arise from updating libraries. Please let me know what you think; I&amp;#8217;m
always open to suggestions for improvement.&lt;/p&gt;

&lt;p&gt;After checking out the code, just run &lt;code&gt;middleman&lt;/code&gt; like any other
Middleman app, and browse to &lt;code&gt;http://localhost:4567&lt;/code&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/stephentudor/~4/SvYyyrjhBVk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://stephentudor.com/blog/2012/01/10/kss-and-middleman</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[10 Vim Techniques for Novices]]></title>
    <link href="http://feedproxy.google.com/~r/stephentudor/~3/9ryw_rK5Tgs/10-vim-techniques-for-novices" />
    <updated>2011-08-04T08:37:00-04:00</updated>
    <id>http://stephentudor.com/blog/2011/08/04/10-vim-techniques-for-novices</id>
    <content type="html">&lt;p&gt;Since I switched to Vim as my primary editor back in March of this year,
I have discovered a wealth of useful tricks that help me get things
done. Most of these techniques are truly indispensible, and should find
a place in any Vim user&amp;#8217;s quiver.&lt;/p&gt;

&lt;p&gt;I should also note that at this time, I&amp;#8217;m nowhere near expert-level in
my Vim abilities, so this post is intended to share some commands,
patterns, and configurations with other Vim users who are still getting
their feet wet with the editor. Experienced Vimmers will already know
all this stuff, and more power to them. This is for the Vim n00bs out
there.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h3&gt;1. Open with Cursor at Last Edit Position&lt;/h3&gt;

&lt;p&gt;This one isn&amp;#8217;t so much a technique as it is a preference. If you make a
change to a file, and then re-open it later, the following snippet in
your .vimrc will position the cursor at the last spot you made an edit
prior to closing the buffer or Vim itself:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='vim'&gt;&lt;span class='line'&gt;autocmd &lt;span class="nb"&gt;BufReadPost&lt;/span&gt; *
&lt;/span&gt;&lt;span class='line'&gt;\ &lt;span class="k"&gt;if&lt;/span&gt; line&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;\&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; line&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;\&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; line&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;\   exe &lt;span class="c"&gt;&amp;quot;normal! g`\&amp;quot;&amp;quot; |&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;\ &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;!-- " --&gt;


&lt;h3&gt;2. Visual Block Mode&lt;/h3&gt;

&lt;p&gt;You might know about Visual mode &lt;code&gt;v&lt;/code&gt;, and even Visual Line mode &lt;code&gt;V&lt;/code&gt;,
but do you know about Visual Block mode? You can enter it with &lt;code&gt;^v&lt;/code&gt;
(that&amp;#8217;s &lt;code&gt;CTRL-v&lt;/code&gt;), and then use Vim movement commands to select text
in a box of columns and rows, rather than by lines. This can allow you
to make some really powerful edits.&lt;/p&gt;

&lt;p&gt;Other editors, such as TextMate, can perform a similar blockwise
selection using the Alt/Option key. Well, MacVim can do the same thing.
Hold down Alt or Option, and click/drag with the mouse. I want to
caution you against relying on this too much, though. Vim is designed to
reward you for keeping your fingers &lt;em&gt;on the keys&lt;/em&gt; as much as possible.&lt;/p&gt;

&lt;h3&gt;3. Quick Letter Swap&lt;/h3&gt;

&lt;p&gt;If I accidentally type &amp;#8220;teh&amp;#8221; instead of &amp;#8220;the&amp;#8221;, the natural reaction
would be to go back, select those two letters, and retype them, but
there&amp;#8217;s a simple way to swap any two adjacent letters:&lt;/p&gt;

&lt;p&gt;Move the cursor to the first letter of the swapped pair (in this
example, the &amp;#8220;e&amp;#8221; of &amp;#8220;teh&amp;#8221;) and type &lt;code&gt;xp&lt;/code&gt;. This cuts the character the
cursor is on, and immediately pastes it after the next.&lt;/p&gt;

&lt;h3&gt;4. Repeat Last Edit (the magic dot)&lt;/h3&gt;

&lt;p&gt;The glorious &lt;code&gt;.&lt;/code&gt; is a very powerful command, and probably my
most-often used in this list. Typing &lt;code&gt;.&lt;/code&gt; in normal mode repeats your
most recent edit. It&amp;#8217;s dead simple to use, and just plain awesome in so
many contexts.&lt;/p&gt;

&lt;h3&gt;5. Move and Edit by Text Object&lt;/h3&gt;

&lt;p&gt;At the root of Vim&amp;#8217;s idiosyncratic design is a variety of ways to easily
move around a text file and edit it effortlessly:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;w&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; move the cursor forward and backward by &lt;em&gt;word&lt;/em&gt;.  &lt;br/&gt;
&lt;code&gt;(&lt;/code&gt; and &lt;code&gt;)&lt;/code&gt; move the cursor forward and backward by &lt;em&gt;sentence&lt;/em&gt;.  &lt;br/&gt;
&lt;code&gt;{&lt;/code&gt; and &lt;code&gt;}&lt;/code&gt; move the cursor forward and backward by &lt;em&gt;paragraph&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You can combine text objects with counts and actions to perform very
powerful, concise edits.&lt;/p&gt;

&lt;p&gt;One of my favorite commands is &lt;code&gt;ciw&lt;/code&gt;, and the pnemonic for it is Change
Inside Word. If I can get my cursor &lt;em&gt;anywhere&lt;/em&gt; in a word, it doesn&amp;#8217;t
matter which character it&amp;#8217;s on, a quick &lt;code&gt;ciw&lt;/code&gt; will cut the whole word
and change to insert mode so I can enter new text in its place. No
awkward text selection or repetitive deletion keying. Just &lt;code&gt;ciw&lt;/code&gt; and
type the new word.&lt;/p&gt;

&lt;h3&gt;6. Delete, Yank, and Paste a Line&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;dd&lt;/code&gt; will &amp;#8220;delete&amp;#8221; a line, which is the same as &lt;em&gt;cut&lt;/em&gt;.  &lt;br/&gt;
&lt;code&gt;yy&lt;/code&gt; will &amp;#8220;yank&amp;#8221; a line, which is the same as &lt;em&gt;copy&lt;/em&gt;.  &lt;br/&gt;
&lt;code&gt;p&lt;/code&gt; will paste at the line &lt;em&gt;below&lt;/em&gt; the cursor.  &lt;br/&gt;
&lt;code&gt;P&lt;/code&gt; or &lt;code&gt;SHIFT-p&lt;/code&gt; will paste at the line &lt;em&gt;above&lt;/em&gt; the cursor.&lt;/p&gt;

&lt;p&gt;Any of these commands can be preceded by a numeric count: &lt;code&gt;10p&lt;/code&gt; will
paste 10 times.&lt;/p&gt;

&lt;h3&gt;7. Easy Repeated Characters&lt;/h3&gt;

&lt;p&gt;Say I am working in Markdown format &amp;#8211; which I often am; these blog posts
are is written that way &amp;#8211; and I want to use an underline-style H2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;This is my heading
==================
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I would prefer not to have to type who-knows-how-many equals signs in a
row. How annoying. Luckily, something like this is dead simple in Vim.&lt;/p&gt;

&lt;p&gt;After typing your header, exit to normal mode and, with your cursor
still on the line, type &lt;code&gt;yyp&lt;/code&gt; to duplicate the line. The text now looks
like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;This is my heading
This is my heading
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;At this point, your cursor should on the first character of the second
line. Type &lt;code&gt;v$r=&lt;/code&gt; to visually select the text to the end of the line,
and replace all the characters with equals signs. That&amp;#8217;s it: the full
command is &lt;code&gt;yypv$r=&lt;/code&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Honza Pokorny &lt;a href="http://stephentudor.com/blog/2011/08/04/10-vim-techniques-for-novices#comment-277354134"&gt;points out&lt;/a&gt;
a shorter alternative to this command: &lt;code&gt;YpVr=&lt;/code&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Santosh Kumar &lt;a href="http://stephentudor.com/blog/2011/08/04/10-vim-techniques-for-novices#comment-277459396"&gt;observes&lt;/a&gt;
that &lt;code&gt;V&lt;/code&gt; may not be able to replace &lt;code&gt;v$&lt;/code&gt; in every situation,
particularly if there is whitespace at the beginning of the line.&lt;/p&gt;

&lt;p&gt;If you ever just want 80 stars in a row, say, to section off a part of
source code, you could just type &lt;code&gt;80i*&amp;lt;Esc&amp;gt;&lt;/code&gt; &amp;#8211; easy.&lt;/p&gt;

&lt;h3&gt;8. Quick Find&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/&lt;/code&gt; will switch to a mode that allows you to enter a search string
for the current buffer. If you have the proper settings in your .vimrc,&lt;/p&gt;

&lt;p&gt;Vim will even do an incremental search. When you have the search term
you want, hit &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;/code&gt; and cycle forward through the search results &lt;em&gt;in
the buffer&lt;/em&gt; with &lt;code&gt;n&lt;/code&gt;, and backwards with &lt;code&gt;N&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;?&lt;/code&gt; does the same thing as &lt;code&gt;/&lt;/code&gt;, only in the reverse direction.
You can also use &lt;code&gt;*&lt;/code&gt; to quick-search the word your cursor is
currently on.&lt;/p&gt;

&lt;p&gt;For some sane defaults, here are some of my .vimrc search settings:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='vim'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;hlsearch&lt;/span&gt;   &lt;span class="c"&gt;&amp;quot; Highlight search matches&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;incsearch&lt;/span&gt;  &lt;span class="c"&gt;&amp;quot; Highlight matches as you type&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;ignorecase&lt;/span&gt; &lt;span class="c"&gt;&amp;quot; Case-insensitive searching&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;smartcase&lt;/span&gt;  &lt;span class="c"&gt;&amp;quot; ...but case-sensitive if expression has caps&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;wrapscan&lt;/span&gt;   &lt;span class="c"&gt;&amp;quot; Set the search scan to wrap around the file&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;&amp;quot; Press space bar to turn off search highlighting&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c"&gt;&amp;quot; and clear any message displayed&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Space&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; :&lt;span class="k"&gt;nohl&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Bar&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;:echo&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;9. Search &amp;amp; Replace in a Buffer&lt;/h3&gt;

&lt;p&gt;Few of us can really consider ourselves experts with regular
expressions, but if you have ever used them for any kind of text
processing task, you realize how incredibly powerful (and yes, sometimes
befuddling) they can be. Regexes are used in Vim&amp;#8217;s native search and
replace.&lt;/p&gt;

&lt;p&gt;It is necessary to specify a range when doing a search and replace, and
generally, you will want the action to be global, so you would type
&lt;code&gt;:%s/pattern/replacement/g&lt;/code&gt; and hit &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;/code&gt;. Done. The &lt;code&gt;%&lt;/code&gt;
represents the entire buffer, while the &lt;code&gt;s///g&lt;/code&gt; structure is the
standard search and replace command syntax.&lt;/p&gt;

&lt;p&gt;To search/replace within a given selection, first select your desired
range in visual mode, then hit &lt;code&gt;:&lt;/code&gt;. Vim will pre-fill your range as
&lt;code&gt;'&amp;lt;,'&amp;gt;&lt;/code&gt;, which means the current selection. Use the same &lt;code&gt;s///g&lt;/code&gt;
syntax as before to restrict the action to the selection you specified.&lt;/p&gt;

&lt;p&gt;The trailing &lt;code&gt;/g&lt;/code&gt;? That&amp;#8217;s an option that I usually like to pass, as it
tells Vim to replace all matches, not just the first one.&lt;/p&gt;

&lt;h3&gt;10. Project Search &amp;amp; Replace&lt;/h3&gt;

&lt;p&gt;It&amp;#8217;s a common complaint: project search &amp;amp; replace &amp;#8211; an operation
that spans one or more files &amp;#8211; is one of the few glaring weaknesses of
Vim. Until there is better support for this feature in Vim itself, it is
possible to pull off in an unorthodox way: don&amp;#8217;t use Vim! Try this on
for size (from the command line):&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sh'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;sed -i &lt;span class="s1"&gt;&amp;#39;s/pattern/replacement/&amp;#39;&lt;/span&gt; &amp;lt;files&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;From within Vim, while in &lt;code&gt;:&lt;/code&gt; command mode, you can use the same
command, only beginning with a &lt;code&gt;!&lt;/code&gt;. This pipes the command directly
to a shell session and does the business. Note the relative consistency
of sed&amp;#8217;s search &amp;amp; replace syntax with Vim&amp;#8217;s native one.&lt;/p&gt;

&lt;p&gt;Passing commands from Vim to external programs is common, and often
encouraged. Select some text and run the &lt;code&gt;:sort&lt;/code&gt; command on it sometime
&amp;#8211; it actually calls the external &lt;code&gt;sort&lt;/code&gt; program, which passes the
sorted lines back to Vim.&lt;/p&gt;

&lt;h2&gt;My dotvim&lt;/h2&gt;

&lt;p&gt;I wouldn&amp;#8217;t consider &lt;a href="http://github.com/smt/dotvim"&gt;my Vim configuration&lt;/a&gt;
to be anything special, but it&amp;#8217;s mine, and I am always tweaking it (you
Vim people know what I&amp;#8217;m talking about). If you are curious about what I
might have in there, you can feel free have a look at it &amp;#8211; it&amp;#8217;s on
GitHub, of course, and all the plugins are set up as Git submodules with
Pathogen.&lt;/p&gt;

&lt;h2&gt;Dive into Vim!&lt;/h2&gt;

&lt;p&gt;The nuts and bolts of how to use Vim are, of course, outside the scope
of this article. &lt;a href="http://vimcasts.org"&gt;VimCasts&lt;/a&gt;, &lt;a href="http://peepcode.com/products/smash-into-vim-i"&gt;PeepCode&lt;/a&gt;,
and Vim&amp;#8217;s built-in tutorial are at your disposal. That being said, I&amp;#8217;m
willing to attempt to answer most questions you might have about Vim,
either on &lt;a href="http://twitter.com/tudorstudio"&gt;Twitter&lt;/a&gt; or via the comments.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/stephentudor/~4/9ryw_rK5Tgs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://stephentudor.com/blog/2011/08/04/10-vim-techniques-for-novices</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[OOCSS, For Great Justice]]></title>
    <link href="http://feedproxy.google.com/~r/stephentudor/~3/czM0zaOh9fs/oocss-for-great-justice" />
    <updated>2011-07-17T13:55:00-04:00</updated>
    <id>http://stephentudor.com/blog/2011/07/17/oocss-for-great-justice</id>
    <content type="html">&lt;p&gt;In my &lt;a href="http://stephentudor.com/blog/2011/07/09/responsible-sass-authoring"&gt;previous post&lt;/a&gt;, I
hinted at a growing concern with CSS performance. Among those pioneering
ways to approach the issue of maintainable-yet-efficient CSS is &lt;a href="http://twitter.com/stubbornella"&gt;Nicole Sullivan&lt;/a&gt;,
who is perhaps best known for her open source &lt;a href="http://oocss.org"&gt;Object-Oriented CSS&lt;/a&gt;
project.&lt;/p&gt;

&lt;h2&gt;Object-Oriented? CSS?&lt;/h2&gt;

&lt;p&gt;I have to admit that when I first checked out out OOCSS, I guffawed.
While it&amp;#8217;s true that, at first blush, CSS does not have many of the
traditional features of a genuine OO programming language, Nicole has
been exploring ways in which CSS&amp;#8217; inheritance/cascade can be analogous
to OO concepts.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s taken me quite some time to come around. There are things in the
OOCSS code base that seem to fly in the face of commonly-accepted CSS
best practices. It is precisely this kind of resistance in the community
that must have prompted Nicole to deliver her latest talk this year at
Webstock, entitled &lt;a href="http://www.webstock.org.nz/talks/speakers/nicole-sullivan/css-tools-massive-websites"&gt;Our Best Practices Are Killing Us&lt;/a&gt; (&lt;a href="http://www.slideshare.net/stubbornella/our-best-practices-are-killing-us"&gt;slides&lt;/a&gt;).&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h2&gt;Semantics Pitfall&lt;/h2&gt;

&lt;p&gt;For the past several years, I have been painstakingly crafting HTML and
CSS under the banner of &amp;#8220;best practices.&amp;#8221; Currently, one such practice
has been to aggressively scope CSS by content type.&lt;/p&gt;

&lt;p&gt;Martin Sutherland &lt;a href="http://sunpig.com/martin/archives/2008/10/07/maintainable-css-modular-to-the-max.html"&gt;describes this approach&lt;/a&gt;
better and more succinctly than I could, but just recently &lt;a href="http://www.sunpig.com/martin/archives/2011/06/25/oocss-and-html-semantics.html"&gt;recanted in favor of OOCSS&lt;/a&gt;.
Martin had watched Nicole&amp;#8217;s talk, and it appears to have had the same
effect on him as it had on me. He writes:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;One of the hardest hurdles to leap in coming to like OOCSS was the&lt;br/&gt;somewhat heretical notion of adding &amp;#8220;non-semantic&amp;#8221; container elements&lt;br/&gt;and apparently &amp;#8220;presentational&amp;#8221; classnames to my HTML.&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;Martin Sutherland&lt;/strong&gt; &lt;cite&gt;&lt;a href='http://www.sunpig.com/martin/archives/2011/06/25/oocss-and-html-semantics.html'&gt;www.sunpig.com/martin/archives/&amp;hellip;&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;


&lt;p&gt;Martin &lt;a href="http://www.sunpig.com/martin/archives/2011/06/25/oocss-and-html-semantics.html"&gt;goes on to propose&lt;/a&gt;
(and I think he&amp;#8217;s right on target here) that there are multiple layers
of semantics that belong in HTML:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Structural semantics (core HTML elements)&lt;/li&gt;
&lt;li&gt;Ontological semantics (domain-specific meaning beyond core HTML)&lt;/li&gt;
&lt;li&gt;Visual semantics (representing visual intent)&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;img class="left" src="http://stephentudor.com/images/2011-07-17-oocss-for-great-justice/pitfall.jpeg" title="Pitfall Harry" &gt;&lt;/p&gt;

&lt;p&gt;Lest we forget, one of the core purposes of CSS &lt;strong&gt;is&lt;/strong&gt; to communicate
the &lt;a href="http://www.stubbornella.org/content/2010/06/12/visual-semantics-in-html-and-css/"&gt;visual semantics&lt;/a&gt;
of an HTML document. Many developers, myself included, have written many
projects&amp;#8217; worth of CSS that attempts to use only core HTML (structural)
and domain-specific (ontological) semantics, while sidestepping the role
that visual semantics ought to play, out of fear that we&amp;#8217;d be
introducing the ultimate evil into our source code, &lt;em&gt;presentational
classnames&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It is becoming more clear to me that we should not avoid the question of
visual semantics in our CSS. The result of our having done so is visual
style that is tightly bound to the content.&lt;/p&gt;

&lt;p&gt;Now, hearken back to the primitive days of yore when it was commonplace
(and accepted) to see &lt;code&gt;&amp;lt;font&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;u&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;center&amp;gt;&lt;/code&gt; tags in HTML
source.  It&amp;#8217;s another example of presentation coupled with content,
only in a more obviously wrong form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the intertwining of visual style and content not one of the
problems, nay, &lt;em&gt;the&lt;/em&gt; problem, that CSS was intended to address in the
first place?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It seems to me that many of us are doing it wrong when we refuse to
implement some level of visual semantics in our CSS and HTML.  Because
of the belief that we&amp;#8217;re following &amp;#8220;best practices,&amp;#8221; we are robbing
ourselves of opportunities to abstract out common styles into reusable
patterns, and our projects suffer for it.&lt;/p&gt;

&lt;h2&gt;For Great Justice&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve watched as some developers have begun to &lt;a href="http://lazukars.com/post/7300553347/brain-vs-object-oriented-css"&gt;wrestle with the concepts of OOCSS&lt;/a&gt;
vs. what we have come to know as the industry standard practice of
writing CSS in recent years.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://stephentudor.com/images/2011-07-17-oocss-for-great-justice/ZeroWing.png" title="ZeroWing" &gt;&lt;/p&gt;

&lt;p&gt;Watch Nicole&amp;#8217;s OOCSS talks, and allow them ample time to marinate.
Check out the &lt;a href="http://github.com/stubbornella/oocss"&gt;source&lt;/a&gt; of the
&lt;a href="http://oocss.org"&gt;OOCSS project&lt;/a&gt;. I&amp;#8217;m still in process myself, as I
continue to look for ways to strike the delicate balance between
&lt;em&gt;appropriate&lt;/em&gt; visual semantics in CSS and blatantly presentational
naming.&lt;/p&gt;

&lt;p&gt;Not everything in OOCSS is a great idea to implement verbatim.  Remember
that it is proof of concept and a collection of patterns, not a CSS
boilerplate. I am still mildly horrified every time I see how &lt;code&gt;&amp;lt;b&amp;gt;&lt;/code&gt; tags
are used for rounded corners in the &lt;a href="http://oocss.org/module.html"&gt;module example&lt;/a&gt;,
but I remind myself that the concepts are what make up OOCSS, not the
specific implementation of the examples.&lt;/p&gt;

&lt;p&gt;Finally, I have linked to Martin&amp;#8217;s &lt;a href="http://www.stubbornella.org/content/2010/06/12/visual-semantics-in-html-and-css/"&gt;article on OOCSS&lt;/a&gt;
in several places throughout this post. It really is required reading if
you author CSS as part of your day job.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/stephentudor/~4/czM0zaOh9fs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://stephentudor.com/blog/2011/07/17/oocss-for-great-justice</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[DNS Fail]]></title>
    <link href="http://feedproxy.google.com/~r/stephentudor/~3/vinmdodZd-M/dns-fail" />
    <updated>2011-07-10T14:54:00-04:00</updated>
    <id>http://stephentudor.com/blog/2011/07/10/dns-fail</id>
    <content type="html">&lt;p&gt;To those who tried to visit this site only to get a 404 error in the
last 24 hours, I apologize. I believe DNS propagation was the culprit,
and I jumped the gun by announcing that my post was up. I was able to
view stephentudor.com just fine, but quickly found that several people,
including my lovely wife, could not even get to the site initially.&lt;/p&gt;

&lt;p&gt;By this time, it appears that most folks have been able to access it. If
you can see this post, you&amp;#8217;re fine. Otherwise, you&amp;#8217;re probably in the
camp that is left wondering why &lt;a href="http://stephentudor.com//twitter.com/tudorstudio/status/89876273408655360"&gt;this joker posted a 404 URL to Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Again, mea culpa. I&amp;#8217;ll know better next time :)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/stephentudor/~4/vinmdodZd-M" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://stephentudor.com/blog/2011/07/10/dns-fail</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Responsible Sass Authoring]]></title>
    <link href="http://feedproxy.google.com/~r/stephentudor/~3/Du8ixDqDkK4/responsible-sass-authoring" />
    <updated>2011-07-09T13:04:00-04:00</updated>
    <id>http://stephentudor.com/blog/2011/07/09/responsible-sass-authoring</id>
    <content type="html">&lt;p&gt;In capable hands, &lt;a href="http://stephentudor.com//sass-lang.org"&gt;Sass&lt;/a&gt; can do amazing things for your
CSS. With Sass, you can use functions and variables that later get
compiled into valid CSS. This can greatly reduce code repetition and
the potential for mistakes.&lt;/p&gt;

&lt;p&gt;For example, not that you would, but you could write some Sass like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-1.sass)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-1.sass'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sass'&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// Set a couple of vars&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$titleColor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#000&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$titleSize&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.article&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nc"&gt;.title&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$titleColor&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$titleSize&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nc"&gt;.alt-title&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;border-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="no"&gt;solid&lt;/span&gt; &lt;span class="nf"&gt;lighten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$titleColor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;// #ccc&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;transparentize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lighten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$titleColor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nc"&gt;.sub-title&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$titleSize&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;// 20.4px&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="na"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;transparentize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;change-color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$titleColor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$red&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The resulting CSS might look something like this, depending upon how you
set your Sass output style preference:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-1.css)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-1.css'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='css'&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.article&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.article&lt;/span&gt; &lt;span class="nc"&gt;.alt-title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.article&lt;/span&gt; &lt;span class="nc"&gt;.sub-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.article&lt;/span&gt; &lt;span class="nc"&gt;.alt-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;border-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="k"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#cccccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;51&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;51&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;51&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.article&lt;/span&gt; &lt;span class="nc"&gt;.sub-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.article&lt;/span&gt; &lt;span class="nc"&gt;.sub-title&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Pretty cool, right? You can see that the &lt;code&gt;@extend&lt;/code&gt; keyword can be a very
powerful tool, bringing a quasi-object-oriented paradigm to our CSS. The
same could be true for the nested selectors; you just have to refer to
&lt;code&gt;.article&lt;/code&gt; once, and let the indentation take care of the scope for
you.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h2&gt;CSS Bloat&lt;/h2&gt;

&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='Just because Sass allows you to do something, doesn&amp;rsquo;t mean it should be&amp;nbsp;done. '&gt;
Over a year of using Sass every day at my day job has
taught me this: Just because Sass allows you to do something, doesn&amp;rsquo;t mean it should be&amp;nbsp;done.&lt;/p&gt;

&lt;p&gt;Sass clearly offers many ways to make our lives easier as developers.
The benefits of using it are obvious and many. &lt;code&gt;@import&lt;/code&gt; is awesome; it
lets us concatenate many development Sass files into one production CSS
file if we wish. Variables and mixins can be amazingly handy.&lt;/p&gt;

&lt;p&gt;Selector nesting, &lt;code&gt;@extend&lt;/code&gt;, and parent-selector (&amp;amp;), while
incredibly useful when care is taken, can also be prone to generate
sub-optimal CSS when used carelessly, &lt;em&gt;especially&lt;/em&gt; in cases where they
are used in combination. Long-term, CSS that is compiled from Sass that
abuses these features can quickly become extremely bloated and
challenging to maintain.  Let&amp;#8217;s take a look at some examples of some
really sad CSS. The examples I&amp;#8217;m using are inspired by actual projects
I&amp;#8217;ve worked on (with some key edits to protect the innocent).
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note that I&amp;#8217;m not blaming Sass itself for any of these problems. It&amp;#8217;s
quite simply that using some Sass features in a certain way can
inadvertantly amplify poor CSS design decisions.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Case 1&lt;/h3&gt;

&lt;p&gt;Sass selectors that are nested like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-2.sass)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-2.sass'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sass'&gt;&lt;span class='line'&gt;&lt;span class="nn"&gt;#product&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nc"&gt;.overview&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nc"&gt;.header&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nt"&gt;h2&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nt"&gt;span&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nc"&gt;.content&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="nc"&gt;.promo&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nc"&gt;.header&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nt"&gt;div&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="nc"&gt;.inner&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="nt"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="nt"&gt;span&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;will result in CSS descendant selectors that look something like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-2.css)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-2.css'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='css'&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="nc"&gt;.promo&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="nc"&gt;.promo&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="nc"&gt;.promo&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="nc"&gt;.promo&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="nc"&gt;.inner&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="nc"&gt;.promo&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="nc"&gt;.inner&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nf"&gt;#product&lt;/span&gt; &lt;span class="nc"&gt;.overview&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="nc"&gt;.promo&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="nc"&gt;.inner&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Yuck. I&amp;#8217;m not going to go into why this is bad, but you don&amp;#8217;t have to
take my word for it; simply google &amp;#8221;&lt;a href="http://stephentudor.com//www.google.com/search?q=css+performance+descendant+selectors"&gt;CSS performance descendant selectors&lt;/a&gt;&amp;#8221;
and read up.&lt;/p&gt;

&lt;p&gt;With Sass, this kind of CSS bloat is extremely easy to cause if you get
carried away with selector nesting. Observe the redundancy and the
verbosity of the generated CSS. If the developer had taken the time to
carefully construct his selectors, he could have avoided the need for
this many levels of descendants in his CSS.&lt;/p&gt;

&lt;p&gt;To my great shame, that developer was yours truly.&lt;/p&gt;

&lt;h3&gt;Case 2&lt;/h3&gt;

&lt;p&gt;This one combines the &lt;code&gt;@extend&lt;/code&gt;, nesting, and parent-selector features
of Sass. &lt;code&gt;@extend&lt;/code&gt; has been one of my favorite features of Sass ever
since it was added. It lets you inherit the properties of one selector
in another.  Here&amp;#8217;s how it can go awry, despite all the best intentions.
The Sass:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-3.sass)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-3.sass'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sass'&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.clearfix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;both&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;.&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;block&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;line-height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;overflow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;hidden&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-1&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.clearfix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-2&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.clearfix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-99&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.clearfix&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-100&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.clearfix&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;In the Sass, let&amp;#8217;s assume I extended &lt;code&gt;.clearfix&lt;/code&gt; in 100 separate
selectors at various places throughout my code. This is, unfortunately,
a very realistic use case for something as commonly used as a clearfix,
and as my project grows, it would eventually result in the following
generated CSS:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-3.css)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-3.css'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;span class='line-number'&gt;49&lt;/span&gt;
&lt;span class='line-number'&gt;50&lt;/span&gt;
&lt;span class='line-number'&gt;51&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='css'&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.clearfix&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-11&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-12&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-14&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-18&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-19&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-20&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-21&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-22&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-23&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-25&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-26&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-27&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-28&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-29&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-31&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-32&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-33&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-34&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-35&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-36&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-37&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-38&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-39&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-40&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-41&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-42&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-43&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-44&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-45&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-46&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-47&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-48&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-49&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-50&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-51&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-52&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-53&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-54&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-55&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-56&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-57&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-58&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-59&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-60&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-61&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-62&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-63&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-64&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-65&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-66&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-67&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-68&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-69&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-70&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-71&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-72&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-73&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-74&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-75&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-76&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-77&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-78&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-79&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-80&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-81&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-82&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-83&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-84&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-85&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-86&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-87&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-88&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-89&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-90&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-91&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-92&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-93&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-94&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-95&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-96&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-97&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-98&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-99&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-100&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.clearfix&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-1&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-2&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-3&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-4&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-5&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-6&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-7&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-8&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-9&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-10&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-11&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-12&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-13&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-14&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-15&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-16&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-17&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-18&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-19&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-20&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-21&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-22&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-23&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-24&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-25&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-26&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-27&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-28&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-29&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-30&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-31&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-32&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-33&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-34&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-35&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-36&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-37&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-38&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-39&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-40&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-41&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-42&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-43&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-44&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-45&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-46&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-47&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-48&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-49&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-50&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-51&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-52&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-53&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-54&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-55&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-56&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-57&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-58&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-59&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-60&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-61&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-62&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-63&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-64&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-65&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-66&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-67&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-68&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-69&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-70&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-71&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-72&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-73&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-74&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-75&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-76&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-77&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-78&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-79&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-80&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-81&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-82&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-83&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-84&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-85&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-86&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-87&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-88&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-89&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-90&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-91&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-92&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-93&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-94&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-95&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.thing-96&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-97&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-98&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-99&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.thing-100&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;clear&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;both&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;line-height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;overflow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;First, there is a nesting issue. Because I nested &lt;code&gt;&amp;amp;:after&lt;/code&gt; inside an
empty parent selector, the generated CSS contains a huge list of
selectors with no properties, then a second huge list with the clearfix
styles. Plus, all these bogus selectors tend to clog up dev tools like
Firebug, as shown in this screenshot:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://stephentudor.com/images/2011-07-09-responsible-sass-authoring/extend-clearfix-firebug-hell.png" alt="@extend .clearfix Firebug hell" /&gt;&lt;/p&gt;

&lt;p&gt;Secondly, this could have all been avoided if I had been more pragmatic
and simply used &lt;code&gt;.clearfix&lt;/code&gt; (or another class &amp;ndash; I commonly use
&lt;code&gt;.group&lt;/code&gt;) in the HTML to apply the CSS and make it semantically
meaningful at the same time. Using &lt;code&gt;@extend&lt;/code&gt; is not the correct choice
for this particular pattern:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-4.sass)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-4.sass'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sass'&gt;&lt;span class='line'&gt;&lt;span class="nc"&gt;.group&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;both&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;.&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;block&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;line-height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;overflow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;hidden&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// That&amp;#39;s right, I&amp;#39;m not using @extend here.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// It&amp;#39;s almost like I&amp;#39;m using actual CSS \o/&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt; (example-4.html)&lt;/span&gt; &lt;a href='http://stephentudor.com/downloads/code/2011-07-09-responsible-sass-authoring/example-4.html'&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;thing-1 group&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c"&gt;&amp;lt;!-- stuff floated left --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;primary-content&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c"&gt;&amp;lt;!-- stuff floated right --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;lt;aside&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;secondary-content&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nt"&gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Sass =&amp;gt; CSS&lt;/h2&gt;

&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='It&amp;rsquo;s important to remember that no matter what you do in Sass, it will eventually end up as&amp;nbsp;CSS. '&gt;
I, for one, side with those who seek to balance CSS performance concerns
with maintainability concerns.
It&amp;rsquo;s important to remember that no matter what you do in Sass, it will eventually end up as&amp;nbsp;CSS.
Whether it does more harm than good will be up to you.&lt;/p&gt;

&lt;p&gt;Ironically, though it might seem at first that we have veered too far
towards the maintainability side of the spectrum with our CSS, it turns
out that the status quo isn&amp;#8217;t terribly well suited for either
maintainability or performance.
&lt;/span&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/stephentudor/~4/Du8ixDqDkK4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://stephentudor.com/blog/2011/07/09/responsible-sass-authoring</feedburner:origLink></entry>
  
</feed>

