<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Socle</title><link>https://socle.uncinq.dev/</link><description>Recent content on Socle</description><generator>Hugo</generator><language>en</language><atom:link href="https://socle.uncinq.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Cascade layers</title><link>https://socle.uncinq.dev/docs/css-base/cascade-layers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-base/cascade-layers/</guid><description>&lt;p&gt;css-base scopes every rule it ships to one of three cascade layers it owns.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Layer&lt;/th&gt;
 &lt;th&gt;Contents&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@layer reset&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The CSS reset, the foundational baseline&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@layer base&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Native element styles&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@layer layouts&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Layout primitives&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Custom media queries in &lt;code&gt;css/mediaqueries.css&lt;/code&gt; are the exception: &lt;code&gt;@custom-media&lt;/code&gt; is resolved at build time, so it is never subject to the cascade and sits outside any layer.&lt;/p&gt;
&lt;h2 id="declare-the-order-in-your-project"&gt;Declare the order in your project&lt;/h2&gt;
&lt;p&gt;The full layer order, including layers owned by sibling packages (&lt;code&gt;tokens&lt;/code&gt;, &lt;code&gt;components&lt;/code&gt;) and by the project itself (&lt;code&gt;libs&lt;/code&gt;, &lt;code&gt;vendors&lt;/code&gt;, &lt;code&gt;pages&lt;/code&gt;, &lt;code&gt;utilities&lt;/code&gt;), belongs to the &lt;strong&gt;consuming project&lt;/strong&gt;. css-base deliberately does not declare it.&lt;/p&gt;</description></item><item><title>Cascade layers</title><link>https://socle.uncinq.dev/docs/css-components/cascade-layers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/cascade-layers/</guid><description>&lt;p&gt;This package writes to two layers.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Layer&lt;/th&gt;
 &lt;th&gt;Contents&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@layer components&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;All 29 components&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@layer utilities&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.scrollsnap&lt;/code&gt;, the only utility&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The full order, including layers owned by the sibling packages and by the project itself, is the &lt;strong&gt;consuming project&amp;rsquo;s&lt;/strong&gt; responsibility. Declare it once, at the very top of your entry stylesheet, before any &lt;code&gt;@import&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;layer&lt;/span&gt; &lt;span style="color:#f92672"&gt;reset&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;tokens&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;libs&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;vendors&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;base&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;layouts&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;components&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;pages&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;utilities&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CSS fixes a layer&amp;rsquo;s position the first time its name is seen, and later re-declarations do not reorder it. If that line comes after an import, it is already too late. See &lt;a href="../../css-base/cascade-layers/"&gt;the css-base page&lt;/a&gt; for the full explanation, including why &lt;code&gt;libs&lt;/code&gt; and &lt;code&gt;vendors&lt;/code&gt; are a pair.&lt;/p&gt;</description></item><item><title>Naming</title><link>https://socle.uncinq.dev/docs/component-tokens/naming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/component-tokens/naming/</guid><description>&lt;p&gt;Every component token follows one pattern:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;--{component}-{property}-{sub-property?}-{state?}
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Pattern&lt;/th&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{component}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--btn&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{component}-{property}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--btn-padding-inline&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{component}-{property}-{sub-property}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--btn-color-text-decoration&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{component}-{property}-{state}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--btn-color-background-hover&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The property mirrors the CSS property name, so a token reads the same way as the declaration it controls. &lt;code&gt;--btn-padding-inline&lt;/code&gt; drives &lt;code&gt;padding-inline&lt;/code&gt;. Colors are the one exception, explained below.&lt;/p&gt;
&lt;h2 id="rules"&gt;Rules&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lowercase kebab-case&lt;/strong&gt;, always.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Component name first&lt;/strong&gt;: &lt;code&gt;--btn-*&lt;/code&gt;, &lt;code&gt;--badge-*&lt;/code&gt;, &lt;code&gt;--hero-*&lt;/code&gt;. This is what makes the tokens greppable and what keeps them sorted together in the generated CSS.&lt;/p&gt;</description></item><item><title>Naming</title><link>https://socle.uncinq.dev/docs/design-tokens/naming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/naming/</guid><description>&lt;p&gt;A token name is an API. Once a project references &lt;code&gt;--color-text-muted&lt;/code&gt;, renaming it is a breaking change, so the grammar below is worth following closely.&lt;/p&gt;
&lt;h2 id="semantic-tokens"&gt;Semantic tokens&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;--{category}-{subcategory?}-{variant?}-{state?}
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Pattern&lt;/th&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{category}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--color&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{category}-{subcategory}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--color-text&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{category}-{subcategory}-{variant}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--color-text-muted&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--{category}-{subcategory}-{state}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;--color-text-disabled&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="component-tokens"&gt;Component tokens&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;--{component}-{property}-{sub-property?}-{state?}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The property mirrors the CSS property name, so the token reads the same way as the declaration it controls. Colors are the exception: &lt;code&gt;color&lt;/code&gt; leads and the role follows, for the reason given in the rules below.&lt;/p&gt;</description></item><item><title>Buttons</title><link>https://socle.uncinq.dev/docs/css-components/buttons/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/buttons/</guid><description>&lt;h2 id="btn"&gt;&lt;code&gt;.btn&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The base class. Works on &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;&lt;/code&gt;, and reads &lt;code&gt;--btn-*&lt;/code&gt; from &lt;a href="../../component-tokens/reference/"&gt;@uncinq/component-tokens&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;btn&amp;#34;&lt;/span&gt;&amp;gt;Send&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;btn btn-secondary&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/contact&amp;#34;&lt;/span&gt;&amp;gt;Contact&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="colour-variants"&gt;Colour variants&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Class&lt;/th&gt;
 &lt;th&gt;Intent&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-primary&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Primary action&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-secondary&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Secondary action&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-brand&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Brand-coloured&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-neutral&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Neutral emphasis&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-dark&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dark surface&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-light&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Light surface&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-success&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Confirmation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-danger&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Destructive action&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-warning&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Warning&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.btn-info&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Informational&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each variant sets &lt;code&gt;--btn-color-background&lt;/code&gt;, &lt;code&gt;--btn-color-border&lt;/code&gt; and &lt;code&gt;--btn-color-text&lt;/code&gt; together. The text colour always comes from the matching &lt;code&gt;--color-text-on-*&lt;/code&gt; semantic token, so contrast is preserved when the underlying colour is overridden. That pairing is the reason to change &lt;code&gt;--color-brand&lt;/code&gt; rather than &lt;code&gt;--btn-color-background&lt;/code&gt; when rebranding.&lt;/p&gt;</description></item><item><title>Colors</title><link>https://socle.uncinq.dev/docs/design-tokens/colors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/colors/</guid><description>&lt;h2 id="color-space-oklch"&gt;Color space, OKLCH&lt;/h2&gt;
