
Writing Less Code - fiatjaf
http://www.heydonworks.com/article/on-writing-less-damn-code
======
zeveb
> Do you remember ever enjoying using/reading a website with more than two
> columns? I don’t.

Another one of the things I really miss about the pre-JavaScript, pre-CSS,
document-oriented (as opposed to the current experience-oriented) web is being
able to make my browser window half or a third of my screen, and having
documents be eminently readable. That was really, _really_ nice. Try it now,
though, and nothing really works correctly. Which is weird, because a third-
width window on a laptop or desktop has roughly the same proportions as a
phone in vertical layout.

~~~
qwertyuiop924
Oh, god yes. If you need a special, mobile only site, you're doing it wrong.
HN is living proof.

~~~
leeoniya
> HN is living proof.

of what? that you don't need a separate mobile site (or js) to show a most
basic wall of text?

open up amazon.com or walmart.com and see how your justification holds up.
certainly, there are simple layouts with sparse content that can be made
responsive easily (blogs, image portfolios, etc) but this is a far cry from
proof that a broad statement is at all applicable.

~~~
coldtea
> _of what? that you don 't need a separate mobile site (or js) to show a most
> basic wall of text?_

Most sites only need to show just that. And fail miserably at it.

> _open up amazon.com or walmart.com and see how your justification holds up._

90% of sites are content based, not Amazon or Walmart. And even then could do
with a much simpler layout.

~~~
paulddraper
Those are a pretty important 10%.

------
1_player
The Margin (* + *) and Font Size (font-size: calc(1em + 1vw)) declarations are
really cool, it's the first time I read about them.

What do more experienced designers think of them? Handling spacing between
elements is usually a pain (should I add margin on the top, or the bottom?),
and font sizes proportional to the display width is IMO genius, so why aren't
these declarations used more often?

EDIT: the article title is a little unfortunate, I thought it was about the
modern Javascript ecosystem and that every tool has to have some kind of
plugin system, modularity, extensibility, and require a ton of boilerplate to
fit your 3-file website. Or that's what I expected, anyway.

~~~
jordanlev
I want to love every technique like this (or their more involved cousins like
a typography "vertical rhythm" system)... but when it comes time to build
sites with some visual and/or layout complexity (for a business client, not a
blog that's a relatively simple stream of primarily-text articles), I always
wind up with so many exceptions to the rule that I find these catch-all
declarations to just be one more thing I'm working around.

For me, the single most useful technique I've discovered in the past few years
has been "drop the 'C' in 'CSS'" and instead think in terms of modular
components with virtually no cascading or selector nesting. E.g. BEM. Getting
over the aesthetic ugliness of "class-itis" in my markup has freed me from a
ton of agony trying to reason about why certain elements on the page are being
styled a certain way.

~~~
1_player
> BEM

I'm partial to rscss ([http://rscss.io](http://rscss.io)) although that's
another "technique" that doesn't seem to be used a lot in the wild. Just makes
sense to me.

~~~
piotrkubisa
Thanks you for sharing CSS structure guide, It is very interesting, but I
found a drawback based on my experience when the role of "person responsible
the look & feel" is shared between team-mates. Some developers (who raised up
when jQuery was must-be library in any project) have practice to supply
implicit class selector i.e. when they search elements with class name '.link'
via document.querySelector. I like the rscss(-like) way, because BEM which is
very difficult to follow for newbies (especially now, when react is so
popular). But, hey is it a next competitive standard as in famous xkcd [1]?

