@area17/a17-tailwind-plugins
Version:
A collection of Tailwind plugins to help build responsive design systems in collaboration with A17 design and development build methodologies
482 lines (451 loc) • 14 kB
HTML
---
title: SpacingTokens
---
{% include_relative includes/_header.html %}
<div class="copy">
<h2 id="description">Description</h2>
<p>
This plugin helps replace the standard Tailwind spacing tokens
<code>rems</code> to <code>pixels</code> (but with the final output in the
CSS remaining in <code>rems</code>).
</p>
<p>
As humans often specify spacing in terms of pixels, using this set up you
can see "padding top 40px" and then use <code>.pt-40</code> in your HTML.
Tailwind like spacing classes are generated, eg. <code>mt-</code>,
<code>pt-</code>, <code>h-</code>, <code>max-h-</code> etc. by the Tailwind
core plugins for <code>padding</code>, <code>margin</code>,
<code>width</code>, <code>height</code>, <code>maxHeight</code>,
<code>gap</code>, <code>inset</code>, <code>space</code>, and
<code>translate</code>.
</p>
<p>
Key to understand is that <code>.mt-4</code> will
<strong>not</strong> produce <code>margin-top: 1rem;</code>,
<em>but</em> instead will produce <code>margin-top: 0.25rem;</code> which is
equivalent to <code>4px</code>.
</p>
<p>
Before <code>v3.4.0</code> you had to provide your own scale, the typing of
which was tedious. After <code>v3.4.0</code>, this plugin outputs a scale
based on multiples of <code>5</code>, to a maximum of <code>100</code> with
arbitrary values between 0 - 10px. Or, you can describe the scale and add
any arbitrary values and the function will generate your scale for you.
</p>
<h2 id="setup">Setup</h2>
<h3 id="default">Default</h3>
<figure class="code-example">
<figcaption class="code-example-filename">tailwind.config.js</figcaption>
<pre
class="code-example-code"
><code class="language-javascript">const { SpacingTokens } = require('@area17/a17-tailwind-plugins');
module.exports = {
...
theme: {
spacing: SpacingTokens()
}
...
}</code></pre>
</figure>
<p>
With no options specified <code>SpacingTokens</code> will generate a spacing
scale based on multiples of <code>5</code>, to a maximum of
<code>100</code> with arbitrary values of 0 - 10px.
</p>
<h3 id="defined">Scale defined:</h3>
<figure class="code-example">
<figcaption class="code-example-filename">tailwind.config.js</figcaption>
<pre
class="code-example-code"
><code class="language-javascript">const { SpacingTokens } = require('@area17/a17-tailwind-plugins');
module.exports = {
...
theme: {
spacing: SpacingTokens({
scaler: 4,
max: 200,
arbitraries: {
"400": "400px"
}
})
}
...
}</code></pre>
</figure>
<p>
With this config, <code>SpacingTokens</code> will generate a spacing scale
based on multiples of <code>4</code>, to a maximum of <code>200</code> along
with arbitrary values of 0 - 10px and 400px as specified.
</p>
<p>
Unless you specify a scale manually, <code>SpacingTokens</code> will always
output arbitrary values of 0 - 10px, because we always randomly need a
<code>mt-1</code> or <code>pl-3</code> regardless of your spacing scale.
</p>
<h3 id="manual">Manual scale</h3>
<p>
<strong>Note</strong> before <code>v3.4.0</code> you have to provide your
own token scale.
</p>
<figure class="code-example">
<figcaption class="code-example-filename">tailwind.config.js</figcaption>
<pre
class="code-example-code"
><code class="language-javascript">const { SpacingTokens } = require('@area17/a17-tailwind-plugins');
module.exports = {
...
theme: {
spacing: SpacingTokens({
"0": "0",
"1": "1px",
"2": "2px",
"3": "3px",
"4": "4px",
"5": "5px",
"6": "6px",
"7": '7px',
"8": "8px",
"9": "9px",
"10": "10px",
"12": "12px",
"16": "16px",
"20": "20px",
"24": "24px",
"28": "28px",
"32": "32px",
"36": "36px",
"40": "40px",
"44": "44px",
"48": "48px",
"52": "52px",
"56": "56px",
"60": "60px",
"64": "64px",
"68": "68px",
"72": "72px",
"76": "76px",
"80": "80px",
"84": "84px",
"88": "88px",
"92": "92px",
"96": "96px",
"100": "100px",
"400": "400px",
"600": "600px"
})
}
...
}</code></pre>
</figure>
<p>
This manual scale is essentially what the defined scale above builds for you
(although the manual scale stops at 100px and not 200px because typing it
became tedious).
</p>
<h3 class="minheight">The curious case of <code>minHeight</code></h3>
<p>
Tailwind documentation on
<a href="https://tailwindcss.com/docs/customizing-spacing" target="_blank"
>customising spacing</a
>
doesn't mention <code>minHeight</code> and, by default, Tailwind does not
generate <code>minHeight</code> classes based on the spacing tokens. If you
want to include <code>minHeight</code>, you'll need to extend it:
</p>
<figure class="code-example">
<figcaption class="code-example-filename">tailwind.config.js</figcaption>
<pre
class="code-example-code"
><code class="language-javascript">module.exports = {
...
theme: {
...
extend: {
minHeight: ({ theme }) => theme('spacing')
}
...
}
...
}</code></pre>
</figure>
<h2 id="demo">Demo</h2>
<p>Using:</p>
<figure class="code-example">
<figcaption class="code-example-filename">tailwind.config.js</figcaption>
<pre
class="code-example-code"
><code class="language-javascript">SpacingTokens({
scaler: 4,
arbitraries: {
"400": "400px"
}
})</code></pre>
</figure>
<p>
We would get <code>padding</code>, <code>margin</code>, <code>width</code>,
<code>height</code>, <code>maxHeight</code>, <code>gap</code>,
<code>inset</code>, <code>space</code>, and <code>translate</code> classes.
Demonstrated here are the <code>width</code>and <code>height</code> classes:
</p>
</div>
<ul class="mt-20">
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-0 h-0"
></div>
<span class="ml-16 f-ui">0px / 0rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-1 h-1"
></div>
<span class="ml-16 f-ui">1px / 0.0625rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-2 h-2"
></div>
<span class="ml-16 f-ui">2px / 0.125rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-3 h-3"
></div>
<span class="ml-16 f-ui">3px / 0.1875rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-4 h-4"
></div>
<span class="ml-16 f-ui">4px / 0.25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-5 h-5"
></div>
<span class="ml-16 f-ui">5px / 0.3125rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-6 h-6"
></div>
<span class="ml-16 f-ui">6px / 0.375rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-7 h-7"
></div>
<span class="ml-16 f-ui">7px / 0.4375rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-8 h-8"
></div>
<span class="ml-16 f-ui">8px / 0.5rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-9 h-9"
></div>
<span class="ml-16 f-ui">9px / 0.5625rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-10 h-10"
></div>
<span class="ml-16 f-ui">10px / 0.625rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-12 h-12"
></div>
<span class="ml-16 f-ui">12px / 0.75rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-16 h-16"
></div>
<span class="ml-16 f-ui">16px / 1rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-20 h-20"
></div>
<span class="ml-16 f-ui">20px / 1.25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-24 h-24"
></div>
<span class="ml-16 f-ui">24px / 1.5rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-28 h-28"
>
28
</div>
<span class="ml-16 f-ui">28px / 1.75rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-32 h-32"
>
32
</div>
<span class="ml-16 f-ui">32px / 2rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-36 h-36"
>
36
</div>
<span class="ml-16 f-ui">36px / 2.25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-40 h-40"
>
40
</div>
<span class="ml-16 f-ui">40px / 2.5rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-44 h-44"
>
44
</div>
<span class="ml-16 f-ui">44px / 2.75rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-48 h-48"
>
48
</div>
<span class="ml-16 f-ui">48px / 3rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-52 h-52"
>
52
</div>
<span class="ml-16 f-ui">52px / 3.25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-56 h-56"
>
56
</div>
<span class="ml-16 f-ui">56px / 3.5rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-60 h-60"
>
60
</div>
<span class="ml-16 f-ui">60px / 3.75rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-64 h-64"
>
64
</div>
<span class="ml-16 f-ui">64px / 4rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-68 h-68"
>
68
</div>
<span class="ml-16 f-ui">68px / 4.25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-72 h-72"
>
72
</div>
<span class="ml-16 f-ui">72px / 4.5rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-76 h-76"
>
76
</div>
<span class="ml-16 f-ui">76px / 4.75rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-80 h-80"
>
80
</div>
<span class="ml-16 f-ui">80px / 5rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-84 h-84"
>
84
</div>
<span class="ml-16 f-ui">84px / 5.25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-88 h-88"
>
88
</div>
<span class="ml-16 f-ui">88px / 5.5rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-92 h-92"
>
92
</div>
<span class="ml-16 f-ui">92px / 5.75rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-96 h-96"
>
96
</div>
<span class="ml-16 f-ui">96px / 6rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-100 h-100"
>
100
</div>
<span class="ml-16 f-ui">100px / 6.25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-400 h-400"
>
400
</div>
<span class="ml-16 f-ui">400px / 25rem</span>
</li>
<li class="mb-16 flex flex-row items-center">
<div
class="flex items-center justify-center text-center bg-column f-ui w-600 h-600"
>
600
</div>
<span class="ml-16 f-ui">600px / 37.5rem</span>
</li>
</ul>
{% include_relative includes/_footer.html %}