&lt;p&gt;Every primitive color is defined in OKLCH.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Channel&lt;/th&gt;
 &lt;th&gt;Range&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;L&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;0 to 1&lt;/td&gt;
 &lt;td&gt;Perceptual lightness, 0 is black and 1 is white&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;C&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;0 to about 0.4&lt;/td&gt;
 &lt;td&gt;Chroma, or colorfulness, where 0 is gray&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;H&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;0 to 360 degrees&lt;/td&gt;
 &lt;td&gt;Hue angle&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Why OKLCH rather than hex or HSL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perceptually uniform.&lt;/strong&gt; Equal steps in &lt;code&gt;L&lt;/code&gt; produce equal perceived brightness differences, whatever the hue. HSL does not guarantee this: &lt;code&gt;hsl(60, 100%, 50%)&lt;/code&gt; yellow looks far brighter than &lt;code&gt;hsl(240, 100%, 50%)&lt;/code&gt; blue at the same stated lightness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable contrast.&lt;/strong&gt; You can reason about WCAG contrast by comparing &lt;code&gt;L&lt;/code&gt; values, without converting to relative luminance first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better interpolation.&lt;/strong&gt; Gradients and animations between two OKLCH colors do not pass through muddy grays.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Composable.&lt;/strong&gt; The relative color syntax, &lt;code&gt;oklch(from var(--color-text) l c h / 0.6)&lt;/code&gt;, lets a token derive from another without duplicating its value. Several semantic tokens in this package rely on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Browser support is Chrome 111, Firefox 113 and Safari 15.4 and above. No sRGB fallback is generated, so every value ships as &lt;code&gt;oklch()&lt;/code&gt; and anything older needs a fallback of its own.&lt;/p&gt;</description></item><item><title>Customizing</title><link>https://socle.uncinq.dev/docs/component-tokens/customizing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/component-tokens/customizing/</guid><description>&lt;h2 id="css-override"&gt;CSS override&lt;/h2&gt;