[1]: [https://xkcd.com/927/](https://xkcd.com/927/)

------
qwertyuiop924
This is coding 101: Write/include only the code you need. No more, no less. To
quote ESR (as much as I hate doing so), "Don't just do something, stand
there!"

And yes, security and error checking are necessary. Anybody who says otherwise
should be drawn, quartered, shot, and fired.

As much as I like this post, a framework sometimes has some value. If you're
writing a true SPA, it'll only be loaded once, and something like React or
Mithril is nice for a bit of structure. Mithril in particular, due to its
small size, is handy.

~~~
omni
> To quote ESR (as much as I hate doing so), "Don't just do something, stand
> there!"

I tried to figure out what ESR meant here and after a minute of Googling I'm
guessing it's Eric S. Raymond[1]. Please consider not using uncommon acronyms
on online forums, it obscures your meaning.

[1]
[http://www.catb.org/esr/writings/taoup/html/ch12s01.html](http://www.catb.org/esr/writings/taoup/html/ch12s01.html)

~~~
qwertyuiop924
ESR is a fairly common abreviation. Just like RMS, K&R, SICP, BDFL, BNF, TAOCP
(aka Knuth), XHR, AFAIK, and RTFM.

~~~
AceJohnny2
I'm glad you included RMS, but what about JWZ [1], GKH [2] or JGC [3] ? :]

[1] [https://www.jwz.org/about.html](https://www.jwz.org/about.html)

[2]
[https://plus.google.com/+gregkroahhartman](https://plus.google.com/+gregkroahhartman)

[3] [http://blog.jgc.org/](http://blog.jgc.org/)

~~~
viraptor
And DHH (David Heinemeier Hansson)

~~~
qwertyuiop924
Yep, but don't forget KT and DMR.

------
jessaustin
What about changing this from TFA:

    
    
      <input type="checkbox" id="checkbox1" name="checkbox1">
      <label for="checkbox1">My checkbox label</label>
    

to this?

    
    
      <label><input type="checkbox" name="checkbox1"> My checkbox label</label>
    

I'm sure there are styling implications, but often one doesn't care about
those. "Don't repeat yourself" seems like a rule that goes along with "write
less code".

~~~
EdSharkey
There is goodness to putting your label tag, with the for attribute that
points to the input, AFTER the input tag in the DOM that you may not be aware
of!

Here are some selectors you can use with that setup:

    
    
       input + label { ... }
       input ~ label { ... }
       input:checked + label { ... }
       input:checked ~ label { ... }
    

Those selectors let you style the label based on the STATE of the checkbox,
and they work all the way back to IE7. This stateful CSS is very powerful
because you can make the input tag visibly hidden and style your label tag to
appear as a custom widget or checkbox - and have it look different when
toggled. Take a look at html5 boilerplate's visuallyhidden CSS class to see a
particularly ninja way of hiding an element. Think of what can you achieve
with just CSS and markup that maybe you needed jQuery or JavaScript to achieve
in the past!

By the way, using the visuallyhidden class is the ideal way of hiding a
tabbable element like a checkbox while keeping it adjacent in the flow to its
related elements. This method of hiding is especially kind to low vision users
of your site who use tab to navigate your forms.

From an accessibility standpoint, having label-with-for is helpful to screen
readers of varying quality out in the wild. label-with-for ensures the screen
readers will never be mistaken about which label goes with which checkbox.

.visuallyhidden, input:checked, label-with-for, and the +, ~, and >
combinators, plus WAI-ARIA attributes can be used to make visually appealing,
yet accessible, widgets without JavaScript.

~~~
jessaustin
Thanks for all this; I was hoping for some replies like this when I posted my
comment. I guess I haven't needed to hide stuff in precisely that way. Of
course there's no parent selector in CSS, but if we have something like this:

    
    
      <label><input type="checkbox" name="cb"> <span>My checkbox label</span></label>
    

then we can have this:

    
    
      label input:checked + span { ... }
    

Maybe that <span> is more sinfully extravagant than a "for" attribute, but it
seems DRYer to me.

[EDIT:] It seems sibling comment had the same idea while I was testing this on
the other tab.

~~~
EdSharkey
Right, the span in this case is an extra tag that you don't need. Nesting an
input tag under label has always struck me as having ambiguous meaning. Are
you saying that the checkbox "belongs to" the label, or maybe "is a child of"
label? Shouldn't it be the other way around, if anything?

One of the accessibility guidelines of the WCAG is that content in your markup
MUST flow in the same direction as it is rendered on your page. This is
recommended so that screen readers will read the page aurally in the same way
as a sighted-user would read the page visually. If you follow that guideline,
then placing your input tag before the associated label tag in the DOM usually
makes sense because that is a common visual ordering for those elements.

The 'for' attribute in the label tag has semantic value that the span doesn't,
you're just adding that span so that you can use the CSS combinators. If I
squint, you're DRY, but once I unsquint I think YAGNI. :)

Seriously though, it really is a social good to strive to make your page
content accessible both stylistically (for the low vision users, color blind
users, etc.) and semantically (for the screen reader users).

~~~
jessaustin
ISTM checkboxes are the only input type for which it's more natural for the
label to come after the input.

An input inside a label has had an unambiguous meaning for decades. Why
haven't screen readers caught up?

~~~
EdSharkey
It's not a matter of screen readers catching up, it's a matter of blind folks
not having the latest tech or being stuck on an ancient version of a screen
reader/browser combo. They maybe don't have helpful IT resources in their
lives or money to help them upgrade? It's actually a big bummer. There is
virtue in making pages that gracefully degrade but still deliver the goods on
legacy platforms.

I believe the :checked pseudo-selector is only useful on radio and checkbox.
It's just serendipitous that the common visual ordering matches the useful DOM
element ordering for CSS styling in those cases.

I would expect label to come earlier in the DOM for other types of form
elements so we could be compliant with the WCAG and we would still rely on the
for attribute to link the two tags together for the screen readers.

~~~
jessaustin
Implicit label association was documented in _1997_. [0] It is unlikely that
screen reader software from that time is still in use; is anyone still using
Windows 95? Web developers have at times been fairly ruthless in ending
support for e.g. IE 8 based on empirical measures of browser use. [1] Blind
users are already a relatively small percentage of all users, and the quality
of available "opt-in" screen reader surveys seems a bit lacking, so it seems
possible that the problems you describe are actually experienced by very few
people. The other possibility would be that commercial reader distributors in
"maintenance mode" spend more time lobbying accessibility organizations and
discouraging the use of standards-compliant free software than they do
maintaining their own software. Whatever the case, ISTM developers who care
about blind users might better use their time helping to improve the screen
reading capabilities of standards-compliant browsers rather than redefining
standards to coincide with the capabilities of outmoded screen readers.

Just my two cents; clearly I don't care as much about this stuff as you do.
Good luck!

:checked is also relevant for <select>/<option> tags.

[0] [https://www.w3.org/TR/WD-
html40-970917/interact/forms.html#h...](https://www.w3.org/TR/WD-
html40-970917/interact/forms.html#h-18.2.5)

[1] [http://caniuse.com/usage-table](http://caniuse.com/usage-table)

~~~
EdSharkey
Yeah, it is a problem ... blind users on Windows XP or vista is not unheard
of. Vista shipped with ie7, if you can believe it.

Modern screen readers are really great and standards-friendly. There are even
fully featured free/open source options. The problem really is disabled users
stranded on old platforms.

It is very common for users with disabilities to not want to disclose their
disabilities to websites. Very common to see low vision users use an
independent magnifier tool rather than the browser zoom, for instance. Screen
reader software is not detectable on the user's browser. So hoping to get a
good count of users with disabilities visiting your site is going to be
fraught with difficulties.

The kindest thing you can do from a web design standpoint for people with
disabilities would be to read the WCAG, understand the issues and tradeoffs,
and make tweaks to the way you form your markup and styles to conform, where
you are able.

I learned about all this stuff while working on a public utility's website
that got sued by a disabled persons' legal rights group who (legitimately)
argued and won a case where they claimed the site was inaccessible to screen
reader users. The site was totally atrocious, legacy Struts cruft, and we got
to do a full overhaul of the UX, markup, and CSS for accessibility.

I expect more of these types of lawsuits in the future, so it could be useful
career-wise to be aware of this stuff.

WCAG infos: [https://www.w3.org/TR/WCAG20/](https://www.w3.org/TR/WCAG20/)

------
BinaryIdiot
I love it. Not only were the tricks interesting (I'll have to explore those
more to see if they scale in some projects I'm working on) but the advice
rings _exceptionally_ true. Well at least in my opinion.

I've done web development for a little over 12 years now and the amount of
times I've seen someone pull in a huge framework, fonts, tons of libraries
just to make a simple page is astounding. I once worked at a job where they
abused ASP.Net to such a degree that they were delivering a page to the user
of over 70MB (about 60MB of that was only ViewState!!!) and while the
application had its complex pieces that was only on a homepage that showed a
very, very crude dashboard with only the functionality to re-order boxes.
Boxes!

Frameworks have their place. Libraries have their place. They're helpful. But
you don't need to bring them in _every single time_ you write a web site or
application. That code eventually has to be downloaded and viewed by a user
and if you can do it with as few dependencies as possible your users will
subconsciously thank you.

~~~
lloyd-christmas
> I've seen someone pull in a huge framework, fonts, tons of libraries just to
> make a simple page is astounding... But you don't need to bring them in
> every single time you write a web site or application.

I'm a back end developer. I learned JS in the context of Node. The amount of
time it would take me to learn some useful CSS would decimate my ability to
get something out the door compared to just pulling in bootstrap. It's often
the case that there simply isn't enough to be done to necessitate hiring
someone correctly suited for the job. Additionally, whenever I leave my
company and they find someone to replace me, there's a strong chance that
person knows bootstrap. There is a balance to be had with user joy and
developer joy.

~~~
welanes
> The amount of time it would take me to learn some useful CSS.

What's with the myth that CSS is hard? It's perhaps the easiest thing about
web dev.

Learn flexbox, learn units of measurements, learn specificity, learn media-
queries - 5 hours max (a week of lunch at the desk) playing around in
JSfiddle, and you're most of the way there.

Bootstrap is fine but pulling in a framework that has 656 classes seems a
little unnecessary most of the time.

------
K0nserv
I agree with the sentiment of this post and the techniques shown are smart(and
new to me). I do want to point this out however[0].

0: [http://imgur.com/a/v1rbB](http://imgur.com/a/v1rbB)

------
korethr
I appreciate that he practices what he preaches here.

Perhaps I've been made cynical by my experience with several other sites, but
I was half-expecting to have to enable JS from a bunch of other domains just
to get the content to render correctly, if at all, and still be blocking a
bunch of ads and social media plugins atop that. There would be a
disappointing irony were that the case.

But no, the whole site loads quickly and correctly with no intervention on my
part. The only thing uMatrix is detecting _to_ block is Google Analytics, and
blocking it is having no impact upon the content on the page.

I wish this were the rule, not the exception.

~~~
em3rgent0rdr
Privacy badger noticed 3 trackers for disqus, that when disabled removed the
comments section.

~~~
ajosh
Disqus is the comments section for a lot of sites so this one is probably no
different.

------
puppetmaster3
Hey programmers:'let us make ugly apps. No idea why we need designers.'

Hey designers: 'See, you don't want a programmer touching front end. You have
to have creative control. Else they'll make reddit and hacker news UX.'

[http://image-
store.slidesharecdn.com/3f5416bc-c975-4915-a9d1...](http://image-
store.slidesharecdn.com/3f5416bc-c975-4915-a9d1-4d62b1fc0a09-original.jpeg)

~~~
jimmaswell
The UX on HN and Reddit is basically perfect, though.

~~~
qwertyuiop924
The UX on HN is good. Reddit, not so much nowadays.

~~~
pjc50
HN is pretty good after the update that introduced tree collapsing, except
that the up/down arrows are implemented weirdly. So on my Windows tablet, and
occasionally on Android, when clicking on the arrow the browser decides to
snap to the nearest clickable link instead, which is the userid.

I'm also intending to build a scraper simply so I can determine what my
highest voted comments of all time are.

~~~
bushin
You can use this search API:
hn.algolia.com/api/v1/search?tags=comment,author_pjc50

------
CarpetBench
To anyone who's planning to use this or Atwood's article on writing less code
as a little red book:

For the love of god, please use some common sense when repeating mantras like
"write less code." I've seen this used to justify all sorts of ridiculous
shit, like dropping basic security measures (write less code! YAGNI! Why would
someone try SQL injection/XSS against our site anyway?!?).

If I propose something and your thought-terminating cliche response is some
form of "YAGNI," I hate you.

~~~
sherjilozair
The proper YAGNI reply to this would be to use a proper library or work in the
right abstraction layer so that you don't have to worry about SQL injection.
For instance, Django provides the csrf_token which can be dropped in. That's
still less code and secure.

~~~
stcredzero
Right. There's a world of difference between a mature, well maintained
database library and some random goofy thing to post to social media written
by newb coders. A corollary to writing less code is doing less debugging --
and furthermore, exploiting freely available code that represents 1000's of
hours of debugging already done for you.

Good taste is just a form of 3rd order laziness.

~~~
TeMPOraL
> _Good taste is just a form of 3rd order laziness._

Great line! Saved in my quotes file.

------
legulere
No code is better than no code

~~~
jessaustin
That seems logically problematic. Perhaps "no code is as good as no code"?

[EDIT:] wow!

~~~
akavi
Those seem the same to me, but the parent's is pithier. What's the difference
in your eyes?

~~~
jessaustin
In parent's formulation, the phrase "no code" acts as a polyseme, carrying
slightly different meanings each time it appears. It seemed like an attempt at
word play, which I thought could be improved by pitting that interpretation
against another strictly monosemous one that would be tautological once the
">" relation was changed to ">=". However it seems I've been overruled.

------
andrepd
Let me just say, for an article about writing less, this is sure a roundabout
way of saying something that could be said in 1/3rd of the length.

No, I don't want to hear you ramble on with the discourse of someone who
thinks they are hilarious and likes the sound of their own voice too much.
Just get to the point. /rant

------
joeblau
While I'm all for writing less code, it seems like most development teams are
optimizing for _maximum number of people working on code at the same time_
over _writing less code_.

------
tracker1
Regarding checkboxes/radio

    
    
        <label>
          <input type="checkbox" ... />
          <span>Label Text</span>
        </label>
    

This way the label magically works, similar to H2, also, the nested span is so
that you can target `input[type=checkbox]` with `+ span` in order to do
custmized glyphs for checkboxes without JS.

...

For fonts, have a base size for `html, body` then use `rem` everywhere else.

------
wangchow
A lot of it has to do with the sloppy tricks people are trying to implement to
get multimedia ads and whatnot on their sites. We are bombarded with ads in
our day-to-day life and people's attention is more-and-more difficult to grab.
Unfortunately they don't realize form follows function and their function is
getting fucked. The internet is more about money and less about spreading
ideas nowadays.

~~~
new_hackers
"their function is getting fucked"

It sounds like they are practicing the oldest profession

------
legulere
> Do you remember ever enjoying using/reading a website with more than two
> columns?

Pinterest

~~~
pjc50
Also, example.tumblr.com/archive, which has the added advantage of not using
people's themes.

~~~
bmj
I would only consume the archive of tumblr blog that is primarily photos that
way. Trying to read a mostly print blog that way would be difficult.

------
partycoder
You write less code by: \- Removing dead code \- Applying a coding standard to
emphasize code consistency, so similar problems have similar solutions. \-
Once you have similar problems, you can generalize code to solve a family of
problems instead of a single problem. Otherwise known as code reuse. \-
Diminish coupling so code can be reused as much as possible.

------
jcoffland
There is nothing quite as pleasurable (with reference to technical work) as
sending large amounts of obsolete code to the bit bucket. I often judge my
refactoring decisions based on how much code gets removed. If a change results
in the removal of code at many locations then I take that as confirmation that
I made a good decision.

------
cel1ne
(Note: There's a duplicate of this comment)

Check out [http://tachyons.io](http://tachyons.io).

It has a scale for widths, margins, paddings and fontsizes.

Specify pl1 to pl7 and get padding-left from 0.25 to 16rem.

w1 to w5 for width of 1,2,4,8,16rem.

f1 to f6 and f-headline for a proven typographic scale that makes sense.

Everything is relative to the fontsize. No more magic values!

Plus the scale are powers of two so integers only and everything always adds
up. No more off-by-1-pixel errors!

And there's even a port for react-native: [http://github.com/fab1an/react-
native-style-tachyons](http://github.com/fab1an/react-native-style-tachyons).

------
peterbotond
Too many columns and talk about it.....

My take: one single column that the rendering visible area can figure out how
to render. No hidden agenda. only and just information worth reading:
learning, discussing, agreeing ir disagreeing.

(my first papers were from a teletext or a stencil or a typewriter they were
of the information I wish for to read today at least 3-4 times a week. instead
of 3-4 days go by for one.)

Bring back the pure unadulterated brain output.

------
davidhariri
> The less I write, the less there is to break

Not when you're writing consumable services IMO. The less you write in
building a REST API, for example, the _more_ opportunity there is for someone
to break it. It's important to catch exceptions, write detailed models, write
tests for fail/success cases etc...

It's a good principle (optimizing for less code), but not always.

------
mark_l_watson
I like the sentiment of the article, not just with CSS, but also with
imperative code: use really light weight frameworks like Spock or Sinatra and
build in just what you need.

That said, I have been using Bootstrap, which is heavy weight, but I like how
my mobile web sites also look nice on the desktop and on tablets.

------
ElijahLynn
To Heydon: Good article, especially love your simplicity and typography of
your own site, very easy to read.

You should consider updating your WP Supercache or maybe just WP? to have a
max-age longer > 3\. Maybe you have a use case I am unaware of that
effectively voids browser cache though.

------
fragola
I know this article is mostly about web development, but if you're interested
in writing less Java code I encourage you to consider Lombok:
[https://projectlombok.org/](https://projectlombok.org/)

~~~
djhworld
Some things in Lombok seem redundant to me, especially with Java 7 and 8.

For example the @Cleanup annotation.

------
OhHeyItsE
Yes, yes, yes. Though a rehash of [https://blog.codinghorror.com/the-best-
code-is-no-code-at-al...](https://blog.codinghorror.com/the-best-code-is-no-
code-at-all/) (which is itself a rehash)

------
rachkovsky
This is the only web site I had to make font size smaller to read it
comfortably.

------
ahallock
While I agree with a lot of the author's points, I've actually grown to like
hero images, when they're done tastefully, relate to the product, and are
optimized for mobile devices.

~~~
munificent
> relate to the product

Based on my non-comprehensive empirical study, that describes about 3% of hero
images in the wild. That is, unless almost all products are deeply related to
fashionable twenty-somethings using a laptop in a coffeehouse surrounded by
cute stationery with interesting organic textures.

~~~
PeCaN
> laptop

Is that what Macbooks are called these days?

Dammit munificent, get it right.

~~~
munificent
Wait, isn't it supposed to be an iWatchlet or something now?

------
rileymat2
One distinction that should be made is when some elements are the same
intentionally while others are the same by coincidence. I see no problem with
duplicate code in the latter case.

------
stcredzero
> Not only is the following checkbox implementation verbose HTML, but it needs
> a JavaScript dependency to control state changes and to _follyfill_
> standard, basic behavior*

I like this coder!

------
lucb1e
I see no other comments mentioning this. Nobody else thought the font was
_way_ too big and when zooming out until about 50% it's finally a nice size to
read?

------
frostymarvelous
I facilitated a class yesterday and I hammered on proper semantic html and
only using WAI-ARIA where totally necessary like in tabs.

Glad to see its more or less a consensus.

------
snambi
Make the title "write cleaner HTML Code". Author some point, but the title is
totally misleading.

------
Animats
Remember when we had tools like Dreamweaver to do HTML for us? What went
wrong?

~~~
jtolmar
Dreamweaver let you try to do things that wouldn't play nice with HTML and it
would use the limited tools available at the time to make bloated sites that
still didn't look right in most browsers.

Then since Dreamweaver was garbage people decided that any WYSIWYG HTML-editor
is guaranteed to be terrible and nobody ever tried again.

~~~
Animats
There's a disruption possibility. CSS is now good enough and browsers are now
compliant enough that a WYSIWYG HTML editor is feasible again. The parent
article points out that you barely need Javascript any more. Lay off those
overpaid "web designers".

Someone is trying: "[https://www.tinymce.com"](https://www.tinymce.com"). No
idea how good this is.

~~~
Scea91
Tinymce is not a WYSIWYG editor for creating HTML sites. But a text editor
implemented in HTML.

------
myst
The title mentions code. The article is about HTML. IDGI

------
heydenberk
This domain is really throwing me for a loop.

------
lolive
The mantra of "write less" coding :

"Never EVER copy/paste code. Refactor!"

~~~
chrisan
Unless you follow the Rule of 3

[https://en.wikipedia.org/wiki/Rule_of_three_(computer_progra...](https://en.wikipedia.org/wiki/Rule_of_three_\(computer_programming\))

------
ackalker
TL;DR: KISS+YAGNI :-)

------
jomamaxx
This

------
midgetjones
Black on white is really hard to read

------
cel1ne
Check out [http://tachyons.io](http://tachyons.io).

It has a scale for widths, margins, paddings and fontsizes.

Specify pl1 to pl7 and get padding-left from 0.25 to 16rem.

w1 to w5 for width of 1,2,4,8,16rem.

f1 to f6 and f-headline for a proven typographic scale that makes sense.

Everything is relative to the fontsize. No more magic values!

Plus the scale are powers of two so integers only and everything always adds
up. No more off-by-1-pixel errors!

And there's even a port for react-native: [http://github.com/fab1an/react-
native-style-tachyons](http://github.com/fab1an/react-native-style-tachyons).

