SmolCSS
Minimal snippets for modern CSS layouts and components
2023-10-06T00:00:00Z
https://smolcss.dev/
Stephanie Eckles
2023-10-06T00:00:00Z
https://smolcss.dev/#smol-breakout-grid
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Breakout Grid","description":"Generated from: https://SmolCSS.dev/#smol-breakout-grid","tags":["grid","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Breakout Grid\nGenerated from: https://SmolCSS.dev/#smol-breakout-grid -->\n<div class=\"smol-breakout-grid\">\n <h2 data-unstyled>\"Breakout\" elements using CSS Grid</h2>\n <p data-unstyled>Gummi bears gummies cheesecake donut liquorice sweet roll lollipop chocolate cake macaroon. Dragée powder biscuit.</p>\n <p data-text class=\"breakout\">I'm a breakout element, when my parent's parent is wide enough to let me expand into the outer columns.</p>\n <p data-unstyled>Jelly sweet tiramisu fruitcake dessert muffin chocolate cake dragée. Donut dragée carrot cake.</p>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-breakout-grid {\n --max-content-width: 50ch;\n --breakout-difference: 0.2;\n\n /* Compute total allowed grid width to `--breakout-difference` \n larger than content area */\n --breakout-grid-width: calc(\n var(--max-content-width) +\n (var(--max-content-width) * var(--breakout-difference))\n );\n\n display: grid;\n grid-template-columns:\n [grid-start] 1fr \n [content-start] minmax(\n min(100%, var(--max-content-width)),\n 1fr\n )\n [content-end] 1fr \n [grid-end];\n width: min(100% - 2rem, var(--breakout-grid-width));\n row-gap: 1rem;\n margin: 5vb auto;\n}\n\n.smol-breakout-grid > *:not(.breakout) {\n grid-column: content;\n}\n\n.smol-breakout-grid > .breakout {\n grid-column: grid;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Breakout Grid" aria-label="Open Smol Breakout Grid in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Setup a flexible grid layout with collapsing outer columns for easy placement of "breakout" elements.</p>
<p>The first feature is the use of the <code>[x-start]</code>/<code>[x-end]</code> syntax to create named grid areas that span more than one column (also works for rows!). In this example, we create three columns where the <code>grid</code> area spans all three, and the <code>content</code> area is the center column.</p>
<p>Next, we've set the outer column widths to <code>1fr</code> and those columns will collapse first to give the <code>minmax()</code> definition for the center column priority, meaning they will eventually compute to a width of <code>0</code>. Important to note is that we're only setting <em>row</em> gap, otherwise any column gap would keep space propped open between the middle and outer columns. The <code>minmax()</code> definition is explained in the demo for the <a href="https://smolcss.dev/feed/#smol-css-grid">Smol Responsive Grid</a>.</p>
<p>Finally, we assign everything that doesn't have the special <code>.breakout</code> class to the <code>content</code> named area, and the <code>.breakout</code> to the <code>grid</code> named area. Be sure to resize the demo to see the outer columns collapse to contain the breakout!</p>
<style>
.smol-breakout-grid {
--max-content-width: 50ch;
--breakout-difference: 0.2;
/* Compute total allowed grid width to `--breakout-difference`
larger than content area */
--breakout-grid-width: calc(
var(--max-content-width) +
(var(--max-content-width) * var(--breakout-difference))
);
display: grid;
grid-template-columns:
[grid-start] 1fr
[content-start] minmax(
min(100%, var(--max-content-width)),
1fr
)
[content-end] 1fr
[grid-end];
width: min(100% - 2rem, var(--breakout-grid-width));
row-gap: 1rem;
margin: 5vb auto;
}
.smol-breakout-grid > *:not(.breakout) {
grid-column: content;
}
.smol-breakout-grid > .breakout {
grid-column: grid;
}
</style>
<details>
<summary>CSS for "Smol Breakout Grid"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-breakout-grid</span> <span class="token punctuation">{</span>
<span class="token property">--max-content-width</span><span class="token punctuation">:</span> 50ch<span class="token punctuation">;</span>
<span class="token property">--breakout-difference</span><span class="token punctuation">:</span> 0.2<span class="token punctuation">;</span>
<span class="token comment">/* Compute total allowed grid width to `--breakout-difference`
larger than content area */</span>
<span class="token property">--breakout-grid-width</span><span class="token punctuation">:</span> <span class="token function">calc</span><span class="token punctuation">(</span>
<span class="token function">var</span><span class="token punctuation">(</span>--max-content-width<span class="token punctuation">)</span> +
<span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span>--max-content-width<span class="token punctuation">)</span> * <span class="token function">var</span><span class="token punctuation">(</span>--breakout-difference<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">grid-template-columns</span><span class="token punctuation">:</span>
[grid-start] 1fr
[content-start] <span class="token function">minmax</span><span class="token punctuation">(</span>
<span class="token function">min</span><span class="token punctuation">(</span>100%<span class="token punctuation">,</span> <span class="token function">var</span><span class="token punctuation">(</span>--max-content-width<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
1fr
<span class="token punctuation">)</span>
[content-end] 1fr
[grid-end]<span class="token punctuation">;</span>
<span class="token property">width</span><span class="token punctuation">:</span> <span class="token function">min</span><span class="token punctuation">(</span>100% - 2rem<span class="token punctuation">,</span> <span class="token function">var</span><span class="token punctuation">(</span>--breakout-grid-width<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">row-gap</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">margin</span><span class="token punctuation">:</span> 5vb auto<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-breakout-grid > *:not(.breakout)</span> <span class="token punctuation">{</span>
<span class="token property">grid-column</span><span class="token punctuation">:</span> content<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-breakout-grid > .breakout</span> <span class="token punctuation">{</span>
<span class="token property">grid-column</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<div class="smol-breakout-grid">
<h2 data-unstyled="">"Breakout" elements using CSS Grid</h2>
<p data-unstyled="">Gummi bears gummies cheesecake donut liquorice sweet roll lollipop chocolate cake macaroon. Dragée powder biscuit.</p>
<p data-text="" class="breakout">I'm a breakout element, when my parent's parent is wide enough to let me expand into the outer columns.</p>
<p data-unstyled="">Jelly sweet tiramisu fruitcake dessert muffin chocolate cake dragée. Donut dragée carrot cake.</p>
</div>
</div><footer>
</footer>
2022-05-05T00:00:00Z
https://smolcss.dev/#smol-container
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Intrinsic Container","description":"Generated from: https://SmolCSS.dev/#smol-container","tags":["utility","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Intrinsic Container\nGenerated from: https://SmolCSS.dev/#smol-container -->\n<div data-container-style class=\"smol-container\">\n <p data-text data-unstyled>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ex quos doloribus autem praesentium quod voluptatem quaerat accusamus labore ullam, omnis corrupti aperiam natus fuga repudiandae repellendus, ipsa enim vitae ut!</p>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-container {\n width: min(100% - 3rem, var(--container-max, 60ch));\n margin-inline: auto;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Intrinsic Container" aria-label="Open Smol Intrinsic Container in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>This modern CSS container recipe has three delicious ingredients: the <code>min()</code> function, the logical property <code>margin-inline</code>, and a custom property - <code>--container-max</code> - to make it flexible across infinite contexts.</p>
<p>Logical properties are writing mode-aware properties that can also serve as shorthand in some cases. Here, <code>margin-inline</code> is a shorthand for setting both <code>margin-left</code> and <code>margin-right</code>, and <a href="https://caniuse.com/mdn-css_properties_margin-inline"><code>margin-inline</code> has fairly good support</a>. A PostCSS plugin is available if you're unable to upgrade quite yet for your audience.</p>
<p>Review the "<a href="https://smolcss.dev/feed/#smol-unbreakable-boxes">Smol Flexible Unbreakable Boxes</a>" for an explanation of <code>min()</code>,</p>
<style>
.smol-container {
width: min(100% - 3rem, var(--container-max, 60ch));
margin-inline: auto;
}
</style>
<details>
<summary>CSS for "Smol Intrinsic Container"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-container</span> <span class="token punctuation">{</span>
<span class="token property">width</span><span class="token punctuation">:</span> <span class="token function">min</span><span class="token punctuation">(</span>100% - 3rem<span class="token punctuation">,</span> <span class="token function">var</span><span class="token punctuation">(</span>--container-max<span class="token punctuation">,</span> 60ch<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">margin-inline</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<div data-container-style="" class="smol-container">
<p data-text="" data-unstyled="">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ex quos doloribus autem praesentium quod voluptatem quaerat accusamus labore ullam, omnis corrupti aperiam natus fuga repudiandae repellendus, ipsa enim vitae ut!</p>
</div>
</div><footer>
<p>Get a bit more info about this container class and <a href="https://moderncss.dev/practical-uses-of-css-math-functions-calc-clamp-min-max/#the-modern-css-container-class">review additional uses of <code>min()</code></a> and other CSS math functions on ModernCSS.dev.</p>
</footer>
2022-01-05T00:00:00Z
https://smolcss.dev/#smol-background-picture
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Background Picture","description":"Generated from: https://SmolCSS.dev/#smol-background-picture","tags":["grid","component","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Background Picture\nGenerated from: https://SmolCSS.dev/#smol-background-picture -->\n<div data-component class=\"smol-stack-layout smol-background-picture\">\n <picture>\n <source\n type=\"image/webp\"\n srcset=\"\n https://smolcss.dev/assets/background-picture/landscape-w275.webp 275w,\n https://smolcss.dev/assets/background-picture/landscape-w683.webp 683w,\n https://smolcss.dev/assets/background-picture/landscape-w860.webp 860w\"\n >\n <img \n srcset=\"\n https://smolcss.dev/assets/background-picture/landscape-w275.jpg 275w,\n https://smolcss.dev/assets/background-picture/landscape-w683.jpg 683w,\n https://smolcss.dev/assets/background-picture/landscape-w860.jpg 860w\"\n src=\"https://smolcss.dev/assets/background-picture/landscape-w683.jpg\"\n alt=\"\">\n </picture>\n <div data-component class=\"smol-background-picture__content\">\n <p>Text overlaid on a picture element</p>\n <p><small>Photo by <a href=\"https://unsplash.com/@luckybeanz?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText\">Mark Harpur</a> on <a href=\"https://unsplash.com/s/photos/landscape?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText\">Unsplash</a>\n </small></p>\n </div>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-background-picture img {\n --background-img-brightness: 0.45;\n --background-img-saturate: 1.25;\n\n object-fit: cover;\n width: 100%;\n height: 100%;\n /* decrease brightness to improve text contrast */\n filter: \n brightness(var(--background-img-brightness)) \n saturate(var(--background-img-saturate));\n}\n\n/* Necessary if not already within a reset */\n.smol-background-picture :is(img, picture) {\n display: block;\n}\n\n.smol-background-picture__content {\n /* ensure stacking context above the picture */\n position: relative;\n align-self: center;\n color: #fff;\n text-align: center;\n padding: 1rem;\n}\n\n.smol-background-picture__content p {\n font-size: clamp(1.35rem, 5vw, 1.75rem);\n line-height: 1.3;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Background Picture" aria-label="Open Smol Background Picture in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>We can reuse the Smol Stack to enable layering the <code><picture></code> element with content as a replacement for using <code>background-image</code>. This will let you get the performance benefits of modern image formats like WebP, as well as being able to define <code>alt</code> text for accessibility.</p>
<p>If you haven't worked with the <code>picture</code> element before, note that you apply image-related CSS to the internal <code>img</code> element.</p>
<p>To emulate <code>background-image</code> type of behavior, we use <code>object-fit: cover</code> just like we also used for the <a href="https://smolcss.dev/feed/#smol-aspect-ratio-gallery">image gallery</a>.</p>
<p><strong>Bonus technique</strong>: improve text contrast of the overlaid content by applying <code>filter</code> to the <code>img</code>. With the filter, we reduce <code>brightness</code> to darken the image while also increasing the <code>saturate</code> value to recuperate some of the image vibrancy. These are set with custom properties so that you can easily modify them per-instance if needed to ensure the best contrast.</p>
<blockquote>
<p>This solution also uses the <a href="https://smolcss.dev/feed/#smol-stack-layout">Smol Stack Layout</a>.</p>
</blockquote>
<style>
.smol-background-picture img {
--background-img-brightness: 0.45;
--background-img-saturate: 1.25;
object-fit: cover;
width: 100%;
height: 100%;
/* decrease brightness to improve text contrast */
filter:
brightness(var(--background-img-brightness))
saturate(var(--background-img-saturate));
}
/* Necessary if not already within a reset */
.smol-background-picture :is(img, picture) {
display: block;
}
.smol-background-picture__content {
/* ensure stacking context above the picture */
position: relative;
align-self: center;
color: #fff;
text-align: center;
padding: 1rem;
}
.smol-background-picture__content p {
font-size: clamp(1.35rem, 5vw, 1.75rem);
line-height: 1.3;
}
</style>
<details>
<summary>CSS for "Smol Background Picture"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-background-picture img</span> <span class="token punctuation">{</span>
<span class="token property">--background-img-brightness</span><span class="token punctuation">:</span> 0.45<span class="token punctuation">;</span>
<span class="token property">--background-img-saturate</span><span class="token punctuation">:</span> 1.25<span class="token punctuation">;</span>
<span class="token property">object-fit</span><span class="token punctuation">:</span> cover<span class="token punctuation">;</span>
<span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token property">height</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token comment">/* decrease brightness to improve text contrast */</span>
<span class="token property">filter</span><span class="token punctuation">:</span>
<span class="token function">brightness</span><span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span>--background-img-brightness<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token function">saturate</span><span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span>--background-img-saturate<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* Necessary if not already within a reset */</span>
<span class="token selector">.smol-background-picture :is(img, picture)</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-background-picture__content</span> <span class="token punctuation">{</span>
<span class="token comment">/* ensure stacking context above the picture */</span>
<span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span>
<span class="token property">align-self</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span>
<span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-background-picture__content p</span> <span class="token punctuation">{</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> <span class="token function">clamp</span><span class="token punctuation">(</span>1.35rem<span class="token punctuation">,</span> 5vw<span class="token punctuation">,</span> 1.75rem<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">line-height</span><span class="token punctuation">:</span> 1.3<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<div data-component="" class="smol-stack-layout smol-background-picture">
<picture>
<source type="image/webp" srcset="https://smolcss.dev/assets/background-picture/landscape-w275.webp 275w, https://smolcss.dev/assets/background-picture/landscape-w683.webp 683w, https://smolcss.dev/assets/background-picture/landscape-w860.webp 860w" />
<img srcset="https://smolcss.dev/assets/background-picture/landscape-w275.jpg 275w, https://smolcss.dev/assets/background-picture/landscape-w683.jpg 683w, https://smolcss.dev/assets/background-picture/landscape-w860.jpg 860w" src="https://smolcss.dev/assets/background-picture/landscape-w683.jpg" alt="" />
</picture>
<div data-component="" class="smol-background-picture__content">
<p>Text overlaid on a picture element</p>
<p><small>Photo by <a href="https://unsplash.com/@luckybeanz?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Mark Harpur</a> on <a href="https://unsplash.com/s/photos/landscape?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
</small></p>
</div>
</div>
</div><footer>
<p>Learn more about using <code>picture</code> in my overview of <a href="https://12daysofweb.dev/2021/image-display-elements/">handling responsive image display</a>.</p>
</footer>
2021-06-10T00:00:00Z
https://smolcss.dev/#smol-focus-styles
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Focus Styles","description":"Generated from: https://SmolCSS.dev/#smol-focus-styles","tags":["utility","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Focus Styles\nGenerated from: https://SmolCSS.dev/#smol-focus-styles -->\n<ul data-component class=\"smol-focus-styles\">\n <li><a href=\"javascript:;\">A link</a></li>\n <li><a href=\"javascript:;\">A link customized to dashed style</a></li>\n <li><button type=\"button\">A button</button></li>\n <li><button type=\"button\">A large button</button></li>\n <li>\n <label for=\"smol-focus-input\">Customized outline color</label>\n <input id=\"smol-focus-input\" type=\"text\">\n </li>\n <li>\n <label for=\"smol-focus-textarea\">Fully customized</label>\n <textarea id=\"smol-focus-textarea\" rows=\"3\"></textarea>\n </li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n\n/* For \"real-world\" usage, you do not need to scope\nthese custom properties */\n.smol-focus-styles :is(a, button, input, textarea, summary) {\n /* Using max() ensures at least a value of 2px, \n while allowing the possibility of scaling \n relative to the component */\n --outline-size: max(2px, 0.08em);\n --outline-style: solid;\n --outline-color: currentColor;\n}\n\n/* Base :focus styles for fallback purposes */\n.smol-focus-styles :is(a, button, input, textarea, summary):focus {\n outline: var(--outline-size) var(--outline-style) var(--outline-color);\n outline-offset: var(--outline-offset, var(--outline-size));\n}\n\n/* Final :focus-visible styles */\n.smol-focus-styles :is(a, button, input, textarea):focus-visible {\n outline: var(--outline-size) var(--outline-style) var(--outline-color);\n outline-offset: var(--outline-offset, var(--outline-size));\n}\n\n/* Remove base :focus styles when :focus-visible is available */\n.smol-focus-styles :is(a, button, input, textarea):focus:not(:focus-visible) {\n outline: none;\n}\n\n/* Demonstration of customizing */\n.smol-focus-styles li:nth-of-type(2) a {\n --outline-style: dashed;\n}\n\n.smol-focus-styles input {\n --outline-color: red;\n}\n\n.smol-focus-styles textarea {\n --outline-size: 0.25em;\n --outline-style: dotted;\n --outline-color: green;\n}\n\n.smol-focus-styles li:nth-of-type(4) button {\n font-size: 2.5rem;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Focus Styles" aria-label="Open Smol Focus Styles in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Focus styles are incredibly important for the accessibility of your application. But, it can be difficult to manage them across changing contexts.</p>
<p>The following solution takes advantage of custom properties and <code>:is()</code> to set reasonable defaults for interactive elements. Then, individual instances can override each setting by simply providing an alternate value for the custom property.</p>
<p>This solution sets <code>currentColor</code> as the <code>outline-color</code> which works in many contexts. One that it might not is for buttons, in which case you could update <code>--outline-color</code> to use the same color as the button background, for example.</p>
<p>Additionally, this demonstrates one of the newly available CSS pseudo-class selectors: <code>focus-visible</code>. This selector is intended to only display focus styles when the browser detects that they should be visible (you may encounter the term "heuristics"). For now, we've setup some fallbacks so that a focus style is presented even when a browser doesn't support <code>:focus-visible</code> quite yet.</p>
<p><strong>Note</strong>: Due to using <code>:focus-visible</code>, you may not see focus styles on the links and buttons unless you tab to them.</p>
<blockquote>
<p>Make sure your focus styles have appropriate contrast! If you're working on buttons, <a href="https://buttonbuddy.dev/">generate an accessible color palette with ButtonBuddy</a></p>
</blockquote>
<style>
/* For "real-world" usage, you do not need to scope
these custom properties */
.smol-focus-styles :is(a, button, input, textarea, summary) {
/* Using max() ensures at least a value of 2px,
while allowing the possibility of scaling
relative to the component */
--outline-size: max(2px, 0.08em);
--outline-style: solid;
--outline-color: currentColor;
}
/* Base :focus styles for fallback purposes */
.smol-focus-styles :is(a, button, input, textarea, summary):focus {
outline: var(--outline-size) var(--outline-style) var(--outline-color);
outline-offset: var(--outline-offset, var(--outline-size));
}
/* Final :focus-visible styles */
.smol-focus-styles :is(a, button, input, textarea):focus-visible {
outline: var(--outline-size) var(--outline-style) var(--outline-color);
outline-offset: var(--outline-offset, var(--outline-size));
}
/* Remove base :focus styles when :focus-visible is available */
.smol-focus-styles :is(a, button, input, textarea):focus:not(:focus-visible) {
outline: none;
}
/* Demonstration of customizing */
.smol-focus-styles li:nth-of-type(2) a {
--outline-style: dashed;
}
.smol-focus-styles input {
--outline-color: red;
}
.smol-focus-styles textarea {
--outline-size: 0.25em;
--outline-style: dotted;
--outline-color: green;
}
.smol-focus-styles li:nth-of-type(4) button {
font-size: 2.5rem;
}
</style>
<details>
<summary>CSS for "Smol Focus Styles"</summary>
<pre class="language-css"><code class="language-css">
<span class="token comment">/* For "real-world" usage, you do not need to scope
these custom properties */</span>
<span class="token selector">.smol-focus-styles :is(a, button, input, textarea, summary)</span> <span class="token punctuation">{</span>
<span class="token comment">/* Using max() ensures at least a value of 2px,
while allowing the possibility of scaling
relative to the component */</span>
<span class="token property">--outline-size</span><span class="token punctuation">:</span> <span class="token function">max</span><span class="token punctuation">(</span>2px<span class="token punctuation">,</span> 0.08em<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">--outline-style</span><span class="token punctuation">:</span> solid<span class="token punctuation">;</span>
<span class="token property">--outline-color</span><span class="token punctuation">:</span> currentColor<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* Base :focus styles for fallback purposes */</span>
<span class="token selector">.smol-focus-styles :is(a, button, input, textarea, summary):focus</span> <span class="token punctuation">{</span>
<span class="token property">outline</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-size<span class="token punctuation">)</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-style<span class="token punctuation">)</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-color<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">outline-offset</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-offset<span class="token punctuation">,</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-size<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* Final :focus-visible styles */</span>
<span class="token selector">.smol-focus-styles :is(a, button, input, textarea):focus-visible</span> <span class="token punctuation">{</span>
<span class="token property">outline</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-size<span class="token punctuation">)</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-style<span class="token punctuation">)</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-color<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">outline-offset</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-offset<span class="token punctuation">,</span> <span class="token function">var</span><span class="token punctuation">(</span>--outline-size<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* Remove base :focus styles when :focus-visible is available */</span>
<span class="token selector">.smol-focus-styles :is(a, button, input, textarea):focus:not(:focus-visible)</span> <span class="token punctuation">{</span>
<span class="token property">outline</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* Demonstration of customizing */</span>
<span class="token selector">.smol-focus-styles li:nth-of-type(2) a</span> <span class="token punctuation">{</span>
<span class="token property">--outline-style</span><span class="token punctuation">:</span> dashed<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-focus-styles input</span> <span class="token punctuation">{</span>
<span class="token property">--outline-color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-focus-styles textarea</span> <span class="token punctuation">{</span>
<span class="token property">--outline-size</span><span class="token punctuation">:</span> 0.25em<span class="token punctuation">;</span>
<span class="token property">--outline-style</span><span class="token punctuation">:</span> dotted<span class="token punctuation">;</span>
<span class="token property">--outline-color</span><span class="token punctuation">:</span> green<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-focus-styles li:nth-of-type(4) button</span> <span class="token punctuation">{</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 2.5rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo no-resize">
<ul data-component="" class="smol-focus-styles">
<li><a href="javascript:;">A link</a></li>
<li><a href="javascript:;">A link customized to dashed style</a></li>
<li><button type="button">A button</button></li>
<li><button type="button">A large button</button></li>
<li>
<label for="smol-focus-input">Customized outline color</label>
<input id="smol-focus-input" type="text" />
</li>
<li>
<label for="smol-focus-textarea">Fully customized</label>
<textarea id="smol-focus-textarea" rows="3"></textarea>
</li>
</ul>
</div><footer>
<p>Learn more about <code>:focus-visible</code> in my Smashing <a href="https://www.smashingmagazine.com/2021/04/guide-supported-modern-css-pseudo-class-selectors/">article on newly supported CSS pseudo-class selectors</a>. You can also find more <a href="https://moderncss.dev/modern-css-upgrades-to-improve-accessibility/">tips on how CSS impacts accessibility</a> on ModernCSS.</p>
</footer>
2021-04-09T00:00:00Z
https://smolcss.dev/#smol-unbreakable-boxes
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Flexible Unbreakable Boxes","description":"Generated from: https://SmolCSS.dev/#smol-unbreakable-boxes","tags":["component","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Flexible Unbreakable Boxes\nGenerated from: https://SmolCSS.dev/#smol-unbreakable-boxes -->\n<blockquote data-component class=\"smol-unbreakable-box\">\n <p>Topping candy canes ice cream gummi bears gingerbread marshmallow. Chocolate cake powder sugar plum topping. Cake marshmallow carrot cake. Pie liquorice liquorice sweet tootsie roll caramels donut dragée bear claw. Chocolate powder candy canes.</p>\n <footer>\n - <cite>Captain Candy</cite>\n </footer>\n</blockquote>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-unbreakable-box {\n --color-light: #E0D4F6;\n --color-dark: #675883;\n\n margin: 2rem auto;\n color: var(--color-dark);\n background-color: var(--color-light);\n font-size: 1.15rem;\n /* Smol Responsive Padding FTW! */\n padding: clamp(.75rem, 3%, 2rem);\n /* Provide a max-width and prevent overflow */\n width: min(50ch, 90%);\n /* Help prevent overflow of long words/names/URLs */\n word-break: break-word;\n /* Optional, not supported for all languages */\n hyphens: auto;\n}\n\n.smol-unbreakable-box footer {\n padding: 0.25em 0.5em;\n margin-top: 1rem;\n color: var(--color-light);\n background-color: var(--color-dark);\n font-size: 0.9rem;\n /* Creates a visual box shrunk to `max-content` */\n width: fit-content;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Flexible Unbreakable Boxes" aria-label="Open Smol Flexible Unbreakable Boxes in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p><a href="https://css-tricks.com/css-is-in-fact-awesome/">CSS is awesome</a>, and using a mix of older and modern CSS we can quickly define flexible, unbreakable boxes!</p>
<p>This demo of a <code>blockquote</code> first reuses our <a href="https://smolcss.dev/feed/#smol-responsive-padding">responsive padding</a> idea to enable padding that <em>just feels right</em> as the box flexes to different sizes. The box size is controlled by setting width using the <code>min()</code> function. As the box grows and shrinks, <code>min()</code> will select the <em>minimum</em> of the provided values, resulting in a box that has a <code>max-width</code> for large viewports <em>and</em> a <code>max-width</code> on smaller viewports.</p>
<p>Then we add a few properties to ensure long text values cannot break the box, including <code>word-break</code> and <code>hyphens</code> (note that <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/hyphens#browser_compatibility"><code>hyphens</code></a> may not work in all languages).</p>
<p>Finally, the <code>footer</code> sets its width with <code>fit-content</code> just as we also used in the previous <a href="https://smolcss.dev/feed/#smol-visited-styles">visited styles demo</a>. This makes for a great alternative to swapping to an <code>inline</code> display value in case you also need to set a <code>display</code>!</p>
<style>
.smol-unbreakable-box {
--color-light: #E0D4F6;
--color-dark: #675883;
margin: 2rem auto;
color: var(--color-dark);
background-color: var(--color-light);
font-size: 1.15rem;
/* Smol Responsive Padding FTW! */
padding: clamp(.75rem, 3%, 2rem);
/* Provide a max-width and prevent overflow */
width: min(50ch, 90%);
/* Help prevent overflow of long words/names/URLs */
word-break: break-word;
/* Optional, not supported for all languages */
hyphens: auto;
}
.smol-unbreakable-box footer {
padding: 0.25em 0.5em;
margin-top: 1rem;
color: var(--color-light);
background-color: var(--color-dark);
font-size: 0.9rem;
/* Creates a visual box shrunk to `max-content` */
width: fit-content;
}
</style>
<details>
<summary>CSS for "Smol Flexible Unbreakable Boxes"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-unbreakable-box</span> <span class="token punctuation">{</span>
<span class="token property">--color-light</span><span class="token punctuation">:</span> #E0D4F6<span class="token punctuation">;</span>
<span class="token property">--color-dark</span><span class="token punctuation">:</span> #675883<span class="token punctuation">;</span>
<span class="token property">margin</span><span class="token punctuation">:</span> 2rem auto<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-dark<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-light<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 1.15rem<span class="token punctuation">;</span>
<span class="token comment">/* Smol Responsive Padding FTW! */</span>
<span class="token property">padding</span><span class="token punctuation">:</span> <span class="token function">clamp</span><span class="token punctuation">(</span>.75rem<span class="token punctuation">,</span> 3%<span class="token punctuation">,</span> 2rem<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* Provide a max-width and prevent overflow */</span>
<span class="token property">width</span><span class="token punctuation">:</span> <span class="token function">min</span><span class="token punctuation">(</span>50ch<span class="token punctuation">,</span> 90%<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* Help prevent overflow of long words/names/URLs */</span>
<span class="token property">word-break</span><span class="token punctuation">:</span> break-word<span class="token punctuation">;</span>
<span class="token comment">/* Optional, not supported for all languages */</span>
<span class="token property">hyphens</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-unbreakable-box footer</span> <span class="token punctuation">{</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 0.25em 0.5em<span class="token punctuation">;</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-light<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-dark<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 0.9rem<span class="token punctuation">;</span>
<span class="token comment">/* Creates a visual box shrunk to `max-content` */</span>
<span class="token property">width</span><span class="token punctuation">:</span> fit-content<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<blockquote data-component="" class="smol-unbreakable-box">
<p>Topping candy canes ice cream gummi bears gingerbread marshmallow. Chocolate cake powder sugar plum topping. Cake marshmallow carrot cake. Pie liquorice liquorice sweet tootsie roll caramels donut dragée bear claw. Chocolate powder candy canes.</p>
<footer>
- <cite>Captain Candy</cite>
</footer>
</blockquote>
</div><footer>
<p>For more extensive info and another example for creating flexible, unbreakable boxes, check out this ModernCSS tutorial - <a href="https://moderncss.dev/developing-for-imperfect-future-proofing-css-styles/">Developing For Imperfect: Future Proofing CSS Styles</a></p>
</footer>
2021-03-02T00:00:00Z
https://smolcss.dev/#smol-visited-styles
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Visited Styles","description":"Generated from: https://SmolCSS.dev/#smol-visited-styles","tags":["utility","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Visited Styles\nGenerated from: https://SmolCSS.dev/#smol-visited-styles -->\n<ul class=\"smol-visited-styles\" data-component data-padding-unset>\n <li><a href=\"https://ModernCSS.dev\">ModernCSS.dev<span aria-hidden=\"true\"></span></a></li>\n <li><a href=\"https://LearnFromSteph.dev\">LearnFromSteph.dev<span aria-hidden=\"true\"></span></a></li>\n <li><a href=\"https://5t3ph.dev/a11y-forms\">Course: Accessibly Styling Form Fields<span aria-hidden=\"true\"></span></a></li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\nul.smol-visited-styles {\n --color-background: #fff;\n --color-accent: green;\n\n display: grid;\n grid-gap: 0.5rem;\n width: fit-content;\n padding: 1rem;\n border-radius: 0.5rem;\n background-color: var(--color-background); \n border: 1px solid var(--color-accent);\n}\n\n.smol-visited-styles a {\n display: flex;\n flex-direction: row-reverse;\n justify-content: flex-end;\n color: #222;\n text-decoration-color: var(--color-accent);\n text-decoration-style: dotted;\n text-underline-offset: 0.15em;\n}\n\n.smol-visited-styles a span {\n margin-right: 0.25em;\n /* Remove from normal document flow\n which excludes it from receiving \n the underline ✨ */\n float: left;\n}\n\n.smol-visited-styles a span::after {\n content: \"✔\";\n color: var(--color-background);\n}\n\n.smol-visited-styles a:visited span::after {\n color: var(--color-accent);\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Visited Styles" aria-label="Open Smol Visited Styles in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>The <code>:visited</code> pseudo class is very unique because of <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Privacy_and_the_:visited_selector">the potential to be exploited in terms of user's privacy</a>. To resolve this, browser makers have limited which CSS styles are allowed to be applied using <code>:visited</code>.</p>
<p>A key gotcha is that styles applied via <code>:visited</code> will always use the parent's alpha channel - meaning, you cannot use <code>rgba</code> to go from invisible to visible, you must change the whole color value. So, to hide the initial state, you need to be able to use a solid color, such as the page or element's background color.</p>
<p>As usual - this demo has bonus techniques and properties! Note the way we're updating the <em>order</em> of the visited indicator using flexbox. And, we're using some newly supported properties to change the color, position, and style of the link underline.</p>
<p>Plus, we're using <code>fit-content</code> again but as a value of <code>width</code> this time and not as a function. This means it will expand to the equivalent of <code>max-width</code> but not <em>exceed</em> the available width, preventing overflow.</p>
<style>
ul.smol-visited-styles {
--color-background: #fff;
--color-accent: green;
display: grid;
grid-gap: 0.5rem;
width: fit-content;
padding: 1rem;
border-radius: 0.5rem;
background-color: var(--color-background);
border: 1px solid var(--color-accent);
}
.smol-visited-styles a {
display: flex;
flex-direction: row-reverse;
justify-content: flex-end;
color: #222;
text-decoration-color: var(--color-accent);
text-decoration-style: dotted;
text-underline-offset: 0.15em;
}
.smol-visited-styles a span {
margin-right: 0.25em;
/* Remove from normal document flow
which excludes it from receiving
the underline ✨ */
float: left;
}
.smol-visited-styles a span::after {
content: "✔";
color: var(--color-background);
}
.smol-visited-styles a:visited span::after {
color: var(--color-accent);
}
</style>
<details>
<summary>CSS for "Smol Visited Styles"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">ul.smol-visited-styles</span> <span class="token punctuation">{</span>
<span class="token property">--color-background</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span>
<span class="token property">--color-accent</span><span class="token punctuation">:</span> green<span class="token punctuation">;</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">grid-gap</span><span class="token punctuation">:</span> 0.5rem<span class="token punctuation">;</span>
<span class="token property">width</span><span class="token punctuation">:</span> fit-content<span class="token punctuation">;</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">border-radius</span><span class="token punctuation">:</span> 0.5rem<span class="token punctuation">;</span>
<span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-background<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">border</span><span class="token punctuation">:</span> 1px solid <span class="token function">var</span><span class="token punctuation">(</span>--color-accent<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-visited-styles a</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>
<span class="token property">flex-direction</span><span class="token punctuation">:</span> row-reverse<span class="token punctuation">;</span>
<span class="token property">justify-content</span><span class="token punctuation">:</span> flex-end<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> #222<span class="token punctuation">;</span>
<span class="token property">text-decoration-color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-accent<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">text-decoration-style</span><span class="token punctuation">:</span> dotted<span class="token punctuation">;</span>
<span class="token property">text-underline-offset</span><span class="token punctuation">:</span> 0.15em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-visited-styles a span</span> <span class="token punctuation">{</span>
<span class="token property">margin-right</span><span class="token punctuation">:</span> 0.25em<span class="token punctuation">;</span>
<span class="token comment">/* Remove from normal document flow
which excludes it from receiving
the underline ✨ */</span>
<span class="token property">float</span><span class="token punctuation">:</span> left<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-visited-styles a span::after</span> <span class="token punctuation">{</span>
<span class="token property">content</span><span class="token punctuation">:</span> <span class="token string">"✔"</span><span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-background<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-visited-styles a:visited span::after</span> <span class="token punctuation">{</span>
<span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--color-accent<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo no-resize">
<ul class="smol-visited-styles" data-component="" data-padding-unset="">
<li><a href="https://moderncss.dev/">ModernCSS.dev<span aria-hidden="true"></span></a></li>
<li><a href="https://learnfromsteph.dev/">LearnFromSteph.dev<span aria-hidden="true"></span></a></li>
<li><a href="https://5t3ph.dev/a11y-forms">Course: Accessibly Styling Form Fields<span aria-hidden="true"></span></a></li>
</ul>
</div><footer>
<p>Una Kravets has a much more <a href="https://una.im/hacking-visited/">in-depth reference on styling <code>:visited</code></a>. For another example, see how I've styled it for the <a href="https://stylestage.dev/styles/">Style Stage directory</a>.</p>
</footer>
2021-02-28T00:00:00Z
https://smolcss.dev/#smol-document-styles
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Document Styles","description":"Generated from: https://SmolCSS.dev/#smol-document-styles","tags":["layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Document Styles\nGenerated from: https://SmolCSS.dev/#smol-document-styles -->\n<header>\n <h1>Minimal Modern CSS Document Styles</h1>\n</header>\n<main>\n <article>\n <h2>55 lines of CSS</h2>\n <p>This set of reasonable document styles is <em>just enough</em> to produce a responsive, easily readable document given the use of semantic HTML. Thanks to flexbox, viewport units, and clamp, it's flexible for variable document lengths. The newlys supported :is() deserves the most credit in terms of reducing lines of code.</p>\n <p>While lines of code (short or long) certainly doesn't automatically mean \"quality\", this demo shows that for a simple project you may not need a framework when a little dash of carefully applied CSS will do!</p>\n <h3>No classes, all selectors and combinators</h3>\n <p><strong>Little rusty on your selectors and combinators</strong>? Check out my two-part guide to advanced CSS selectors, <a href=\"https://moderncss.dev/guide-to-advanced-css-selectors-part-one/\">starting with part one</a>.</p>\n <p>Sugar plum pie sweet roll chocolate bar chocolate cake jujubes jelly beans lollipop. Caramels muffin toffee bonbon icing wafer toffee tiramisu lemon drops.</p>\n <p>Macaroon cheesecake cupcake cotton candy jujubes cupcake. Chocolate sweet sugar plum candy dessert sesame snaps pie. Cupcake pudding oat cake. Halvah candy canes gingerbread tiramisu chupa chups lollipop. Toffee toffee cake. Jelly beans jelly beans chupa chups liquorice dessert donut caramels.</p>\n </article>\n</main>\n<footer>\n <p>© 2021 Stephanie Eckles, author of <a href=\"https://smolcss.dev\">SmolCSS.dev</a></p>\n</footer>\n","html_pre_processor":"none","css":"/***\n 🟣 SmolCSS Snippet Styles\n */\n\n\n* {\n box-sizing: border-box;\n margin: 0;\n}\n\nbody {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n padding: 5vh clamp(1rem, 5vw, 3rem) 1rem;\n font-family: system-ui, sans-serif;\n line-height: 1.5;\n color: #222;\n}\n\nbody > * {\n --layout-spacing: max(8vh, 3rem);\n --max-width: 70ch;\n width: min(100%, var(--max-width));\n margin-left: auto;\n margin-right: auto;\n}\n\nmain {\n margin-top: var(--layout-spacing);\n}\n\nfooter {\n margin-top: auto;\n padding-top: var(--layout-spacing);\n}\n\nfooter p {\n border-top: 1px solid #ccc;\n padding-top: 0.25em;\n font-size: 0.9rem;\n color: #767676;\n}\n\n:is(h1, h2, h3) {\n line-height: 1.2;\n}\n\n:is(h2, h3):not(:first-child) {\n margin-top: 2em;\n}\n\narticle * + * {\n margin-top: 1em;\n}\n\na {\n color: navy;\n text-underline-offset: 0.15em;\n}\n","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Document Styles" aria-label="Open Smol Document Styles in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>In 55 smol lines of CSS, we've created a set of reasonable document styles that is <em>just enough</em> to produce a responsive, easily readable document given the use of semantic HTML. Thanks to <code>flexbox</code>, <code>viewport units</code>, and <code>clamp</code>, it's flexible for variable document lengths. The newly supported <code>:is()</code> deserves the most credit in terms of reducing lines of code.</p>
<p>While lines of code (short or long) certainly doesn't automatically mean "quality", this demo shows that for a simple project you may not need a framework when a little dash of carefully applied CSS will do!</p>
<p>In fact - it's a great starting point to expand from to use the other smol techniques 😉</p>
<blockquote>
<p>This particular snippet is for an <em>entire webpage</em> so consequently the demo is not available for direct preview. <strong>Select "Open in Codepen"</strong> to check out the following styles in context!</p>
</blockquote>
<details>
<summary>CSS for "Smol Document Styles"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">*</span> <span class="token punctuation">{</span>
<span class="token property">box-sizing</span><span class="token punctuation">:</span> border-box<span class="token punctuation">;</span>
<span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">body</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>
<span class="token property">flex-direction</span><span class="token punctuation">:</span> column<span class="token punctuation">;</span>
<span class="token property">min-height</span><span class="token punctuation">:</span> 100vh<span class="token punctuation">;</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 5vh <span class="token function">clamp</span><span class="token punctuation">(</span>1rem<span class="token punctuation">,</span> 5vw<span class="token punctuation">,</span> 3rem<span class="token punctuation">)</span> 1rem<span class="token punctuation">;</span>
<span class="token property">font-family</span><span class="token punctuation">:</span> system-ui<span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span>
<span class="token property">line-height</span><span class="token punctuation">:</span> 1.5<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> #222<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">body > *</span> <span class="token punctuation">{</span>
<span class="token property">--layout-spacing</span><span class="token punctuation">:</span> <span class="token function">max</span><span class="token punctuation">(</span>8vh<span class="token punctuation">,</span> 3rem<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">--max-width</span><span class="token punctuation">:</span> 70ch<span class="token punctuation">;</span>
<span class="token property">width</span><span class="token punctuation">:</span> <span class="token function">min</span><span class="token punctuation">(</span>100%<span class="token punctuation">,</span> <span class="token function">var</span><span class="token punctuation">(</span>--max-width<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">margin-left</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token property">margin-right</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">main</span> <span class="token punctuation">{</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--layout-spacing<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">footer</span> <span class="token punctuation">{</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token property">padding-top</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--layout-spacing<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">footer p</span> <span class="token punctuation">{</span>
<span class="token property">border-top</span><span class="token punctuation">:</span> 1px solid #ccc<span class="token punctuation">;</span>
<span class="token property">padding-top</span><span class="token punctuation">:</span> 0.25em<span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 0.9rem<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> #767676<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">:is(h1, h2, h3)</span> <span class="token punctuation">{</span>
<span class="token property">line-height</span><span class="token punctuation">:</span> 1.2<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">:is(h2, h3):not(:first-child)</span> <span class="token punctuation">{</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> 2em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">article * + *</span> <span class="token punctuation">{</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> 1em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">a</span> <span class="token punctuation">{</span>
<span class="token property">color</span><span class="token punctuation">:</span> navy<span class="token punctuation">;</span>
<span class="token property">text-underline-offset</span><span class="token punctuation">:</span> 0.15em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><footer>
<p><strong>Little rusty on your selectors and combinators</strong>? Check out my two-part guide to advanced CSS selectors, <a href="https://moderncss.dev/guide-to-advanced-css-selectors-part-one/">starting with part one</a>. These styles are used and very slightly expanded (~120 lines) in my <a href="https://smol-11ty-starter.netlify.app/">Smol 11ty Starter</a>.</p>
</footer>
2021-02-27T00:00:00Z
https://smolcss.dev/#smol-list-markers
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol List Markers","description":"Generated from: https://SmolCSS.dev/#smol-list-markers","tags":["utility","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol List Markers\nGenerated from: https://SmolCSS.dev/#smol-list-markers -->\n<div data-component class=\"smol-css-grid\">\n <ul class=\"smol-list-markers\" data-component>\n <li data-icon=\"🟣\">Chocolate cake pastry toffee tootsie roll</li>\n <li data-icon=\"💜\">Cake bear claw liquorice oat cake oat cake cheesecake</li>\n <li data-icon=\"🟪\">Ice cream soufflé carrot cake jelly-o bonbon</li>\n </ul>\n <ol class=\"smol-list-markers\" data-component>\n <li>Chocolate cake pastry toffee tootsie roll</li>\n <li>Cake bear claw liquorice oat cake oat cake cheesecake</li>\n <li>Ice cream soufflé carrot cake jelly-o bonbon</li>\n </ol>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n.smol-css-grid {\n --min: 20ch;\n --gap: 1rem;\n\n display: grid;\n grid-gap: var(--gap);\n grid-template-columns: repeat(auto-fit, minmax(var(--min), 1fr));\n}\n\n.smol-list-markers {\n --marker-color: #A150FB;\n \n padding: 0;\n margin: 0 0 0 2em;\n}\n\n.smol-list-markers li {\n padding-left: 0.5em;\n}\n\n.smol-list-markers li + li {\n margin-top: 0.5em;\n}\n\n.smol-list-markers li::marker {\n color: var(--marker-color);\n}\n\nul.smol-list-markers li::marker {\n content: attr(data-icon);\n font-size: 1.15em;\n}\n\nol.smol-list-markers li::marker {\n /* The `list-item` counter is provided by \n the browser for lists */\n content: counter(list-item); \n font-family: cursive;\n font-size: 1.5em;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol List Markers" aria-label="Open Smol List Markers in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Support for <code>::marker</code> is now available across all modern browsers! This pseudo-selector allows customizing the "bullet" for unordered lists and the numeral for ordered lists without other pseudo element hacks.</p>
<p><strong>Note</strong>: <code>::marker</code> only allows a select few properties to be modified including <code>animation-*</code>, <code>color</code>, <code>content</code>, <code>direction</code>, <code>font-*</code>, <code>transition-*</code>, <code>unicode-bidi</code>, and <code>white-space</code>.</p>
<p>The use of <code>::marker</code> is a great progressive enhancement that can be used safely without any special consideration since the default experience should always acceptable.</p>
<p><strong>Bonus</strong>: Check out how the emoji are being inserted thanks to the <code>content</code> property's ability to access custom data attributes! (This appears not yet supported for <code>::marker</code> in Safari)</p>
<style>
.smol-list-markers {
--marker-color: #A150FB;
padding: 0;
margin: 0 0 0 2em;
}
.smol-list-markers li {
padding-left: 0.5em;
}
.smol-list-markers li + li {
margin-top: 0.5em;
}
.smol-list-markers li::marker {
color: var(--marker-color);
}
ul.smol-list-markers li::marker {
content: attr(data-icon);
font-size: 1.15em;
}
ol.smol-list-markers li::marker {
/* The `list-item` counter is provided by
the browser for lists */
content: counter(list-item);
font-family: cursive;
font-size: 1.5em;
}
</style>
<details>
<summary>CSS for "Smol List Markers"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-list-markers</span> <span class="token punctuation">{</span>
<span class="token property">--marker-color</span><span class="token punctuation">:</span> #A150FB<span class="token punctuation">;</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>
<span class="token property">margin</span><span class="token punctuation">:</span> 0 0 0 2em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-list-markers li</span> <span class="token punctuation">{</span>
<span class="token property">padding-left</span><span class="token punctuation">:</span> 0.5em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-list-markers li + li</span> <span class="token punctuation">{</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> 0.5em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-list-markers li::marker</span> <span class="token punctuation">{</span>
<span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--marker-color<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">ul.smol-list-markers li::marker</span> <span class="token punctuation">{</span>
<span class="token property">content</span><span class="token punctuation">:</span> <span class="token function">attr</span><span class="token punctuation">(</span>data-icon<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 1.15em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">ol.smol-list-markers li::marker</span> <span class="token punctuation">{</span>
<span class="token comment">/* The `list-item` counter is provided by
the browser for lists */</span>
<span class="token property">content</span><span class="token punctuation">:</span> <span class="token function">counter</span><span class="token punctuation">(</span>list-item<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">font-family</span><span class="token punctuation">:</span> cursive<span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 1.5em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo no-resize">
<div data-component="" class="smol-css-grid">
<ul class="smol-list-markers" data-component="">
<li data-icon="🟣">Chocolate cake pastry toffee tootsie roll</li>
<li data-icon="💜">Cake bear claw liquorice oat cake oat cake cheesecake</li>
<li data-icon="🟪">Ice cream soufflé carrot cake jelly-o bonbon</li>
</ul>
<ol class="smol-list-markers" data-component="">
<li>Chocolate cake pastry toffee tootsie roll</li>
<li>Cake bear claw liquorice oat cake oat cake cheesecake</li>
<li>Ice cream soufflé carrot cake jelly-o bonbon</li>
</ol>
</div>
</div><footer>
<p>If you need more style control, you may still want to use an alternate method. Review my tutorial on creating <a href="https://moderncss.dev/totally-custom-list-styles/">totally custom list styles</a>.</p>
</footer>
2021-02-24T00:00:00Z
https://smolcss.dev/#smol-article-anchors
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Article Anchors","description":"Generated from: https://SmolCSS.dev/#smol-article-anchors","tags":["grid","component","utility","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Article Anchors\nGenerated from: https://SmolCSS.dev/#smol-article-anchors -->\n<div data-component class=\"smol-article-anchor\">\n <h3 id=\"smol-article-anchor-title\" data-component>A Wonderful Article Headline</h3>\n <a href=\"#smol-article-anchor-title\">\n <span aria-hidden=\"true\">#</span>\n <span class=\"smol-article-anchor-hidden\">Section titled A Wonderful Article Headline</span>\n </a>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-article-anchor {\n display: grid;\n grid-template-columns: min-content auto;\n position: relative;\n margin-top: 2em;\n /* You could pull this property out and\n generalize it under the selector `[id]` as\n it won't affect flow layout or regular margins */\n scroll-margin-top: 2em;\n}\n\n.smol-article-anchor:target::before {\n content: \"Is it me you're looking for?\";\n position: absolute;\n font-size: .9rem;\n top: -1.25rem;\n left: 0;\n font-style: italic;\n color: currentColor;\n}\n\n.smol-article-anchor a {\n grid-row-start: 1;\n align-self: start;\n font-size: 1rem;\n line-height: 1;\n /* We're using `transform` vs. margins */\n transform: translateX(-50%) translateY(25%);\n text-decoration: none;\n /* Be sure to check that your own colors still meet\n or exceed 4.5:1 contrast when using lowering opacity */\n opacity: 0.75;\n}\n\n.smol-article-anchor a:hover {\n text-decoration: underline;\n text-underline-offset: 0.25em;\n opacity: 1;\n}\n\n.smol-article-anchor a:focus {\n outline: 2px solid currentColor;\n outline-offset: 0.15em;\n}\n\n/* Visually hidden while remaining accessible to\nassistive tech like screen readers */\n.smol-article-anchor-hidden {\n width: 0;\n height: 0;\n overflow: hidden;\n position: absolute;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Article Anchors" aria-label="Open Smol Article Anchors in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Anchor links have had quite an evolution over the years. Have you checked if your implementation is as accessible as it can be? This demo starts with an accessible DOM structure as <a href="https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/">researched by Amber Wilson</a>, and then uses CSS grid to position the anchor link element.</p>
<p><strong>Note</strong>: When using grid or flexbox to change the visual order vs the DOM order, always be cautious of breaking expectations in visual focus order. In this case, we know the headline itself will not contain a link and so we are still able to maintain a visually logical focus order.</p>
<p>This demo also features an old pseudo class that is often forgotten which is <code>:target</code>. Go ahead - click the anchor in this demo or across this site. Thanks to <code>:target</code> coupled with <code>::before</code>, you'll be greeted with a friendly message to help identify the <em>target</em> of the hashed URL.</p>
<p>Finally, we've also included <code>scroll-margin-top</code> which adds margin <em>only</em> to an active page target. In other words, upon clicking an anchor link or visiting the site with a hashed URL, the scroll point will be above the target by the value of <code>scroll-margin-top</code> (<em>not yet available in Safari</em>).</p>
<p><strong>Bonus</strong>: Notice the properties set on <code>:focus</code> to adjust the <code>outline</code> position with <code>outline-offset</code>. And check out <code>:hover</code> to see <code>text-underline-offset</code> used to adjust the position of the underline.</p>
<style>
.smol-article-anchor {
display: grid;
grid-template-columns: min-content auto;
position: relative;
margin-top: 2em;
/* You could pull this property out and
generalize it under the selector `[id]` as
it won't affect flow layout or regular margins */
scroll-margin-top: 2em;
}
.smol-article-anchor:target::before {
content: "Is it me you're looking for?";
position: absolute;
font-size: .9rem;
top: -1.25rem;
left: 0;
font-style: italic;
color: currentColor;
}
.smol-article-anchor a {
grid-row-start: 1;
align-self: start;
font-size: 1rem;
line-height: 1;
/* We're using `transform` vs. margins */
transform: translateX(-50%) translateY(25%);
text-decoration: none;
/* Be sure to check that your own colors still meet
or exceed 4.5:1 contrast when using lowering opacity */
opacity: 0.75;
}
.smol-article-anchor a:hover {
text-decoration: underline;
text-underline-offset: 0.25em;
opacity: 1;
}
.smol-article-anchor a:focus {
outline: 2px solid currentColor;
outline-offset: 0.15em;
}
/* Visually hidden while remaining accessible to
assistive tech like screen readers */
.smol-article-anchor-hidden {
width: 0;
height: 0;
overflow: hidden;
position: absolute;
}
</style>
<details>
<summary>CSS for "Smol Article Anchors"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-article-anchor</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">grid-template-columns</span><span class="token punctuation">:</span> min-content auto<span class="token punctuation">;</span>
<span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> 2em<span class="token punctuation">;</span>
<span class="token comment">/* You could pull this property out and
generalize it under the selector `[id]` as
it won't affect flow layout or regular margins */</span>
<span class="token property">scroll-margin-top</span><span class="token punctuation">:</span> 2em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-article-anchor:target::before</span> <span class="token punctuation">{</span>
<span class="token property">content</span><span class="token punctuation">:</span> <span class="token string">"Is it me you're looking for?"</span><span class="token punctuation">;</span>
<span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> .9rem<span class="token punctuation">;</span>
<span class="token property">top</span><span class="token punctuation">:</span> -1.25rem<span class="token punctuation">;</span>
<span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>
<span class="token property">font-style</span><span class="token punctuation">:</span> italic<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> currentColor<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-article-anchor a</span> <span class="token punctuation">{</span>
<span class="token property">grid-row-start</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span>
<span class="token property">align-self</span><span class="token punctuation">:</span> start<span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">line-height</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span>
<span class="token comment">/* We're using `transform` vs. margins */</span>
<span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateX</span><span class="token punctuation">(</span>-50%<span class="token punctuation">)</span> <span class="token function">translateY</span><span class="token punctuation">(</span>25%<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">text-decoration</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span>
<span class="token comment">/* Be sure to check that your own colors still meet
or exceed 4.5:1 contrast when using lowering opacity */</span>
<span class="token property">opacity</span><span class="token punctuation">:</span> 0.75<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-article-anchor a:hover</span> <span class="token punctuation">{</span>
<span class="token property">text-decoration</span><span class="token punctuation">:</span> underline<span class="token punctuation">;</span>
<span class="token property">text-underline-offset</span><span class="token punctuation">:</span> 0.25em<span class="token punctuation">;</span>
<span class="token property">opacity</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-article-anchor a:focus</span> <span class="token punctuation">{</span>
<span class="token property">outline</span><span class="token punctuation">:</span> 2px solid currentColor<span class="token punctuation">;</span>
<span class="token property">outline-offset</span><span class="token punctuation">:</span> 0.15em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* Visually hidden while remaining accessible to
assistive tech like screen readers */</span>
<span class="token selector">.smol-article-anchor-hidden</span> <span class="token punctuation">{</span>
<span class="token property">width</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>
<span class="token property">height</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>
<span class="token property">overflow</span><span class="token punctuation">:</span> hidden<span class="token punctuation">;</span>
<span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo no-resize">
<div data-component="" class="smol-article-anchor">
<h3 id="smol-article-anchor-title" data-component="">A Wonderful Article Headline</h3>
<a href="https://smolcss.dev/feed/#smol-article-anchor-title">
<span aria-hidden="true">#</span>
<span class="smol-article-anchor-hidden">Section titled A Wonderful Article Headline</span>
</a>
</div>
</div><footer>
<p><a href="https://moderncss.dev/guide-to-advanced-css-selectors-part-two/">Learn more about the <code>:target</code> pseudo class</a> in part two of my guide to advanced CSS selectors.</p>
</footer>
2021-02-21T00:00:00Z
https://smolcss.dev/#smol-transitions
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Transitions","description":"Generated from: https://SmolCSS.dev/#smol-transitions","tags":["utility","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Transitions\nGenerated from: https://SmolCSS.dev/#smol-transitions -->\n<ul class=\"smol-flexbox-grid\" style=\"--min: 20ch\">\n <li class=\"smol-transitions rise\"><span>rise</span></li>\n <li class=\"smol-transitions rotate\"><span>rotate</span></li>\n <li class=\"smol-transitions zoom\"><span>zoom</span></li>\n <li class=\"smol-transitions fade\"><span>fade</span></li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n.smol-flexbox-grid {\n --min: 15ch;\n --gap: 1rem;\n\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap);\n}\n\n.smol-flexbox-grid > * {\n flex: 1 1 var(--min);\n}\n\n.smol-transitions > * {\n --transition-property: transform;\n --transition-duration: 180ms;\n\n transition: var(--transition-property) var(--transition-duration) ease-in-out;\n}\n\n.rise:hover > * {\n transform: translateY(-25%);\n}\n\n.rotate:hover > * {\n transform: rotate(15deg);\n}\n\n.zoom:hover > * {\n transform: scale(1.1);\n}\n\n.fade > * {\n --transition-property: opacity;\n --transition-duration: 500ms;\n}\n\n.fade:hover > * {\n opacity: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .smol-transitions > * {\n --transition-duration: 0.01ms;\n }\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Transitions" aria-label="Open Smol Transitions in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>This set of performant CSS transition utility classes include CSS custom properties for scaling the transition property and duration. We're doing a few things in this demo that you may want to keep in mind if you use them.</p>
<p>First, we're triggering the transition of the <em>child elements</em> on <code>:hover</code> of the parent. The reason for this is that for transitions that move the element, it could end up moving out from under the mouse and causing a flicker between states. The <code>rise</code> transition is particularly in danger of that behavior.</p>
<p>Second, we wrap our effect class in a media query check for <code>prefers-reduced-motion: reduce</code> that instantly jumps the transition to the final state. This is to comply with the request for reduced motion by effectively disabling the animated part of the transition.</p>
<style>
.smol-transitions > * {
--transition-property: transform;
--transition-duration: 180ms;
transition: var(--transition-property) var(--transition-duration) ease-in-out;
}
.rise:hover > * {
transform: translateY(-25%);
}
.rotate:hover > * {
transform: rotate(15deg);
}
.zoom:hover > * {
transform: scale(1.1);
}
.fade > * {
--transition-property: opacity;
--transition-duration: 500ms;
}
.fade:hover > * {
opacity: 0;
}
@media (prefers-reduced-motion: reduce) {
.smol-transitions > * {
--transition-duration: 0.01ms;
}
}
</style>
<details>
<summary>CSS for "Smol Transitions"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-transitions > *</span> <span class="token punctuation">{</span>
<span class="token property">--transition-property</span><span class="token punctuation">:</span> transform<span class="token punctuation">;</span>
<span class="token property">--transition-duration</span><span class="token punctuation">:</span> 180ms<span class="token punctuation">;</span>
<span class="token property">transition</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--transition-property<span class="token punctuation">)</span> <span class="token function">var</span><span class="token punctuation">(</span>--transition-duration<span class="token punctuation">)</span> ease-in-out<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.rise:hover > *</span> <span class="token punctuation">{</span>
<span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateY</span><span class="token punctuation">(</span>-25%<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.rotate:hover > *</span> <span class="token punctuation">{</span>
<span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">rotate</span><span class="token punctuation">(</span>15deg<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.zoom:hover > *</span> <span class="token punctuation">{</span>
<span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">scale</span><span class="token punctuation">(</span>1.1<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.fade > *</span> <span class="token punctuation">{</span>
<span class="token property">--transition-property</span><span class="token punctuation">:</span> opacity<span class="token punctuation">;</span>
<span class="token property">--transition-duration</span><span class="token punctuation">:</span> 500ms<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.fade:hover > *</span> <span class="token punctuation">{</span>
<span class="token property">opacity</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token atrule"><span class="token rule">@media</span> <span class="token punctuation">(</span><span class="token property">prefers-reduced-motion</span><span class="token punctuation">:</span> reduce<span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
<span class="token selector">.smol-transitions > *</span> <span class="token punctuation">{</span>
<span class="token property">--transition-duration</span><span class="token punctuation">:</span> 0.01ms<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo no-resize">
<ul class="smol-flexbox-grid" style="--min: 20ch">
<li class="smol-transitions rise"><span>rise</span></li>
<li class="smol-transitions rotate"><span>rotate</span></li>
<li class="smol-transitions zoom"><span>zoom</span></li>
<li class="smol-transitions fade"><span>fade</span></li>
</ul>
</div>
2021-02-21T00:00:00Z
https://smolcss.dev/#smol-scroll-snap
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Scroll Snap","description":"Generated from: https://SmolCSS.dev/#smol-scroll-snap","tags":["grid","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Scroll Snap\nGenerated from: https://SmolCSS.dev/#smol-scroll-snap -->\n<ul data-padding-unset class=\"smol-scroll-snap\">\n <li data-text>\n <p>Topping candy canes ice cream gummi bears gingerbread marshmallow. Chocolate cake powder sugar plum topping.</p>\n </li>\n <li data-text>\n <p>Cake marshmallow carrot cake. Pie liquorice liquorice sweet tootsie roll caramels donut dragée bear claw. Chocolate powder candy canes.</p>\n </li>\n <li data-text>\n <p>Pie chocolate cake dessert pastry candy canes donut pie soufflé pie. Fruitcake caramels tart pudding macaroon chocolate jelly beans brownie.</p>\n </li>\n <li data-text>\n <p>Icing dessert chocolate cupcake dragée sesame snaps. Icing pastry donut cupcake marshmallow sweet macaroon gummies.</p>\n </li>\n <li data-text>\n <p>Jelly wafer biscuit. Dessert halvah cheesecake. Liquorice jelly sweet roll marzipan biscuit</p>\n </li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-scroll-snap {\n /* Set up container positioning */\n display: grid;\n grid-auto-flow: column;\n grid-gap: 1.5rem;\n /* Enable overflow along our scroll axis */\n overflow-x: auto;\n /* Define axis and scroll type, where\n `mandatory` means any scroll attempt will\n cause a scroll to the next item */\n scroll-snap-type: x mandatory;\n padding: 0 0 1.5rem;\n -webkit-overflow-scrolling: touch;\n}\n\n.smol-scroll-snap > * {\n width: min(45ch, 60vw);\n /* Choose how to align children on scroll */\n scroll-snap-align: center;\n /* Prevents scrolling past more than one child */\n scroll-snap-stop: always;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Scroll Snap" aria-label="Open Smol Scroll Snap in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Modern CSS has gifted us a series of properties that enable setting up more controlled scrolling experiences. In this demo, you'll find that as you begin to scroll, the middle items "snap" to the center of the scrollable area. Additionally, you are unable to scroll past more than one item at a time.</p>
<p>To align the scroll items, we're using grid and updating the orientation of child items using <code>grid-auto-flow: column</code>. Then the width of the grid children is set using <code>min()</code> which selects the <em>minimum computed value</em> between the options provided. The selected width options in this demo results in a large section of neighboring items being visible in the scrollable area for large viewports, while on smaller viewports the scrollable area is mostly consumed by the current scroll item.</p>
<p><em>While this is a very cool feature set, use with care!</em> Be sure to test your implementation to ensure its not inaccessible. Test across a variety of devices, and with desktop zoom particularly at levels of 200% and 400% to check for overlap and how a changed aspect ratio affects scroll items. Try it out with a screen reader and make sure you can navigate to all content.</p>
<p><strong>Note</strong>: Have caution when attempting to mix fullscreen scroll snap slideshows followed by normal flow content. This can damage the overall scrolling experience and even prevent access to content. Fullscreen scroll areas are also prone to issues for users of high desktop zoom due to high risk of overlapping content as the aspect ratio changes. In addition, fullscreen versions that use <code>y mandatory</code> result in "scroll hijacking" which can be frustrating to users.</p>
<p>Also - you may have a pleasant smooth scroll experience on a touchpad or magic mouse. But mouse users who rely on interacting with the scroll bar arrows or use a click wheel can have a jarring experience. This is due to browser and OS inconsistencies in handling the snapping based on input method (an issue was specifically reported for this demo using Chrome and Edge on PC).</p>
<style>
.smol-scroll-snap {
/* Set up container positioning */
display: grid;
grid-auto-flow: column;
grid-gap: 1.5rem;
/* Enable overflow along our scroll axis */
overflow-x: auto;
/* Define axis and scroll type, where
`mandatory` means any scroll attempt will
cause a scroll to the next item */
scroll-snap-type: x mandatory;
padding: 0 0 1.5rem;
-webkit-overflow-scrolling: touch;
}
.smol-scroll-snap > * {
width: min(45ch, 60vw);
/* Choose how to align children on scroll */
scroll-snap-align: center;
/* Prevents scrolling past more than one child */
scroll-snap-stop: always;
}
</style>
<details>
<summary>CSS for "Smol Scroll Snap"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-scroll-snap</span> <span class="token punctuation">{</span>
<span class="token comment">/* Set up container positioning */</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">grid-auto-flow</span><span class="token punctuation">:</span> column<span class="token punctuation">;</span>
<span class="token property">grid-gap</span><span class="token punctuation">:</span> 1.5rem<span class="token punctuation">;</span>
<span class="token comment">/* Enable overflow along our scroll axis */</span>
<span class="token property">overflow-x</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token comment">/* Define axis and scroll type, where
`mandatory` means any scroll attempt will
cause a scroll to the next item */</span>
<span class="token property">scroll-snap-type</span><span class="token punctuation">:</span> x mandatory<span class="token punctuation">;</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 0 0 1.5rem<span class="token punctuation">;</span>
<span class="token property">-webkit-overflow-scrolling</span><span class="token punctuation">:</span> touch<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-scroll-snap > *</span> <span class="token punctuation">{</span>
<span class="token property">width</span><span class="token punctuation">:</span> <span class="token function">min</span><span class="token punctuation">(</span>45ch<span class="token punctuation">,</span> 60vw<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* Choose how to align children on scroll */</span>
<span class="token property">scroll-snap-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
<span class="token comment">/* Prevents scrolling past more than one child */</span>
<span class="token property">scroll-snap-stop</span><span class="token punctuation">:</span> always<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo no-resize">
<ul data-padding-unset="" class="smol-scroll-snap">
<li data-text="">
<p>Topping candy canes ice cream gummi bears gingerbread marshmallow. Chocolate cake powder sugar plum topping.</p>
</li>
<li data-text="">
<p>Cake marshmallow carrot cake. Pie liquorice liquorice sweet tootsie roll caramels donut dragée bear claw. Chocolate powder candy canes.</p>
</li>
<li data-text="">
<p>Pie chocolate cake dessert pastry candy canes donut pie soufflé pie. Fruitcake caramels tart pudding macaroon chocolate jelly beans brownie.</p>
</li>
<li data-text="">
<p>Icing dessert chocolate cupcake dragée sesame snaps. Icing pastry donut cupcake marshmallow sweet macaroon gummies.</p>
</li>
<li data-text="">
<p>Jelly wafer biscuit. Dessert halvah cheesecake. Liquorice jelly sweet roll marzipan biscuit</p>
</li>
</ul>
</div>
2021-02-20T00:00:00Z
https://smolcss.dev/#smol-avatar-list
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Avatar List Component","description":"Generated from: https://SmolCSS.dev/#smol-avatar-list","tags":["grid","layout","component","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Avatar List Component\nGenerated from: https://SmolCSS.dev/#smol-avatar-list -->\n<ul data-component data-padding-unset class=\"smol-avatar-list\">\n <li><a href=\"#smol-avatar-list\"><img alt=\"Avatar 1\" src='https://avataaars.io/?avatarStyle=Transparent&topType=LongHairBun&accessoriesType=Blank&hairColor=Auburn&facialHairType=BeardMedium&facialHairColor=Auburn&clotheType=ShirtCrewNeck&clotheColor=Blue01&eyeType=Side&eyebrowType=RaisedExcitedNatural&mouthType=Serious&skinColor=Tanned' /></a></li>\n <li><a href=\"#smol-avatar-list\"><img alt=\"Avatar 2\" src='https://avataaars.io/?avatarStyle=Transparent&topType=LongHairDreads&accessoriesType=Blank&hairColor=Brown&facialHairType=Blank&clotheType=ShirtScoopNeck&clotheColor=PastelGreen&eyeType=Default&eyebrowType=DefaultNatural&mouthType=Smile&skinColor=Tanned' /></a></li>\n <li><a href=\"#smol-avatar-list\"><img alt=\"Avatar 3\" src='https://avataaars.io/?avatarStyle=Transparent&topType=LongHairCurly&hairColor=BrownDark&facialHairType=Blank&clotheType=GraphicShirt&clotheColor=Pink&graphicType=Diamond&eyeType=Side&eyebrowType=Default&mouthType=Default&skinColor=Brown'/></a></li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-avatar-list {\n --avatar-size: 3rem;\n --avatar-count: 3;\n\n display: grid;\n /* Default to displaying most of the avatar to\n enable easier access on touch devices, ensuring\n the WCAG touch target size is met or exceeded */\n grid-template-columns: repeat(\n var(--avatar-count),\n max(44px, calc(var(--avatar-size) / 1.15))\n );\n /* `padding` matches added visual dimensions of\n the `box-shadow` to help create a more accurate\n computed component size */\n padding: 0.08em;\n font-size: var(--avatar-size);\n}\n\n@media (any-hover: hover) and (any-pointer: fine) {\n .smol-avatar-list {\n /* We create 1 extra cell to enable the computed \n width to match the final visual width */\n grid-template-columns: repeat(\n calc(var(--avatar-count) + 1),\n calc(var(--avatar-size) / 1.75)\n );\n }\n}\n\n.smol-avatar-list li {\n width: var(--avatar-size);\n height: var(--avatar-size);\n}\n\n.smol-avatar-list li:hover ~ li a,\n.smol-avatar-list li:focus-within ~ li a {\n transform: translateX(33%);\n}\n\n.smol-avatar-list img,\n.smol-avatar-list a {\n display: block;\n border-radius: 50%;\n}\n\n.smol-avatar-list a {\n transition: transform 180ms ease-in-out;\n}\n\n.smol-avatar-list img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-color: #fff;\n box-shadow: 0 0 0 0.05em #fff, 0 0 0 0.08em rgba(0, 0, 0, 0.15);\n}\n\n.smol-avatar-list a:focus {\n outline: 2px solid transparent;\n /* Double-layer trick to work for dark and light backgrounds */\n box-shadow: 0 0 0 0.08em #29344B, 0 0 0 0.12em white;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Avatar List Component" aria-label="Open Smol Avatar List Component in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>This smol component, which you may also know as a <a href="https://indieweb.org/facepile">facepile</a>, is possible due to the ability of CSS grid to easily create overlapping content. Paired with CSS custom properties and <code>calc()</code> we can make this a contextually resizable component.</p>
<p>Based on devices capabilities, the grid columns are adjusted to slightly narrower than the <code>--avatar-size</code>. Since nothing inherent to CSS grid stops the content overflowing, it forces an overlap based on DOM order of the list items. To ensure perfect circle images, we first use the <code>--avatar-size</code> value to explicitly set the list item dimensions. Then by setting both width and height to <code>100%</code> on the <code>img</code> in addition to <code>object-fit: cover</code> and <code>border-radius: 50%</code>, we can be assured that regardless of actual image dimensions the contents will be forced into a circle appearance.</p>
<p><strong>Bonus trick #1</strong> is the use of layered <code>box-shadow</code> values that only set a <em>spread</em> to create the appearance of borders without adding to the computed dimensions of the image. The spread values are set with <code>em</code> so that they are relative to the avatar size. And that works because we set the list's <code>font-size</code> to <code>--avatar-size</code>.</p>
<p><strong>Bonus trick #2</strong> is using the <em>general sibling combinator</em> (<code>~</code>) so that on hover or <code>:focus-within</code> of an <code>li</code>, all linked images that follow animate over to reveal more of the hovered avatar. If the number of avatars will cause wrapping, you may want to choose a different effect such as changing the layering via <code>z-index</code>.</p>
<p>🔎 Pop open your browser devtools and experiment with changing the <code>--avatar-size</code> value!</p>
<style>
.smol-avatar-list {
--avatar-size: 3rem;
--avatar-count: 3;
display: grid;
/* Default to displaying most of the avatar to
enable easier access on touch devices, ensuring
the WCAG touch target size is met or exceeded */
grid-template-columns: repeat(
var(--avatar-count),
max(44px, calc(var(--avatar-size) / 1.15))
);
/* `padding` matches added visual dimensions of
the `box-shadow` to help create a more accurate
computed component size */
padding: 0.08em;
font-size: var(--avatar-size);
}
@media (any-hover: hover) and (any-pointer: fine) {
.smol-avatar-list {
/* We create 1 extra cell to enable the computed
width to match the final visual width */
grid-template-columns: repeat(
calc(var(--avatar-count) + 1),
calc(var(--avatar-size) / 1.75)
);
}
}
.smol-avatar-list li {
width: var(--avatar-size);
height: var(--avatar-size);
}
.smol-avatar-list li:hover ~ li a,
.smol-avatar-list li:focus-within ~ li a {
transform: translateX(33%);
}
.smol-avatar-list img,
.smol-avatar-list a {
display: block;
border-radius: 50%;
}
.smol-avatar-list a {
transition: transform 180ms ease-in-out;
}
.smol-avatar-list img {
width: 100%;
height: 100%;
object-fit: cover;
background-color: #fff;
box-shadow: 0 0 0 0.05em #fff, 0 0 0 0.08em rgba(0, 0, 0, 0.15);
}
.smol-avatar-list a:focus {
outline: 2px solid transparent;
/* Double-layer trick to work for dark and light backgrounds */
box-shadow: 0 0 0 0.08em #29344B, 0 0 0 0.12em white;
}
</style>
<details>
<summary>CSS for "Smol Avatar List Component"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-avatar-list</span> <span class="token punctuation">{</span>
<span class="token property">--avatar-size</span><span class="token punctuation">:</span> 3rem<span class="token punctuation">;</span>
<span class="token property">--avatar-count</span><span class="token punctuation">:</span> 3<span class="token punctuation">;</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token comment">/* Default to displaying most of the avatar to
enable easier access on touch devices, ensuring
the WCAG touch target size is met or exceeded */</span>
<span class="token property">grid-template-columns</span><span class="token punctuation">:</span> <span class="token function">repeat</span><span class="token punctuation">(</span>
<span class="token function">var</span><span class="token punctuation">(</span>--avatar-count<span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token function">max</span><span class="token punctuation">(</span>44px<span class="token punctuation">,</span> <span class="token function">calc</span><span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span>--avatar-size<span class="token punctuation">)</span> / 1.15<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* `padding` matches added visual dimensions of
the `box-shadow` to help create a more accurate
computed component size */</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 0.08em<span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--avatar-size<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token atrule"><span class="token rule">@media</span> <span class="token punctuation">(</span><span class="token property">any-hover</span><span class="token punctuation">:</span> hover<span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token punctuation">(</span><span class="token property">any-pointer</span><span class="token punctuation">:</span> fine<span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
<span class="token selector">.smol-avatar-list</span> <span class="token punctuation">{</span>
<span class="token comment">/* We create 1 extra cell to enable the computed
width to match the final visual width */</span>
<span class="token property">grid-template-columns</span><span class="token punctuation">:</span> <span class="token function">repeat</span><span class="token punctuation">(</span>
<span class="token function">calc</span><span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span>--avatar-count<span class="token punctuation">)</span> + 1<span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token function">calc</span><span class="token punctuation">(</span><span class="token function">var</span><span class="token punctuation">(</span>--avatar-size<span class="token punctuation">)</span> / 1.75<span class="token punctuation">)</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-avatar-list li</span> <span class="token punctuation">{</span>
<span class="token property">width</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--avatar-size<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">height</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--avatar-size<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-avatar-list li:hover ~ li a,
.smol-avatar-list li:focus-within ~ li a</span> <span class="token punctuation">{</span>
<span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateX</span><span class="token punctuation">(</span>33%<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-avatar-list img,
.smol-avatar-list a</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span>
<span class="token property">border-radius</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-avatar-list a</span> <span class="token punctuation">{</span>
<span class="token property">transition</span><span class="token punctuation">:</span> transform 180ms ease-in-out<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-avatar-list img</span> <span class="token punctuation">{</span>
<span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token property">height</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token property">object-fit</span><span class="token punctuation">:</span> cover<span class="token punctuation">;</span>
<span class="token property">background-color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span>
<span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 0 0 0.05em #fff<span class="token punctuation">,</span> 0 0 0 0.08em <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.15<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-avatar-list a:focus</span> <span class="token punctuation">{</span>
<span class="token property">outline</span><span class="token punctuation">:</span> 2px solid transparent<span class="token punctuation">;</span>
<span class="token comment">/* Double-layer trick to work for dark and light backgrounds */</span>
<span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 0 0 0.08em #29344B<span class="token punctuation">,</span> 0 0 0 0.12em white<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="centered" class="demo no-resize">
<ul data-component="" data-padding-unset="" class="smol-avatar-list">
<li><a href="https://smolcss.dev/feed/#smol-avatar-list"><img alt="Avatar 1" src="https://avataaars.io/?avatarStyle=Transparent&topType=LongHairBun&accessoriesType=Blank&hairColor=Auburn&facialHairType=BeardMedium&facialHairColor=Auburn&clotheType=ShirtCrewNeck&clotheColor=Blue01&eyeType=Side&eyebrowType=RaisedExcitedNatural&mouthType=Serious&skinColor=Tanned" /></a></li>
<li><a href="https://smolcss.dev/feed/#smol-avatar-list"><img alt="Avatar 2" src="https://avataaars.io/?avatarStyle=Transparent&topType=LongHairDreads&accessoriesType=Blank&hairColor=Brown&facialHairType=Blank&clotheType=ShirtScoopNeck&clotheColor=PastelGreen&eyeType=Default&eyebrowType=DefaultNatural&mouthType=Smile&skinColor=Tanned" /></a></li>
<li><a href="https://smolcss.dev/feed/#smol-avatar-list"><img alt="Avatar 3" src="https://avataaars.io/?avatarStyle=Transparent&topType=LongHairCurly&hairColor=BrownDark&facialHairType=Blank&clotheType=GraphicShirt&clotheColor=Pink&graphicType=Diamond&eyeType=Side&eyebrowType=Default&mouthType=Default&skinColor=Brown" /></a></li>
</ul>
</div><footer>
<p>ICYMI earlier - check out my quick <a href="https://egghead.io/lessons/css-apply-aspect-ratio-sizing-to-images-with-css-object-fit?af=2s65ms">video lesson on object-fit</a> to learn more about how it works. Or you might enjoy more <a href="https://moderncss.dev/the-3-css-methods-for-adding-element-borders/">methods for creating CSS borders</a> or see an additional <a href="https://moderncss.dev/css-only-accessible-dropdown-navigation-menu/">example of using <code>:focus-within</code></a>. <em>Source images from <a href="https://getavataaars.com/">avataaars</a></em>.</p>
</footer>
2021-02-19T00:00:00Z
https://smolcss.dev/#smol-stack-layout
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Stack Layout","description":"Generated from: https://SmolCSS.dev/#smol-stack-layout","tags":["grid","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Stack Layout\nGenerated from: https://SmolCSS.dev/#smol-stack-layout -->\n<div data-component class=\"smol-stack-layout smol-stack-layout--video\" style=\"--stack-aspect-ratio: 16/9\">\n <video muted autoplay>\n <source src=\"https://smolcss.dev/assets/video.mp4\" type=\"video/mp4\">\n </video>\n <h3>Into The Unknown</h3>\n <small>Video from <a href=\"https://www.pexels.com/video/a-sky-full-of-stars-at-night-2646392/\">Pexels</a></small>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-stack-layout {\n display: grid;\n grid-template-areas: \"stack\";\n /* Set within the HTML for the demo */\n aspect-ratio: var(--stack-aspect-ratio);\n background-color: #200070;\n}\n\n.smol-stack-layout > * {\n grid-area: stack;\n}\n\n.smol-stack-layout video {\n width: 100%;\n}\n\n.smol-stack-layout h3 {\n place-self: center;\n font-size: clamp(2.5rem, 5vw, 5rem);\n text-align: center;\n line-height: 1;\n font-style: italic;\n padding: 5vh 2vw;\n}\n\n.smol-stack-layout--video small {\n align-self: end;\n justify-self: start;\n padding: 0 0 0.25em 0.5em;\n opacity: 0.8;\n font-size: 0.8rem;\n}\n\n.smol-stack-layout h3,\n.smol-stack-layout small {\n position: relative;\n color: #fff;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Stack Layout" aria-label="Open Smol Stack Layout in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>This smol stacked layout is a grid feature that can often replace older techniques that relied on absolute positioning. It works by defining a single <code>grid-template-area</code> and then assigning all direct children to that <code>grid-area</code>. The children are then "stacked" and can take advantage of grid positioning, such as the centering technique in the demo.</p>
<p>At first glance you might not notice, but that's a video background in the demo. And all we had to do was set <code>width: 100%</code> to ensure it filled the grid area. Then, we make use of <code>place-self</code> on the <code>h3</code> to center it. The rest is completely optional design styling!</p>
<p>Bonus features in this demo include defining the <code>h3</code> size using <code>clamp()</code> for <em>viewport relative sizing</em>, and also using <code>aspect-ratio</code> to size the container to help reduce <a href="https://web.dev/cls/">cumulative layout shift</a>.</p>
<style>
.smol-stack-layout {
display: grid;
grid-template-areas: "stack";
/* Set within the HTML for the demo */
aspect-ratio: var(--stack-aspect-ratio);
background-color: #200070;
}
.smol-stack-layout > * {
grid-area: stack;
}
.smol-stack-layout video {
width: 100%;
}
.smol-stack-layout h3 {
place-self: center;
font-size: clamp(2.5rem, 5vw, 5rem);
text-align: center;
line-height: 1;
font-style: italic;
padding: 5vh 2vw;
}
.smol-stack-layout--video small {
align-self: end;
justify-self: start;
padding: 0 0 0.25em 0.5em;
opacity: 0.8;
font-size: 0.8rem;
}
.smol-stack-layout h3,
.smol-stack-layout small {
position: relative;
color: #fff;
}
</style>
<details>
<summary>CSS for "Smol Stack Layout"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-stack-layout</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">grid-template-areas</span><span class="token punctuation">:</span> <span class="token string">"stack"</span><span class="token punctuation">;</span>
<span class="token comment">/* Set within the HTML for the demo */</span>
<span class="token property">aspect-ratio</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--stack-aspect-ratio<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">background-color</span><span class="token punctuation">:</span> #200070<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-stack-layout > *</span> <span class="token punctuation">{</span>
<span class="token property">grid-area</span><span class="token punctuation">:</span> stack<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-stack-layout video</span> <span class="token punctuation">{</span>
<span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-stack-layout h3</span> <span class="token punctuation">{</span>
<span class="token property">place-self</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> <span class="token function">clamp</span><span class="token punctuation">(</span>2.5rem<span class="token punctuation">,</span> 5vw<span class="token punctuation">,</span> 5rem<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
<span class="token property">line-height</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span>
<span class="token property">font-style</span><span class="token punctuation">:</span> italic<span class="token punctuation">;</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 5vh 2vw<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-stack-layout--video small</span> <span class="token punctuation">{</span>
<span class="token property">align-self</span><span class="token punctuation">:</span> end<span class="token punctuation">;</span>
<span class="token property">justify-self</span><span class="token punctuation">:</span> start<span class="token punctuation">;</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 0 0 0.25em 0.5em<span class="token punctuation">;</span>
<span class="token property">opacity</span><span class="token punctuation">:</span> 0.8<span class="token punctuation">;</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 0.8rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-stack-layout h3,
.smol-stack-layout small</span> <span class="token punctuation">{</span>
<span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span>
<span class="token property">color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<div data-component="" class="smol-stack-layout smol-stack-layout--video" style="--stack-aspect-ratio: 16/9">
<video muted="" autoplay="">
<source src="https://smolcss.dev/assets/video.mp4" type="video/mp4" />
</video>
<h3>Into The Unknown</h3>
<small>Video from <a href="https://www.pexels.com/video/a-sky-full-of-stars-at-night-2646392/">Pexels</a></small>
</div>
</div><footer>
<p>For more examples of creating smol stack layouts, review my guide to <a href="https://moderncss.dev/3-popular-website-heroes-created-with-css-grid-layout/">website hero designs</a>, see how it's used for <a href="https://moderncss.dev/pure-css-custom-checkbox-style/">creating custom checkboxes</a>, and learn to use it to <a href="https://moderncss.dev/animated-image-gallery-captions-with-bonus-ken-burns-effect/">position animated image captions</a>.</p>
</footer>
2021-02-14T00:00:00Z
https://smolcss.dev/#smol-card-component
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Composable Card Component","description":"Generated from: https://SmolCSS.dev/#smol-card-component","tags":["grid","flexbox","component","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Composable Card Component\nGenerated from: https://SmolCSS.dev/#smol-card-component -->\n<ul data-component class=\"smol-css-grid\" style=\"--min: 22ch; --gap: 2rem;\">\n <li data-component class=\"smol-card-component\">\n <img src='https://images.unsplash.com/photo-1607274227313-08146c819e6f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHw&ixlib=rb-1.2.1&q=80&w=400' alt=''>\n <h3>Card Headline 1</h3>\n <p>Chocolate cake macaroon tootsie roll pastry gummies.</p>\n <p>Apple pie jujubes cheesecake ice cream gummies sweet roll lollipop.</p>\n <a href=\"https://moderncss.dev\">Visit ModernCSS.dev</a>\n </li>\n <li data-component class=\"smol-card-component\">\n <h3>Card Headline 2</h3>\n <img src='https://images.unsplash.com/photo-1607274227313-08146c819e6f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHw&ixlib=rb-1.2.1&q=80&w=400' alt=''>\n <p>Chocolate cake macaroon tootsie roll pastry gummies.</p>\n </li>\n <li data-component class=\"smol-card-component\">\n <h3>Card Headline 3</h3>\n <p>Apple pie jujubes cheesecake ice cream gummies sweet roll lollipop.</p>\n <p>Chocolate cake macaroon tootsie roll pastry gummies.</p>\n <img src='https://images.unsplash.com/photo-1607274227313-08146c819e6f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHw&ixlib=rb-1.2.1&q=80&w=400' alt=''>\n </li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n.smol-css-grid {\n --min: 20ch;\n --gap: 1rem;\n\n display: grid;\n grid-gap: var(--gap);\n grid-template-columns: repeat(auto-fit, minmax(var(--min), 1fr));\n}\n\n.smol-card-component {\n --img-ratio: 3/2;\n\n display: flex;\n flex-direction: column;\n /* Supported for flexbox in modern browsers since April 2021 */\n gap: 1rem;\n box-shadow: 0 0 0.5rem hsl(0 0% 0% / 35%);\n border-radius: 0.5rem;\n}\n\n.smol-card-component > img {\n aspect-ratio: var(--img-ratio);\n object-fit: cover;\n width: 100%;\n}\n\n.smol-card-component > img:first-child {\n border-radius: 0.5rem 0.5rem 0 0;\n}\n\n.smol-card-component > img:last-child {\n border-radius: 0 0 0.5rem 0.5rem;\n margin-top: auto;\n}\n\n.smol-card-component > :not(img) {\n margin-left: 1rem;\n margin-right: 1rem;\n\n /* Prevent typography \"orphans\" */\n text-wrap: pretty;\n}\n\n.smol-card-component > :not(img):first-child {\n margin-top: 1rem;\n}\n\n/* Enhanced `:not()` accepts a selector list,\nbut as a fallback you can chain `:not()` instead */\n.smol-card-component > :last-of-type:not(img, h2, h3, h4) {\n margin-bottom: 1rem;\n}\n\n.smol-card-component > :not(h2, h3, h4) {\n font-size: 0.9rem;\n}\n\n.smol-card-component > a {\n align-self: start;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Composable Card Component" aria-label="Open Smol Composable Card Component in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>This component features <code>aspect-ratio</code> and leans heavily on the pseudo selectors of <code>:not()</code>, <code>:first-child</code>, and <code>:last-child</code>. The result is a composable card component that <em>just works</em> with your desired semantic internal content.</p>
<p>With <a href="https://drafts.csswg.org/selectors-4/#negation">CSS Selectors Level 4</a>, the enhanced version of <code>:not()</code> now allows a selector list. This ability is fairly <a href="https://caniuse.com/css-not-sel-list">well supported in modern browsers</a>.</p>
<p>A tiny modern CSS progressive enhancement is the use of <code>text-wrap: pretty</code> which prevents typography "orphans" by evaluating the last four lines in a text block and makes adjustments so the last line has two or more words.</p>
<p><strong>Note</strong>: You may need to create fallbacks for <code>aspect-ratio</code> for your unique audience and consider this solution as a progressive enhancement. Review the <a href="https://smolcss.dev/feed/#smol-aspect-ratio-gallery">Smol Aspect Ratio Gallery</a> for one method of creating a fallback.</p>
<blockquote>
<p>This solution also uses the <a href="https://smolcss.dev/feed/#smol-css-grid">Smol Responsive CSS Grid</a> to contain the cards.</p>
</blockquote>
<style>
.smol-card-component {
--img-ratio: 3/2;
display: flex;
flex-direction: column;
/* Supported for flexbox in modern browsers since April 2021 */
gap: 1rem;
box-shadow: 0 0 0.5rem hsl(0 0% 0% / 35%);
border-radius: 0.5rem;
}
.smol-card-component > img {
aspect-ratio: var(--img-ratio);
object-fit: cover;
width: 100%;
}
.smol-card-component > img:first-child {
border-radius: 0.5rem 0.5rem 0 0;
}
.smol-card-component > img:last-child {
border-radius: 0 0 0.5rem 0.5rem;
margin-top: auto;
}
.smol-card-component > :not(img) {
margin-left: 1rem;
margin-right: 1rem;
/* Prevent typography "orphans" */
text-wrap: pretty;
}
.smol-card-component > :not(img):first-child {
margin-top: 1rem;
}
/* Enhanced `:not()` accepts a selector list,
but as a fallback you can chain `:not()` instead */
.smol-card-component > :last-of-type:not(img, h2, h3, h4) {
margin-bottom: 1rem;
}
.smol-card-component > :not(h2, h3, h4) {
font-size: 0.9rem;
}
.smol-card-component > a {
align-self: start;
}
</style>
<details>
<summary>CSS for "Smol Composable Card Component"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-card-component</span> <span class="token punctuation">{</span>
<span class="token property">--img-ratio</span><span class="token punctuation">:</span> 3/2<span class="token punctuation">;</span>
<span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>
<span class="token property">flex-direction</span><span class="token punctuation">:</span> column<span class="token punctuation">;</span>
<span class="token comment">/* Supported for flexbox in modern browsers since April 2021 */</span>
<span class="token property">gap</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 0 0.5rem <span class="token function">hsl</span><span class="token punctuation">(</span>0 0% 0% / 35%<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">border-radius</span><span class="token punctuation">:</span> 0.5rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-card-component > img</span> <span class="token punctuation">{</span>
<span class="token property">aspect-ratio</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--img-ratio<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">object-fit</span><span class="token punctuation">:</span> cover<span class="token punctuation">;</span>
<span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-card-component > img:first-child</span> <span class="token punctuation">{</span>
<span class="token property">border-radius</span><span class="token punctuation">:</span> 0.5rem 0.5rem 0 0<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-card-component > img:last-child</span> <span class="token punctuation">{</span>
<span class="token property">border-radius</span><span class="token punctuation">:</span> 0 0 0.5rem 0.5rem<span class="token punctuation">;</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-card-component > :not(img)</span> <span class="token punctuation">{</span>
<span class="token property">margin-left</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">margin-right</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token comment">/* Prevent typography "orphans" */</span>
<span class="token property">text-wrap</span><span class="token punctuation">:</span> pretty<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-card-component > :not(img):first-child</span> <span class="token punctuation">{</span>
<span class="token property">margin-top</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* Enhanced `:not()` accepts a selector list,
but as a fallback you can chain `:not()` instead */</span>
<span class="token selector">.smol-card-component > :last-of-type:not(img, h2, h3, h4)</span> <span class="token punctuation">{</span>
<span class="token property">margin-bottom</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-card-component > :not(h2, h3, h4)</span> <span class="token punctuation">{</span>
<span class="token property">font-size</span><span class="token punctuation">:</span> 0.9rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-card-component > a</span> <span class="token punctuation">{</span>
<span class="token property">align-self</span><span class="token punctuation">:</span> start<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<ul data-component="" class="smol-css-grid" style="--min: 22ch; --gap: 2rem;">
<li data-component="" class="smol-card-component">
<img src="https://images.unsplash.com/photo-1607274227313-08146c819e6f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHw&ixlib=rb-1.2.1&q=80&w=400" alt="" />
<h3>Card Headline 1</h3>
<p>Chocolate cake macaroon tootsie roll pastry gummies.</p>
<p>Apple pie jujubes cheesecake ice cream gummies sweet roll lollipop.</p>
<a href="https://moderncss.dev/">Visit ModernCSS.dev</a>
</li>
<li data-component="" class="smol-card-component">
<h3>Card Headline 2</h3>
<img src="https://images.unsplash.com/photo-1607274227313-08146c819e6f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHw&ixlib=rb-1.2.1&q=80&w=400" alt="" />
<p>Chocolate cake macaroon tootsie roll pastry gummies.</p>
</li>
<li data-component="" class="smol-card-component">
<h3>Card Headline 3</h3>
<p>Apple pie jujubes cheesecake ice cream gummies sweet roll lollipop.</p>
<p>Chocolate cake macaroon tootsie roll pastry gummies.</p>
<img src="https://images.unsplash.com/photo-1607274227313-08146c819e6f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHw&ixlib=rb-1.2.1&q=80&w=400" alt="" />
</li>
</ul>
</div><footer>
<p>Learn more about CSS selectors in my two part guide, where part one covers <a href="https://moderncss.dev/guide-to-advanced-css-selectors-part-one/">selectors and combinators</a> and part two covers <a href="https://moderncss.dev/guide-to-advanced-css-selectors-part-two/">pseudo classes and pseudo elements</a>.</p>
</footer>
2021-02-14T00:00:00Z
https://smolcss.dev/#smol-aspect-ratio-gallery
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Aspect Ratio Gallery","description":"Generated from: https://SmolCSS.dev/#smol-aspect-ratio-gallery","tags":["flexbox","layout","component","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Aspect Ratio Gallery\nGenerated from: https://SmolCSS.dev/#smol-aspect-ratio-gallery -->\n<ul data-component class=\"smol-aspect-ratio-gallery smol-flexbox-grid\">\n <li>\n <img\n src=\"https://images.unsplash.com/photo-1596401463492-1ca39cdf7575?ixlib=rb-1.2.1&q=45&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=350\"\n alt=\"\"\n />\n </li>\n <li>\n <img\n src=\"https://images.unsplash.com/photo-1591756985756-6e231184528b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=350&q=45\"\n alt=\"\"\n />\n </li>\n <li>\n <img\n src=\"https://images.unsplash.com/photo-1556195947-316050222289?ixlib=rb-1.2.1&q=45&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=350\"\n alt=\"\"\n />\n </li>\n <li>\n <img\n src=\"https://images.unsplash.com/photo-1597264121870-2f1b4d43d2f6?ixlib=rb-1.2.1&q=65&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=350\"\n alt=\"\"\n />\n </li>\n <li>\n <img\n src=\"https://images.unsplash.com/photo-1465566829994-b8da8cae5909?ixlib=rb-1.2.1&q=65&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=400\"\n alt=\"\"\n />\n </li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n.smol-flexbox-grid {\n --min: 15ch;\n --gap: 1rem;\n\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap);\n}\n\n.smol-flexbox-grid > * {\n flex: 1 1 var(--min);\n}\n\n.smol-aspect-ratio-gallery {\n --min: 15rem;\n --aspect-ratio: 4/3;\n --gap: 0;\n}\n\n.smol-aspect-ratio-gallery li {\n height: max(25vh, 15rem);\n}\n\n@supports (aspect-ratio: 1) {\n .smol-aspect-ratio-gallery li {\n aspect-ratio: var(--aspect-ratio);\n height: auto;\n }\n}\n\n.smol-aspect-ratio-gallery img {\n display: block;\n object-fit: cover;\n width: 100%;\n height: 100%;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Aspect Ratio Gallery" aria-label="Open Smol Aspect Ratio Gallery in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>The <code>aspect-ratio</code> property <a href="https://caniuse.com/mdn-css_properties_aspect-ratio">has support in all major modern browsers</a>, and by combining it with <code>object-fit</code> and flexbox, we can create a smol responsive gallery. Check out the CSS via your browser Inspector to modify the CSS custom properties on <code>.smol-aspect-ratio-gallery</code> and see how they affect this layout.</p>
<p>The demo initially sets a height as a fallback for browsers that do not yet support <code>aspect-ratio</code>, and then uses <code>@supports</code> to upgrade to use of <code>aspect-ratio</code>.</p>
<p>Note that <code>aspect-ratio</code> isn't just for images, but any element!</p>
<blockquote>
<p>This solution also uses the <a href="https://smolcss.dev/feed/#smol-flexbox-grid">Smol Responsive Flexbox Grid</a>.</p>
</blockquote>
<style>
.smol-aspect-ratio-gallery {
--min: 15rem;
--aspect-ratio: 4/3;
--gap: 0;
}
.smol-aspect-ratio-gallery li {
height: max(25vh, 15rem);
}
@supports (aspect-ratio: 1) {
.smol-aspect-ratio-gallery li {
aspect-ratio: var(--aspect-ratio);
height: auto;
}
}
.smol-aspect-ratio-gallery img {
display: block;
object-fit: cover;
width: 100%;
height: 100%;
}
</style>
<details>
<summary>CSS for "Smol Aspect Ratio Gallery"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-aspect-ratio-gallery</span> <span class="token punctuation">{</span>
<span class="token property">--min</span><span class="token punctuation">:</span> 15rem<span class="token punctuation">;</span>
<span class="token property">--aspect-ratio</span><span class="token punctuation">:</span> 4/3<span class="token punctuation">;</span>
<span class="token property">--gap</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-aspect-ratio-gallery li</span> <span class="token punctuation">{</span>
<span class="token property">height</span><span class="token punctuation">:</span> <span class="token function">max</span><span class="token punctuation">(</span>25vh<span class="token punctuation">,</span> 15rem<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token atrule"><span class="token rule">@supports</span> <span class="token punctuation">(</span><span class="token property">aspect-ratio</span><span class="token punctuation">:</span> 1<span class="token punctuation">)</span></span> <span class="token punctuation">{</span>
<span class="token selector">.smol-aspect-ratio-gallery li</span> <span class="token punctuation">{</span>
<span class="token property">aspect-ratio</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--aspect-ratio<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token property">height</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-aspect-ratio-gallery img</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span>
<span class="token property">object-fit</span><span class="token punctuation">:</span> cover<span class="token punctuation">;</span>
<span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token property">height</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<ul data-component="" class="smol-aspect-ratio-gallery smol-flexbox-grid">
<li>
<img src="https://images.unsplash.com/photo-1596401463492-1ca39cdf7575?ixlib=rb-1.2.1&q=45&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=350" alt="" />
</li>
<li>
<img src="https://images.unsplash.com/photo-1591756985756-6e231184528b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=350&q=45" alt="" />
</li>
<li>
<img src="https://images.unsplash.com/photo-1556195947-316050222289?ixlib=rb-1.2.1&q=45&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=350" alt="" />
</li>
<li>
<img src="https://images.unsplash.com/photo-1597264121870-2f1b4d43d2f6?ixlib=rb-1.2.1&q=65&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=350" alt="" />
</li>
<li>
<img src="https://images.unsplash.com/photo-1465566829994-b8da8cae5909?ixlib=rb-1.2.1&q=65&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ&w=400" alt="" />
</li>
</ul>
</div><footer>
<p>For an alternate method to <code>aspect-ratio</code> on this solution, check out my <a href="https://egghead.io/lessons/flexbox-create-an-automatically-responsive-flexbox-gallery?af=2s65ms">flexbox gallery egghead lesson</a>. You may also enjoy my <a href="https://egghead.io/lessons/css-apply-aspect-ratio-sizing-to-images-with-css-object-fit?af=2s65ms">egghead lesson on <code>object-fit</code></a>.</p>
</footer>
2021-02-11T00:00:00Z
https://smolcss.dev/#smol-responsive-sidebar
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Responsive Sidebar Layout","description":"Generated from: https://SmolCSS.dev/#smol-responsive-sidebar","tags":["grid","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Responsive Sidebar Layout\nGenerated from: https://SmolCSS.dev/#smol-responsive-sidebar -->\n<div class=\"smol-sidebar\">\n <span data-text>\n Some sidebar content goes here\n </span>\n <span>Main content</span>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-sidebar {\n display: grid;\n grid-template-columns: fit-content(20ch) minmax(min(50vw, 30ch), 1fr);\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Responsive Sidebar Layout" aria-label="Open Smol Responsive Sidebar Layout in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Several layers of delicious modern CSS goodness here! First, we're using <code>fit-content</code> to handle the sidebar sizing. This allows the sidebar to grow <em>up to</em> the defined value, but only if it <em>needs to</em>, else it will use/shrink to the equivalent of <code>min-content</code>.</p>
<p>Next, we use <code>minmax</code> for the main content. Why? Because if we only use <code>1fr</code> then eventually our sidebar and main will share 50% of the space, and we want the main area to always be wider. We also nest <code>min</code> to ask the browser to use the minimum of <em>either</em> of the options. The result in this case is use of <code>50vw</code> on mobile-sized viewports, and <code>30ch</code> on larger viewports. And, when there's room, it also stretches to <code>1fr</code> for the <em>max</em> part of <code>minmax</code> 🙌🏽</p>
<style>
.smol-sidebar {
display: grid;
grid-template-columns: fit-content(20ch) minmax(min(50vw, 30ch), 1fr);
}
</style>
<details>
<summary>CSS for "Smol Responsive Sidebar Layout"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-sidebar</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">grid-template-columns</span><span class="token punctuation">:</span> <span class="token function">fit-content</span><span class="token punctuation">(</span>20ch<span class="token punctuation">)</span> <span class="token function">minmax</span><span class="token punctuation">(</span><span class="token function">min</span><span class="token punctuation">(</span>50vw<span class="token punctuation">,</span> 30ch<span class="token punctuation">)</span><span class="token punctuation">,</span> 1fr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<div class="smol-sidebar">
<span data-text="">
Some sidebar content goes here
</span>
<span>Main content</span>
</div>
</div>
2021-02-11T00:00:00Z
https://smolcss.dev/#smol-responsive-padding
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Responsive Padding","description":"Generated from: https://SmolCSS.dev/#smol-responsive-padding","tags":["layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Responsive Padding\nGenerated from: https://SmolCSS.dev/#smol-responsive-padding -->\n<div data-container-style class=\"smol-responsive-padding\">\n <p data-text data-unstyled>Gummi bears gummies cheesecake donut liquorice sweet roll lollipop chocolate cake macaroon. Dragée powder biscuit. Dessert topping jelly beans liquorice cake sesame snaps oat cake chocolate bar marshmallow. Cookie danish jelly-o pudding tart chocolate. Jelly sweet tiramisu fruitcake dessert muffin chocolate cake dragée. Donut dragée carrot cake icing. Macaroon lemon drops muffin.</p>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-responsive-padding {\n padding: 1.5rem clamp(1rem, 5%, 3rem);\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Responsive Padding" aria-label="Open Smol Responsive Padding in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>This smol demo is using <code>clamp()</code> for responsive padding. The order of <code>clamp()</code> values can be interpreted as: the minimum allowed value is <code>1rem</code>, the ideal value is <code>5%</code> (which will be relative to the element), and the max allowed value is <code>3rem</code>.</p>
<p>In other words, as the element is placed in different contexts and resized across viewports, that value will grow and shrink. But it will always compute to a value within the range of <code>1rem</code> to <code>3rem</code>.</p>
<p>Another suggested option for the middle ideal value is to use a viewport unit, like <code>4vw</code>, which works great for components such as models or setting padding on the <code>body</code>.</p>
<style>
.smol-responsive-padding {
padding: 1.5rem clamp(1rem, 5%, 3rem);
}
</style>
<details>
<summary>CSS for "Smol Responsive Padding"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-responsive-padding</span> <span class="token punctuation">{</span>
<span class="token property">padding</span><span class="token punctuation">:</span> 1.5rem <span class="token function">clamp</span><span class="token punctuation">(</span>1rem<span class="token punctuation">,</span> 5%<span class="token punctuation">,</span> 3rem<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<div data-container-style="" class="smol-responsive-padding">
<p data-text="" data-unstyled="">Gummi bears gummies cheesecake donut liquorice sweet roll lollipop chocolate cake macaroon. Dragée powder biscuit. Dessert topping jelly beans liquorice cake sesame snaps oat cake chocolate bar marshmallow. Cookie danish jelly-o pudding tart chocolate. Jelly sweet tiramisu fruitcake dessert muffin chocolate cake dragée. Donut dragée carrot cake icing. Macaroon lemon drops muffin.</p>
</div>
</div><footer>
<p>Explore <a href="https://moderncss.dev/contextual-spacing-for-intrinsic-web-design/">more techniques for contextual, intrinsic spacing</a> on ModernCSS.dev.</p>
</footer>
2021-02-10T00:00:00Z
https://smolcss.dev/#smol-grid-centering
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Modern Centering","description":"Generated from: https://SmolCSS.dev/#smol-grid-centering","tags":["grid","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Modern Centering\nGenerated from: https://SmolCSS.dev/#smol-grid-centering -->\n<div class=\"smol-centering\">\n <span>Feeling Centered</span>\n</div>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-centering {\n display: grid;\n place-content: center;\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Modern Centering" aria-label="Open Smol Modern Centering in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p><strong>Put down the CSS centering jokes</strong>! This modern update is often the solution you're looking for to solve your centering woes.</p>
<style>
.smol-centering {
display: grid;
place-content: center;
}
</style>
<details>
<summary>CSS for "Smol Modern Centering"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-centering</span> <span class="token punctuation">{</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">place-content</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<div class="smol-centering">
<span>Feeling Centered</span>
</div>
</div><footer>
<p>Just in case you're not convinced, <a href="https://moderncss.dev/complete-guide-to-centering-in-css/">see more centering solutions</a> on ModernCSS.dev</p>
</footer>
2021-02-10T00:00:00Z
https://smolcss.dev/#smol-flexbox-grid
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Responsive Flexbox Grid","description":"Generated from: https://SmolCSS.dev/#smol-flexbox-grid","tags":["flexbox","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Responsive Flexbox Grid\nGenerated from: https://SmolCSS.dev/#smol-flexbox-grid -->\n<ul class=\"smol-flexbox-grid\">\n <li>Item 1</li>\n <li>Item 2</li>\n <li>Item 3</li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-flexbox-grid {\n --min: 10ch;\n --gap: 1rem;\n\n display: flex;\n flex-wrap: wrap;\n gap: var(--gap);\n}\n\n.smol-flexbox-grid > * {\n flex: 1 1 var(--min);\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Responsive Flexbox Grid" aria-label="Open Smol Responsive Flexbox Grid in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Create an intrinsically responsive grid layout, optionally using a CSS custom property to extend to variable contexts. Each column will resize at the same rate <em>until</em> reaching the <code>--min</code> width. At that point, the last item will break to a new row and fill any available space.</p>
<style>
.smol-flexbox-grid {
--min: 10ch;
--gap: 1rem;
display: flex;
flex-wrap: wrap;
gap: var(--gap);
}
.smol-flexbox-grid > * {
flex: 1 1 var(--min);
}
</style>
<details>
<summary>CSS for "Smol Responsive Flexbox Grid"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-flexbox-grid</span> <span class="token punctuation">{</span>
<span class="token property">--min</span><span class="token punctuation">:</span> 10ch<span class="token punctuation">;</span>
<span class="token property">--gap</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>
<span class="token property">flex-wrap</span><span class="token punctuation">:</span> wrap<span class="token punctuation">;</span>
<span class="token property">gap</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--gap<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token selector">.smol-flexbox-grid > *</span> <span class="token punctuation">{</span>
<span class="token property">flex</span><span class="token punctuation">:</span> 1 1 <span class="token function">var</span><span class="token punctuation">(</span>--min<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<ul class="smol-flexbox-grid">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div><footer>
<p>Learn more about <a href="https://moderncss.dev/solutions-to-replace-the-12-column-grid/">creating a responsive flexbox grid solution</a> on ModernCSS.dev</p>
</footer>
2021-02-10T00:00:00Z
https://smolcss.dev/#smol-css-grid
<form action="https://codepen.io/pen/define" method="POST" target="_blank">
<input type="hidden" name="data" value='{"title":"SmolCSS - Smol Responsive CSS Grid","description":"Generated from: https://SmolCSS.dev/#smol-css-grid","tags":["grid","layout","smolcss"],"editors":"110","layout":"left","html":"<!-- SmolCSS - Smol Responsive CSS Grid\nGenerated from: https://SmolCSS.dev/#smol-css-grid -->\n<ul class=\"smol-css-grid\">\n <li>Item 1</li>\n <li>Item 2</li>\n <li>Item 3</li>\n</ul>\n","html_pre_processor":"none","css":"\n/* Box sizing rules */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Remove default margin */\nbody,\nh1,\nh2,\nh3,\nh4,\np {\n margin: 0;\n}\n\n/* Set core body defaults */\nbody {\n min-height: 100vh;\n text-rendering: optimizeSpeed;\n line-height: 1.65;\n padding: 2rem;\n background-color: #f5f2f7;\n color: #29344B;\n font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica neue, helvetica, Ubuntu, roboto, noto, segoe ui, arial, sans-serif;\n}\n\n/***\n 🟣 SmolCSS Snippet Styles\n */\n\n.smol-css-grid {\n --min: 15ch;\n --gap: 1rem;\n\n display: grid;\n grid-gap: var(--gap);\n /* min() with 100% prevents overflow\n in extra narrow spaces */\n grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--min)), 1fr));\n}\n\n\n\n/* Additional demo styles from SmolCSS.dev\n Not all styles may be needed for this pen */\nbody > ul {\n list-style: none;\n margin: 0;\n\n &:not([data-padding-unset]) {\n padding: 0;\n }\n}\n\n[class*=\"smol\"]:not([data-component]) > *:not([data-unstyled]) {\n display: grid;\n padding: 1rem;\n background-color: #E0D4F6;\n color: #675883;\n font-size: clamp(1.5rem, 4vw, 2rem);\n font-weight: bold;\n text-align: center;\n border-radius: 0.15em;\n border: 1px dashed;\n\n &:not([data-text]) {\n place-content: center;\n }\n\n &[data-text] {\n font-size: 1.15rem;\n text-align: left;\n }\n}\n\n[data-container-style] {\n outline: 2px dotted #29344B;\n}","css_pre_processor":"scss","css_starter":"neither","css_prefix":"autoprefixer","head":"<meta name='viewport' content='width=device-width, initial-scale=1'>"}' />
<button type="submit" data-name="Smol Responsive CSS Grid" aria-label="Open Smol Responsive CSS Grid in CodePen"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
<path d="M32 10.909l-0.024-0.116-0.023-0.067c-0.013-0.032-0.024-0.067-0.040-0.1-0.004-0.024-0.020-0.045-0.027-0.067l-0.047-0.089-0.040-0.067-0.059-0.080-0.061-0.060-0.080-0.060-0.061-0.040-0.080-0.059-0.059-0.053-0.020-0.027-14.607-9.772c-0.463-0.309-1.061-0.309-1.523 0l-14.805 9.883-0.051 0.053-0.067 0.075-0.049 0.060-0.067 0.080c-0.027 0.023-0.040 0.040-0.040 0.061l-0.067 0.080-0.027 0.080c-0.027 0.013-0.027 0.053-0.040 0.093l-0.013 0.067c-0.025 0.041-0.025 0.081-0.025 0.121v9.996c0 0.059 0.004 0.12 0.013 0.18l0.013 0.061c0.007 0.040 0.013 0.080 0.027 0.115l0.020 0.067c0.013 0.036 0.021 0.071 0.036 0.1l0.029 0.067c0 0.013 0.020 0.053 0.040 0.080l0.040 0.053c0.020 0.013 0.040 0.053 0.060 0.080l0.040 0.053 0.053 0.053c0.013 0.017 0.013 0.040 0.040 0.040l0.080 0.056 0.053 0.040 0.013 0.019 14.627 9.773c0.219 0.16 0.5 0.217 0.76 0.217s0.52-0.080 0.76-0.24l14.877-9.875 0.069-0.077 0.044-0.060 0.053-0.080 0.040-0.067 0.040-0.093 0.021-0.069 0.040-0.103 0.020-0.060 0.040-0.107v-10c0-0.067 0-0.127-0.021-0.187l-0.019-0.060 0.059 0.004zM16.013 19.283l-4.867-3.253 4.867-3.256 4.867 3.253-4.867 3.253zM14.635 10.384l-5.964 3.987-4.817-3.221 10.781-7.187v6.424zM6.195 16.028l-3.443 2.307v-4.601l3.443 2.301zM8.671 17.695l5.964 3.987v6.427l-10.781-7.188 4.824-3.223v-0.005zM17.387 21.681l5.965-3.973 4.817 3.227-10.783 7.187v-6.427zM25.827 16.041l3.444-2.293v4.608l-3.444-2.307zM23.353 14.388l-5.964-3.988v-6.44l10.78 7.187-4.816 3.224z"></path>
</svg> Open in CodePen</button>
</form>
<p>Create an intrinsically responsive grid layout, optionally using a CSS custom property to extend to variable contexts. Each column will resize at the same rate, and items will begin to break to a new row if the width reaches the <code>--min</code> value.</p>
<style>
.smol-css-grid {
--min: 15ch;
--gap: 1rem;
display: grid;
grid-gap: var(--gap);
/* min() with 100% prevents overflow
in extra narrow spaces */
grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--min)), 1fr));
}
</style>
<details>
<summary>CSS for "Smol Responsive CSS Grid"</summary>
<pre class="language-css"><code class="language-css"><span class="token selector">.smol-css-grid</span> <span class="token punctuation">{</span>
<span class="token property">--min</span><span class="token punctuation">:</span> 15ch<span class="token punctuation">;</span>
<span class="token property">--gap</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>
<span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
<span class="token property">grid-gap</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--gap<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* min() with 100% prevents overflow
in extra narrow spaces */</span>
<span class="token property">grid-template-columns</span><span class="token punctuation">:</span> <span class="token function">repeat</span><span class="token punctuation">(</span>auto-fit<span class="token punctuation">,</span> <span class="token function">minmax</span><span class="token punctuation">(</span><span class="token function">min</span><span class="token punctuation">(</span>100%<span class="token punctuation">,</span> <span class="token function">var</span><span class="token punctuation">(</span>--min<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> 1fr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
</details><div data-layout="" class="demo ">
<ul class="smol-css-grid">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div><footer>
<p>Learn more about <a href="https://moderncss.dev/solutions-to-replace-the-12-column-grid/">creating a responsive CSS grid solution</a> on ModernCSS.dev</p>
</footer>