&lt;p&gt;Every token is declared in &lt;code&gt;@layer tokens&lt;/code&gt;, the lowest-priority layer in the recommended order. Re-declare any of them in your own &lt;code&gt;@layer tokens&lt;/code&gt; block after the import. Same layer, later source order wins, and no specificity escalation is needed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@uncinq/design-tokens&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@uncinq/component-tokens&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;layer&lt;/span&gt; &lt;span style="color:#f92672"&gt;tokens&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --btn-color-background: &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;light);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --btn-border-radius: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --hero-height: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;svh;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="choosing-the-right-layer-to-override"&gt;Choosing the right layer to override&lt;/h2&gt;
&lt;p&gt;This is the decision that matters, and it is easy to get wrong in a way that only shows up later.&lt;/p&gt;</description></item><item><title>Reset</title><link>https://socle.uncinq.dev/docs/css-base/reset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-base/reset/</guid><description>&lt;p&gt;&lt;code&gt;css/reset.css&lt;/code&gt; is a single file scoped to &lt;code&gt;@layer reset&lt;/code&gt;. It is based on the &lt;a href="https://www.joshwcomeau.com/css/custom-css-reset/"&gt;Josh W Comeau custom CSS reset&lt;/a&gt;, with a few additions by Un Cinq.&lt;/p&gt;
&lt;p&gt;Being the first layer in the recommended order, everything here is the weakest thing in the stylesheet. Any base, layout or component rule overrides it without needing extra specificity.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What it does&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Rule&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;box-sizing: border-box&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Applied to every element and pseudo-element&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;margin: 0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Removed from everything except &lt;code&gt;dialog&lt;/code&gt;, whose centering depends on its own margin&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;interpolate-size: allow-keywords&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Enables animating to and from &lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;min-content&lt;/code&gt; and friends. Applied only under &lt;code&gt;prefers-reduced-motion: no-preference&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Text rendering on &lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;-webkit-font-smoothing: antialiased&lt;/code&gt;, &lt;code&gt;-moz-osx-font-smoothing: grayscale&lt;/code&gt;, &lt;code&gt;text-rendering: optimizelegibility&lt;/code&gt;, &lt;code&gt;font-variant-ligatures: common-ligatures&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Media defaults&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;display: block&lt;/code&gt; and &lt;code&gt;max-width: 100%&lt;/code&gt; on &lt;code&gt;img&lt;/code&gt;, &lt;code&gt;picture&lt;/code&gt;, &lt;code&gt;video&lt;/code&gt;, &lt;code&gt;canvas&lt;/code&gt;, &lt;code&gt;svg&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Form control fonts&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;font: inherit&lt;/code&gt; on &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;button&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Overflow&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;overflow-wrap: break-word&lt;/code&gt; on &lt;code&gt;p&lt;/code&gt; and &lt;code&gt;h1&lt;/code&gt; to &lt;code&gt;h6&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Line wrapping&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;text-wrap: pretty&lt;/code&gt; on &lt;code&gt;p&lt;/code&gt;, &lt;code&gt;text-wrap: balance&lt;/code&gt; on &lt;code&gt;h1&lt;/code&gt; to &lt;code&gt;h6&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="deviations-from-the-original-reset"&gt;Deviations from the original reset&lt;/h2&gt;
&lt;p&gt;Two rules from the upstream reset are present but commented out, on purpose.&lt;/p&gt;</description></item><item><title>Base</title><link>https://socle.uncinq.dev/docs/css-base/base/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-base/base/</guid><description>&lt;p&gt;&lt;code&gt;@layer base&lt;/code&gt; styles native HTML elements so that unstyled markup already looks right. There is no class to apply: write &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;blockquote&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;input type=&amp;quot;date&amp;quot;&amp;gt;&lt;/code&gt; and they are styled.&lt;/p&gt;
&lt;p&gt;Every value comes from a custom property resolved by &lt;a href="https://github.com/uncinq/design-tokens"&gt;@uncinq/design-tokens&lt;/a&gt; and &lt;a href="https://github.com/uncinq/component-tokens"&gt;@uncinq/component-tokens&lt;/a&gt;. This package hardcodes almost nothing, so restyling is a matter of changing a token, not overriding a rule.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;css/base.css&lt;/code&gt; imports all 23 files below.&lt;/p&gt;
&lt;h2 id="typography-and-text"&gt;Typography and text&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Selectors&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/body.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;body&lt;/code&gt;: background, text color, font family, size, weight, line-height&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/headings.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;h1&lt;/code&gt; to &lt;code&gt;h6&lt;/code&gt;: color, font family, weight, letter-spacing, line-height, margin, plus a per-level size from &lt;code&gt;--font-size-heading-01&lt;/code&gt; to &lt;code&gt;-06&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/typography.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p&lt;/code&gt;: block spacing and &lt;code&gt;--max-width-paragraph&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/link.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a&lt;/code&gt;: color, underline offset, thickness and color, hover transition, focus-visible outline&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/blockquote.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;blockquote&lt;/code&gt;, &lt;code&gt;blockquote cite&lt;/code&gt;: inline-start border, italic, muted cite block&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/list.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ul&lt;/code&gt;, &lt;code&gt;ol&lt;/code&gt;, &lt;code&gt;li&lt;/code&gt; in prose context, including nested list indentation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/code.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;code&lt;/code&gt;, &lt;code&gt;kbd&lt;/code&gt;, &lt;code&gt;samp&lt;/code&gt;, &lt;code&gt;pre&lt;/code&gt;, and inline &lt;code&gt;code&lt;/code&gt; outside &lt;code&gt;pre&lt;/code&gt; styled separately from block code&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/address.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;address&lt;/code&gt;: removes the UA italic and resets inner paragraph spacing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/abbr.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;abbr[title]&lt;/code&gt;: dotted underline with its own offset and thickness&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/sup.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sup&lt;/code&gt;: raised without growing the line box, see the note below&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="media-and-embedded-content"&gt;Media and embedded content&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Selectors&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/figure.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;figure&lt;/code&gt;, &lt;code&gt;figcaption&lt;/code&gt;, and nested &lt;code&gt;picture&lt;/code&gt;, &lt;code&gt;img&lt;/code&gt;, &lt;code&gt;.credit&lt;/code&gt;. Flex column layout with responsive caption direction&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/picture.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;picture&lt;/code&gt;: &lt;code&gt;inline-block&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/video.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;video&lt;/code&gt;: fluid width, auto height&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/table.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;table&lt;/code&gt;, &lt;code&gt;thead&lt;/code&gt;, &lt;code&gt;tbody&lt;/code&gt;, &lt;code&gt;th&lt;/code&gt;, &lt;code&gt;td&lt;/code&gt;: collapsed borders, cell padding, header weight, no border on the last row&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base/details.css&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;details&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt;, &lt;code&gt;details[open]&lt;/code&gt;, the &lt;code&gt;summary::after&lt;/code&gt; marker and the disclosed panel&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="forms"&gt;Forms&lt;/h2&gt;
&lt;p&gt;Six of these seven files are largely inspired by &lt;a href="https://knacss.com/"&gt;KNACSS&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Dark mode</title><link>https://socle.uncinq.dev/docs/design-tokens/dark-mode/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/dark-mode/</guid><description>&lt;p&gt;The dark theme is an &lt;strong&gt;overlay&lt;/strong&gt;, not a second palette. &lt;code&gt;tokens/themes/dark.json&lt;/code&gt; re-declares 13 semantic tokens and nothing else. Every other token, including the whole primitive palette, is shared.&lt;/p&gt;
&lt;p&gt;That is the point of the semantic layer: if a component reads &lt;code&gt;--color-background&lt;/code&gt; rather than &lt;code&gt;--color-white&lt;/code&gt;, it needs no dark-mode branch of its own.&lt;/p&gt;
&lt;h2 id="what-it-overrides"&gt;What it overrides&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Token&lt;/th&gt;
 &lt;th&gt;Light&lt;/th&gt;
 &lt;th&gt;Dark&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-background&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;white&lt;/td&gt;
 &lt;td&gt;gray-950&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-background-disabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-100&lt;/td&gt;
 &lt;td&gt;gray-900&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-background-media&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-200&lt;/td&gt;
 &lt;td&gt;gray-800&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-background-muted&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-100&lt;/td&gt;
 &lt;td&gt;gray-900&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-background-muted-hover&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-200&lt;/td&gt;
 &lt;td&gt;gray-800&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-border&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-200&lt;/td&gt;
 &lt;td&gt;gray-800&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-heading&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;black&lt;/td&gt;
 &lt;td&gt;white&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-shadow&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;black&lt;/td&gt;
 &lt;td&gt;white&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-text&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-900&lt;/td&gt;
 &lt;td&gt;gray-200&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-text-disabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-300&lt;/td&gt;
 &lt;td&gt;gray-600&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-text-hover&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-700&lt;/td&gt;
 &lt;td&gt;gray-300&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--color-text-muted&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;derived from &lt;code&gt;--color-text&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gray-400&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--form-color-background&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;white&lt;/td&gt;
 &lt;td&gt;gray-900&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two of these do more work than they look. &lt;code&gt;--color-shadow&lt;/code&gt; flipping to white inverts the entire shadow system in one line, because &lt;code&gt;--color-shadow-light&lt;/code&gt;, &lt;code&gt;-medium&lt;/code&gt; and &lt;code&gt;-strong&lt;/code&gt; all derive from it with relative color syntax. And &lt;code&gt;--color-background-surface&lt;/code&gt; is not in the list at all, because it aliases &lt;code&gt;--color-background&lt;/code&gt; and follows for free.&lt;/p&gt;</description></item><item><title>Overlays</title><link>https://socle.uncinq.dev/docs/css-components/overlays/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/overlays/</guid><description>&lt;h2 id="the-shared-panel-skeleton"&gt;The shared panel skeleton&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.modal&lt;/code&gt; and &lt;code&gt;.drawer&lt;/code&gt; are the same panel. Same structure (header, content, footer), same open and closed contract, same backdrop. They differ only in where they sit: modal centres them, drawer sticks them to an edge.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;components/panel.css&lt;/code&gt; owns every rule. The two variants are &lt;strong&gt;pure configuration&lt;/strong&gt;: &lt;code&gt;modal.css&lt;/code&gt; and &lt;code&gt;drawer.css&lt;/code&gt; declare nothing but &lt;code&gt;--panel-*&lt;/code&gt; tokens.&lt;/p&gt;
&lt;p&gt;There is &lt;strong&gt;no &lt;code&gt;.panel&lt;/code&gt; class to apply.&lt;/strong&gt; The file targets &lt;code&gt;:where(.modal, .drawer)&lt;/code&gt; directly, so the skeleton arrives with either variant class. &lt;code&gt;panel&lt;/code&gt; names the shared concept and the token namespace, not a class.&lt;/p&gt;</description></item><item><title>Reference</title><link>https://socle.uncinq.dev/docs/component-tokens/reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/component-tokens/reference/</guid><description>&lt;p&gt;Every table below is generated at build time from &lt;code&gt;dist/tokens.json&lt;/code&gt;, which Style Dictionary produces from the same JSON sources as the CSS. Nothing here is written by hand, so a token cannot appear in the reference without existing in the package, or change value without the page changing with it.&lt;/p&gt;
&lt;p&gt;Values are shown as they ship. A token that references a semantic token shows &lt;code&gt;var(--the-semantic-token)&lt;/code&gt; rather than a resolved color or length, because that reference is what makes an override of the semantic layer propagate. See &lt;a href="../style-dictionary/"&gt;Style Dictionary&lt;/a&gt; for why the build keeps it that way.&lt;/p&gt;</description></item><item><title>Content</title><link>https://socle.uncinq.dev/docs/css-components/content/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/content/</guid><description>&lt;h2 id="alert"&gt;&lt;code&gt;.alert&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;An inline notification block.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;alert alert-info&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;alert-heading&amp;#34;&lt;/span&gt;&amp;gt;Heads up&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;Your changes were saved.&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Variants: &lt;code&gt;.alert-primary&lt;/code&gt;, &lt;code&gt;.alert-secondary&lt;/code&gt;, &lt;code&gt;.alert-brand&lt;/code&gt;, &lt;code&gt;.alert-neutral&lt;/code&gt;, &lt;code&gt;.alert-dark&lt;/code&gt;, &lt;code&gt;.alert-light&lt;/code&gt;, &lt;code&gt;.alert-success&lt;/code&gt;, &lt;code&gt;.alert-danger&lt;/code&gt;, &lt;code&gt;.alert-warning&lt;/code&gt;, &lt;code&gt;.alert-info&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Each sets the background, border and text colour from the matching &lt;code&gt;-muted&lt;/code&gt; and &lt;code&gt;-strong&lt;/code&gt; semantic tokens, so the pairing stays legible if the underlying colour changes.&lt;/p&gt;
&lt;p&gt;Two behaviours are worth knowing. &lt;code&gt;--color-link&lt;/code&gt; is reassigned to the alert&amp;rsquo;s own text colour, so links inside an alert do not fall back to the page link colour against a tinted background. And an alert whose first child is an &lt;code&gt;.icon&lt;/code&gt;, with no &lt;code&gt;.alert-heading&lt;/code&gt;, switches to a horizontal layout automatically.&lt;/p&gt;</description></item><item><title>Customizing</title><link>https://socle.uncinq.dev/docs/design-tokens/customizing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/customizing/</guid><description>&lt;p&gt;There are two ways to change what this package produces. Pick by how deep the change goes, not by preference.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Need&lt;/th&gt;
 &lt;th&gt;Approach&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Change the brand, the typography, a handful of tokens&lt;/td&gt;
 &lt;td&gt;CSS &lt;code&gt;@layer tokens&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Add a few project-specific tokens&lt;/td&gt;
 &lt;td&gt;CSS &lt;code&gt;@layer tokens&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Redefine the primitive palette entirely&lt;/td&gt;
 &lt;td&gt;JSON plus build&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Add many project tokens, or generate other formats&lt;/td&gt;
 &lt;td&gt;JSON plus build&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="1-css-override"&gt;1. CSS override&lt;/h2&gt;
&lt;p&gt;Every token lives in &lt;code&gt;@layer tokens&lt;/code&gt;, the lowest-priority layer in the recommended order. Any &lt;code&gt;@layer tokens&lt;/code&gt; block imported &lt;strong&gt;after&lt;/strong&gt; this package wins on source order, with no specificity tricks required.&lt;/p&gt;</description></item><item><title>DTCG format</title><link>https://socle.uncinq.dev/docs/component-tokens/dtcg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/component-tokens/dtcg/</guid><description>&lt;p&gt;The &lt;a href="https://www.w3.org/community/design-tokens/"&gt;W3C Design Token Community Group (DTCG)&lt;/a&gt; defines a standard interchange format for design tokens, so they can travel between tools (Figma, code, documentation) without loss of meaning.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@uncinq/design-tokens&lt;/code&gt; uses DTCG JSON as its source format. &lt;a href="https://styledictionary.com/"&gt;Style Dictionary v5&lt;/a&gt; transforms those JSON files into CSS custom properties — see &lt;a href="https://socle.uncinq.dev/docs/component-tokens/style-dictionary/"&gt;STYLE-DICTIONARY.md&lt;/a&gt; for the build pipeline. The DTCG spec informs the architecture (primitive → semantic → component, naming conventions, token types).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-dtcg-format"&gt;The DTCG format&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://tr.designtokens.org/format/"&gt;DTCG spec&lt;/a&gt; defines tokens as JSON objects with reserved &lt;code&gt;$&lt;/code&gt;-prefixed keys:&lt;/p&gt;</description></item><item><title>Layouts</title><link>https://socle.uncinq.dev/docs/css-base/layouts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-base/layouts/</guid><description>&lt;p&gt;&lt;code&gt;@layer layouts&lt;/code&gt; ships three primitives. They are deliberately few: everything else is a component&amp;rsquo;s job.&lt;/p&gt;
&lt;p&gt;All three read the responsive column count and gutter from tokens, so a project changes its grid by changing tokens rather than by rewriting layout rules.&lt;/p&gt;
&lt;h2 id="container"&gt;&lt;code&gt;.container&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;A centered wrapper with a responsive max-width and a gutter on both sides.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;...&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Property read&lt;/th&gt;
 &lt;th&gt;Role&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--container-max-width-*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Max-width per breakpoint rung&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--container-bleed-*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Bleed allowance per rung, the paired token&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--gutter&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Inline padding&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;It also &lt;strong&gt;publishes&lt;/strong&gt; one property of its own, &lt;code&gt;--container-bleed&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Media queries</title><link>https://socle.uncinq.dev/docs/css-base/mediaqueries/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-base/mediaqueries/</guid><description>&lt;p&gt;&lt;code&gt;css/mediaqueries.css&lt;/code&gt; declares the breakpoint scale as &lt;code&gt;@custom-media&lt;/code&gt; rules. It is imported first by &lt;code&gt;css/index.css&lt;/code&gt; and sits outside any cascade layer, because &lt;code&gt;@custom-media&lt;/code&gt; is resolved at build time and is never subject to the cascade.&lt;/p&gt;
&lt;h2 id="the-scale"&gt;The scale&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Custom media&lt;/th&gt;
 &lt;th&gt;Min width&lt;/th&gt;
 &lt;th&gt;Pixels at 16px root&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--sm&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;48rem&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;768&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--md&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;64rem&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1024&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--lg&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;90rem&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1440&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--xl&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;100rem&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1600&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;thing&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@media&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;(--md)&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These are rungs on a ladder, not devices. A width tells you nothing about the hardware: a 1024px window on a 27 inch monitor is not a tablet. Naming the steps after devices is also what left the previous scale with a compound name, &lt;code&gt;--tablet-wide&lt;/code&gt;, which belongs to no device at all.&lt;/p&gt;</description></item><item><title>Navigation</title><link>https://socle.uncinq.dev/docs/css-components/navigation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/navigation/</guid><description>&lt;h2 id="nav"&gt;&lt;code&gt;.nav&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The base navigation list, vertical by default.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;ul&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;nav&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&amp;gt;Home&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/about&amp;#34;&lt;/span&gt;&amp;gt;About&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Works on &lt;code&gt;ul&lt;/code&gt; or &lt;code&gt;ol&lt;/code&gt;. &lt;strong&gt;Direction is set by context, not by a modifier class&lt;/strong&gt;: a header lays its nav out horizontally by setting &lt;code&gt;flex-direction: row&lt;/code&gt; on it. That keeps the component free of layout variants that would only ever be used in one place.&lt;/p&gt;
&lt;h2 id="nav-title"&gt;&lt;code&gt;.nav-title&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;A title within a navigation block, for labelling a group of links.&lt;/p&gt;</description></item><item><title>Reference</title><link>https://socle.uncinq.dev/docs/design-tokens/reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/reference/</guid><description>&lt;p&gt;Every table below is generated at build time from &lt;code&gt;dist/tokens.json&lt;/code&gt;, which Style Dictionary produces from the same JSON sources as the CSS. Nothing here is written by hand, so a token cannot appear in the reference without existing in the package, or change value without the page changing with it.&lt;/p&gt;
&lt;p&gt;Values are shown as they are emitted. A semantic token that references a primitive shows &lt;code&gt;var(--the-primitive)&lt;/code&gt; rather than a flattened value, because that is literally what ships, and it is what makes an override of the primitive propagate.&lt;/p&gt;</description></item><item><title>Style Dictionary</title><link>https://socle.uncinq.dev/docs/component-tokens/style-dictionary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/component-tokens/style-dictionary/</guid><description>&lt;p&gt;&lt;a href="https://styledictionary.com/"&gt;Style Dictionary v5&lt;/a&gt; transforms the DTCG JSON token files into CSS custom properties.&lt;/p&gt;
&lt;h2 id="run-the-build"&gt;Run the build&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output is written to &lt;code&gt;dist/css/components/&lt;/code&gt;. One CSS file is generated per JSON source file.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tokens/components/button.json → dist/css/components/button.css
tokens/components/badge.json → dist/css/components/badge.css
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;dist/css/index.css&lt;/code&gt; is auto-generated too, in a step that runs after Style Dictionary. It discovers the token files from disk, so adding a JSON source needs no manual edit anywhere. Each generated file declares its own &lt;code&gt;@layer tokens&lt;/code&gt;, which is why a plain &lt;code&gt;@import&lt;/code&gt; is enough and no &lt;code&gt;layer()&lt;/code&gt; qualifier is used.&lt;/p&gt;</description></item><item><title>DTCG format</title><link>https://socle.uncinq.dev/docs/design-tokens/dtcg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/dtcg/</guid><description>&lt;p&gt;The &lt;a href="https://www.w3.org/community/design-tokens/"&gt;W3C Design Token Community Group (DTCG)&lt;/a&gt; defines a standard interchange format for design tokens, so they can travel between tools (Figma, code, documentation) without loss of meaning.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@uncinq/design-tokens&lt;/code&gt; uses DTCG JSON as its source format. &lt;a href="https://styledictionary.com/"&gt;Style Dictionary v5&lt;/a&gt; transforms those JSON files into CSS custom properties — see &lt;a href="https://socle.uncinq.dev/docs/design-tokens/style-dictionary/"&gt;STYLE-DICTIONARY.md&lt;/a&gt; for the build pipeline. The DTCG spec informs the architecture (primitive → semantic → component, naming conventions, token types).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-dtcg-format"&gt;The DTCG format&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://tr.designtokens.org/format/"&gt;DTCG spec&lt;/a&gt; defines tokens as JSON objects with reserved &lt;code&gt;$&lt;/code&gt;-prefixed keys:&lt;/p&gt;</description></item><item><title>Embeds</title><link>https://socle.uncinq.dev/docs/css-components/embeds/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/embeds/</guid><description>&lt;h2 id="embed"&gt;&lt;code&gt;.embed&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;A responsive container for third-party embeds, holding an aspect ratio so the page does not reflow once the iframe loads.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;embed&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://...&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Video title&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;allowfullscreen&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Accepts &lt;code&gt;iframe&lt;/code&gt;, &lt;code&gt;video&lt;/code&gt;, &lt;code&gt;embed&lt;/code&gt; or &lt;code&gt;object&lt;/code&gt; as its child. The ratio comes from &lt;code&gt;--embed-ratio&lt;/code&gt;, which defaults to the video ratio token. Override it per instance for a square or portrait embed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;embed&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;--embed-ratio: 1&amp;#34;&lt;/span&gt;&amp;gt;...&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Always give the &lt;code&gt;iframe&lt;/code&gt; a &lt;code&gt;title&lt;/code&gt;. It is the only accessible name an embedded frame has.&lt;/p&gt;</description></item><item><title>Forms</title><link>https://socle.uncinq.dev/docs/css-components/forms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/forms/</guid><description>&lt;p&gt;Form &lt;strong&gt;controls&lt;/strong&gt; are styled by &lt;a href="../../css-base/base/#forms"&gt;@uncinq/css-base&lt;/a&gt;, on the native elements themselves. There is no &lt;code&gt;.input&lt;/code&gt; or &lt;code&gt;.select&lt;/code&gt; class to apply.&lt;/p&gt;
&lt;p&gt;This package adds only what css-base cannot: the layout around those controls.&lt;/p&gt;
&lt;h2 id="form"&gt;&lt;code&gt;.form&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;A responsive two-column grid that collapses to one column when there is not enough room.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;form&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;form&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;label&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;for&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;first&amp;#34;&lt;/span&gt;&amp;gt;First name&amp;lt;/&lt;span style="color:#f92672"&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;first&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;label&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;for&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;last&amp;#34;&lt;/span&gt;&amp;gt;Last name&amp;lt;/&lt;span style="color:#f92672"&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;last&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;full&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;label&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;for&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&amp;gt;Message&amp;lt;/&lt;span style="color:#f92672"&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;textarea&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;help&amp;#34;&lt;/span&gt;&amp;gt;Markdown is supported.&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;actions&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;btn&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;submit&amp;#34;&lt;/span&gt;&amp;gt;Send&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The column rule is worth reading once:&lt;/p&gt;</description></item><item><title>Style Dictionary</title><link>https://socle.uncinq.dev/docs/design-tokens/style-dictionary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/style-dictionary/</guid><description>&lt;p&gt;&lt;a href="https://styledictionary.com/"&gt;Style Dictionary v5&lt;/a&gt; transforms the DTCG JSON token files into CSS custom properties.&lt;/p&gt;
&lt;h2 id="run-the-build"&gt;Run the build&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output is written to &lt;code&gt;dist/css/&lt;/code&gt;. One CSS file is generated per JSON source file, preserving the same directory structure:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tokens/primitive/color.json → dist/css/primitive/color.css
tokens/semantic/color.json → dist/css/semantic/color.css
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="config--style-dictionaryconfigjs"&gt;Config — &lt;code&gt;style-dictionary.config.js&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The config is a single ES module. It registers a custom name transform and a custom format, then maps every JSON file to a CSS output.&lt;/p&gt;</description></item><item><title>Fluid scales</title><link>https://socle.uncinq.dev/docs/design-tokens/utopia/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/design-tokens/utopia/</guid><description>&lt;p&gt;Source: &lt;a href="https://utopia.fyi"&gt;https://utopia.fyi&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="principle"&gt;Principle&lt;/h2&gt;
&lt;p&gt;Each fluid token is a &lt;code&gt;clamp()&lt;/code&gt; expression that scales linearly between a minimum and a maximum value, with no breakpoints.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;property&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;clamp&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;min&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;intercept&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;slope&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;×&lt;/span&gt; &lt;span style="color:#f92672"&gt;1vw&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;&lt;span style="color:#f92672"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;slope = (max_px − min_px) / (viewport_max − viewport_min)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;intercept = min_px − slope × viewport_min (÷ 16 → rem)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="viewport-range"&gt;Viewport range&lt;/h2&gt;
&lt;p&gt;All fluid tokens use the same viewport range: &lt;strong&gt;375 px → 1440 px&lt;/strong&gt; (range = 1065).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;slope = (max_px − min_px) / 1065
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;intercept = min_px − slope × 375 (÷ 16 → rem)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This range covers modern phones (375 px) to wide desktop screens (1440 px). Tokens are clamped at both ends — below 375 px they stay at &lt;code&gt;min&lt;/code&gt;, above 1440 px they stay at &lt;code&gt;max&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Utilities</title><link>https://socle.uncinq.dev/docs/css-components/utilities/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://socle.uncinq.dev/docs/css-components/utilities/</guid><description>&lt;h2 id="scrollsnap"&gt;&lt;code&gt;.scrollsnap&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Turns a grid into a horizontal carousel with snap points. Items keep their own width, the grid stops wrapping, and the row scrolls sideways, bleeding into the gutter so the next item peeks in.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;items scrollsnap-md&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;article&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;card&amp;#34;&lt;/span&gt;&amp;gt;...&amp;lt;/&lt;span style="color:#f92672"&gt;article&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;article&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;card&amp;#34;&lt;/span&gt;&amp;gt;...&amp;lt;/&lt;span style="color:#f92672"&gt;article&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;article&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;card&amp;#34;&lt;/span&gt;&amp;gt;...&amp;lt;/&lt;span style="color:#f92672"&gt;article&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is opt-in, applied to the element that owns the grid, so the same component is a carousel in one context and a plain grid in another.&lt;/p&gt;</description></item></channel></rss>